Python + NLTKで英語を品詞ごとに色分け表示するWebサービスを作ってみる
序文
先日、久しぶりにTOEIC受験を申し込んだので、気合を入れて効率良く英語を身に着ける方法についての勉強を始めた。その中で、英文を品詞ごとに色分けしてくれるWebサービス(https://english.edward.io)を見つけた。
へー、よくできているなー...と感心したので、どうやって実装できるのか調べてみた。すると、自然言語処理(NLP)のライブラリを使えば割とシンプルに実装可能なことが判明。そこで、ちょっと勉強がてら自作してみることに。言語はPython、ライブラリはNLTK(Natural Language TookKit)を使用する。ちなみにPythonは触ったことある程度。
事前準備
作業に使うM1 MacBook Airは買ったばかりで、python周りはまっさらな状態。なので、いくつか事前に準備しておく。
Python 3.xをデフォルトに変更する
とりあえずバージョンを確認。
# macOS $ sw_vers ProductName: macOS ProductVersion: 11.1 BuildVersion: 20C69 # python (default) $ python --version Python 2.7.16 # python 3.x $ python3 --version Python 3.8.2 # python 2.x $ python2 --version Python 2.7.16
デフォルトが2系になっているので、これを3系に変更する。vi ~/.zshrc
で以下を追加する。
alias python="python3"
ファイルを保存したらsource
で反映する。
source ~/.zshrc
pipをインストールする
$ curl https://bootstrap.pypa.io/get-pip.py -s -o get-pip.py $ python get-pip.py
pipを入れたディレクトリをPATHに追加する。vi ~/.zshrc
で以下を追加する。
export PATH=$PATH:/Users/****/Library/Python/3.8/bin
新しいバージョンにアップグレード(19.2.3 -> 20.3.3)。
$ python -m pip install --upgrade pip
NLTK
以下、公式ドキュメント(https://www.nltk.org)に従って作業する。
NLTKをインストールする
$ pip install nltk
NLTKで使用するデータをダウンロードする
NLTKを使用する際にはコーパスやその他のデータが必要になる(とドキュメントに書いてあるが意味を理解していない)。pythonをインタラクティブモードで起動して以下を実行。
>>> import nltk >>> nltk.download('all')
自分の環境ではnltk.download()
と引数なしで実行するとエラーが発生するので、'all'
を付けた。
動作確認してみる
>>> # 赤い色のモビルスーツ... ザクじゃないけど赤い色のモビルスーツ... シャアじゃないのか!? >>> sentence = "A red mobile suit... It's not a Zaku but good red mobile suit mean... Char is in it!?" >>> tokens = nltk.word_tokenize(sentence) >>> tagged = nltk.pos_tag(tokens) >>> tagged [('A', 'DT'), ('red', 'JJ'), ('mobile', 'NN'), ('suit', 'NN'), ('...', ':'), ('It', 'PRP'), ("'s", 'VBZ'), ('not', 'RB'), ('a', 'DT'), ('Zaku', 'NNP'), ('but', 'CC'), ('good', 'JJ'), ('red', 'JJ'), ('mobile', 'JJ'), ('suit', 'NN'), ('mean', 'NN'), ('...', ':'), ('Char', 'NNP'), ('is', 'VBZ'), ('in', 'IN'), ('it', 'PRP'), ('!', '.'), ('?', '.')]
英文を入力として単語とその品詞が取得できた。品詞の詳細については以下で確認できるみたい。
>>> nltk.help.upenn_tagset()
次のステップ
で一通り完成するはずだが、ここまで結構な時間を費やしたのに肝心の英語の勉強が全然進んでない!のでこのままで一旦終わりかな。