ブログに書くつもりじゃなかった

フリーのプログラマーが綴る、裏チラ系の備忘録や雑記帳。

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()

次のステップ

で一通り完成するはずだが、ここまで結構な時間を費やしたのに肝心の英語の勉強が全然進んでない!のでこのままで一旦終わりかな。