日本語の自然言語処理 - nltk と Janome -

 前回英文を nltk で読み込んだ際、言葉の集計や描画に matplotlib 等のライブラリが使えたので、日本語についてもそのつもりでいたのですが…。

 何日かの印象でしかありませんが、(少なくとも私にとって)Python 自体の恩恵を簡単に受けられるという点では、Janome というライブラリの方がとっかかりは良いのかもしれない、と感じています。

 

目次

1.nltk による日本語の取り扱い

2.Janome を試してみる

3.まとめ ~ 自然言語処理と可視化

 

1.nltk による日本語の取り扱い

 すでに色々な方が試していらっしゃいますし、「Python による日本語自然言語処理」という、本の 1 章にもなっている詳しいサイトもあります。ニーズやお好みに合わせて参考にされるのが良いかと思います。

www.nltk.org

 nltk を使った日本語読み込みでは、PlaintextCorpusReader という宣言を使って読み込んだファイルのトークン化やコンコーダンス等の例が出ています。

import nltk
from nltk.corpus.reader import *
from nltk.corpus.reader.util import *
from nltk.text import Text

sent_tokenizer = nltk.RegexpTokenizer(u'[^ ()『』【】「」!?。]*[!?。]')
chartype_tokenizer = nltk.RegexpTokenizer(u'([ぁ-んー]+|[ァ-ンー]+|[\u4e00-\u9FFF]+|[^ぁ-んァ-ンー\u4e00-\u9FFF]+)')

jp_text = PlaintextCorpusReader(".",r'*****.txt',
encoding='utf-8',
para_block_reader=read_line_block,
sent_tokenizer=sent_tokenizer,
word_tokenizer=chartype_tokenizer) # *****.txt : File Name

 読み込んだ jp_text に対しトークン化等の命令をするのですが、英文の時とどうも命令が違います。

print(jp_text.raw())                       # jp_text の中身を表示
print(' '.join(jp_text.words()[0:50])) # jp_text のトークン表示

 日本語と英語の違いがあるのは分かりますが、どうも違うことをやっているような気がしたので、PlaintextCorpusReader で読み込んだ jp_text のデータ型を見てみました。

<class 'nltk.corpus.reader.plaintext.PlaintextCorpusReader'>

 英文をトークン化した時はリストであったので、その後 matplotlib 等のライブラリをそのまま使えましたが、PlaintextCorpusReader を使って読み込んだ場合、その中身についてひと手間かけないといけないようです。nltk を使えば、英語と日本語と同様に扱えると思ったのですが、違う操作とデータを扱うのであれば、特に nltk を使って日本語をを操作する積極的な理由がなくなりました。もう少し色々分かってくると解決するかもしれませんが、いったんここで別のライブラリを試してみることにしました。

 

2.Janome を試してみる

 PurePython で書かれた日本語自然言語処理のライブラリで、なんといっても、公式 documentation がとても分かりやすいです。

mocobeta.github.io

 インストールは以下のみで完了です。

pip install janome

 トークン化も、(少なくとも私にとっては)非常に直感的で、以下の script で

from janome.tokenizer import Tokenizer
t = Tokenizer()
for token in t.tokenize(トークン化したいテキスト):
print(token)

トークンの一覧が出ます。

 こうやって token が取り出せるということは、t.tokenize(…) のデータ型は、

<class 'list'>

リストです。つまり、前回英語に関してやったように、collections 等を使って seaborn 等による可視化が出来るということです。

 出来ることが一つでも多いことは、初学者にとってはとてもありがたいことです。が、公式ページには、速度は 10 倍程度 MeCab というライブラリより遅いともあります。現時点では、私は単なるライブラリユーザーなので、ドキュメントやライブラリが使いやすいというのは、十分過ぎるメリットです。 

 

3.まとめ ~ 自然言語処理と可視化

 自然言語データを可視化しようというニーズは、自然言語処理に取り組んでいる方にとっては、おそらくかなり二次的なニーズかとも思います。けれども、分析に改善すべき点があったとしても、ある段階でどこまで到達できたのかについて可視化できることは、少なくとも実務的にはとても意味があると個人的には感じます。

 自然言語と一口に言っても、英語と日本語では構造や単語の処理も違います。自然言語処理にとってはいわば、他の場合におけるデータの前処理、つまり様々な処理を行う前に意味のあるデータの形に整えるための操作がメインターゲットになっている、と言えます。人間にとって全体として意味があるものから、意味を持つ最も小さな単位への細分化。言語自体の分析と並んで、Computer 特有の文字コード等の技術的な違いも相まって、やはりなかなか煩雑な世界のようですね。

 

 本日も最後までお付き合いありがとうございました。