目次
最初に
自然言語処理を行うにあたって文を単語毎に分け品詞を特定する形態素解析という処理があります。
この処理を行うことによりテキスト上で意味を持つ単語とそうでない単語を分けることができ、その結果を集計することがテキストマイニングの第一ステップと言えます。
日本語のみであれば、MeCabを利用する事で形態素解析が可能ですがシステムに組み込むとなると多言語対応が求められる事もあります。
その際に精度が良く、多言語対応可能なPythonライブラリを紹介したいと思います。
その名も「spaCy」です。
spaCyインストール / 言語モデルダウンロード
spaCyのインストール方法は簡単で、pipで一発です。
spaCyは各言語に対して言語モデルをインストールすることで多言語に対応可能となります。
各モデルのインストールコマンドは下記の通り。
対応モデルに関してはコチラを参照してください。
また、日本語に関してはこのspaCyの規格に合わせたGinzaというリクルートと国語研が共同開発した言語モデルが存在しており、このモデルが形態素解析の精度も良いので利用していきたいと思います。
このモデルをインストールするには以下のコマンドを使いインストールします。
これでspaCyを利用する準備が整いました。
形態素解析
spaCyを利用するにはまず、言語モデルを読み込む必要があります。
以下のコマンドで読み込みます。
次に任意の文章を解析させてみましょう。
上記のコマンドでDocオブジェクトが生成されました。
このオブジェクトはテキストを解析した様々な結果が格納されているオブジェクトです。
では、Docオブジェクトから形態素解析結果を取り出してみましょう。
上記のコードを実行すると下記のようなデータフレームが出力されます。
token_no | text | lemma | pos | tag |
0 | すもも | すもも | NOUN | 名詞-普通名詞-一般 |
1 | も | も | ADP | 助詞-係助詞 |
2 | もも | もも | NOUN | 名詞-普通名詞-一般 |
3 | も | も | ADP | 助詞-係助詞 |
4 | もも | もも | NOUN | 名詞-普通名詞-一般 |
5 | の | の | ADP | 助詞-格助詞 |
6 | うち | うち | NOUN | 名詞-普通名詞-副詞可能 |
7 | 。 | 。 | PUNCT | 補助記号-句点 |
DocオブジェクトはSentenceオブジェクトを内包しており、さらにSentenceオブジェクトはtokenオブジェクトを内包しています。
DocオブジェクトとSenteceオブジェクトはイテレータが実装されているのでfor文でtokenオブジェクトを呼び出しています。
最後に出力した結果をPandasデータフレームに変換しています。
tokenオブジェクトは解析した結果を単語単位で持っており、以下のようなAttributesで解析結果を取得することができます。
Attribute名 | 内容 |
i | トークンのインデックス |
text | 単語の原文 |
lemma_ | 単語の原型 |
pos_ | 単語のPOS(粗い品詞タグ) |
tag_ | 単語の細かい品詞情報 |
では次に英文を形態素解析してみましょう。
まずは英語用の言語モデルをインストールします。
先ほどのコードを利用して英語解析用に以下のコードを作成します。
言語モデルを英語モデルに再ロードして先ほどと同様の処理を行っています。
上記のコードを実行すると下記の結果が得られます。
token_no | text | lemma | pos | tag |
0 | There | there | PRON | EX |
1 | should | should | AUX | MD |
2 | be | be | AUX | VB |
3 | one | one | NUM | CD |
4 | -- | -- | PUNCT | : |
5 | and | and | CCONJ | CC |
6 | preferably | preferably | ADV | RB |
7 | only | only | ADV | RB |
8 | one | one | NUM | CD |
9 | -- | -- | PUNCT | : |
10 | obvious | obvious | ADJ | JJ |
11 | way | way | NOUN | NN |
12 | to | to | PART | TO |
13 | do | do | VERB | VB |
14 | it | it | PRON | PRP |
15 | . | . | PUNCT | . |
日本語との結果を見比べればわかりますが、tagの部分は言語モデルにより異なりposの部分は粗い分類であるおかげでモデルが異なっても、ほとんど共通の分類となります。
最後に
今回は言語解析ライブラリのspaCyを使った形態素解析の方法を紹介しました。
実はspaCyには形態素解析以外にも機能があるので別の記事で紹介できたらと思います。