##日本語形態素解析とは
形態素とは意味を持つ最小の言語単位であり、形態素解析とは与えられた文を形態素単位に区切り、各形態素に品詞などの情報を付与する処理である。Pythonによる日本語自然言語処理
つまり文章を単語に分割して、それぞれの単語について品詞を分類などを行うこと。日本語形態素解析はいくつかあるのですが、今回はMeCabというライブラリを使います。
Python形態素解析ライブラリ3つを徹底比較
##MeCabのインストール(Mac)
Mecabは京都大学を中心に作成されているオープンソースの日本語形態素解析ライブラリです。Mecab公式サイト
基本的に公式のインストール手順に沿っていけば5分くらいでインストールが完了します。
公式からダウンロードしてくる必要があるもの
- mecab-0.996.tar.gz(Mecab本体)
- mecab-ipadic-2.7.0-20070801.tar.gz(辞書。これを使用して単語を拾っていくので、こちらも必須。ちなみにこの辞書は何種類かあります)
バージョンはその時々で変わるので公式から最新のものを持ってきてください。
あとはこのジップファイルがあるディレクトリに移動し、解凍、ターミナルで以下のコマンドを入力します。
$ tar zxfv mecab-0.996.tar.gz
$ cd mecab-0.996
$ ./ configure
$ make
$ make check
$ sudo make install
$ tar zxfv mecab-ipadic-2.7.0-20070801.tar.gz
$ cd mecab-ipadic-2.7.0-20070801
$ ./ configure
$ make
$ make check
$ sudo make install
これだけでmecabは使えるようになるので、試しにターミナルで遊んでみます。
$ mecab
私は犬が好き
私 名詞,代名詞,一般,*,*,*,私,ワタシ,ワタシ
は 助詞,係助詞,*,*,*,*,は,ハ,ワ
犬 名詞,一般,*,*,*,*,犬,イヌ,イヌ
が 助詞,格助詞,一般,*,*,*,が,ガ,ガ
好き 名詞,形容動詞語幹,*,*,*,*,好き,スキ,スキ
EOS
ただこれだけではpythonで使えなため、python3のバインディングをインストールする必要があります。python3からpipでインストールできるので
pip install mecab-python3
とターミナルで入力すればオッケーです。
##Python3でMeCab形態素解析を行うコードを書く
Mecabは先ほどのように単語を分割し、品詞を推定するparse()メソッドの他に、解析結果をノードの双方向連結リストとして受け取るparseToNode()メソッドも存在します。
import MeCab
def split_text_to_word(text):
tagger = MeCab.Tagger("-Ochasen")
tagger.parse('')
text = text.replace(u" ", u" ")
print(tagger.parse(text))
def split_text_to_node(text):
tagger = MeCab.Tagger("-Ochasen")
tagger.parse('')
text = text.replace(u" ", u" ")
node = tagger.parseToNode(text)
while node:
print("{0} : {1}".format(node.surface, node.feature))
node = node.next
split_text_to_word("私は猫が好きです。")
split_text_to_node("私は猫が好きです。")
これを実行してみると、
$ python3 mecab.py
私 ワタシ 私 名詞-代名詞-一般
は ハ は 助詞-係助詞
猫 ネコ 猫 名詞-一般
が ガ が 助詞-格助詞-一般
好き スキ 好き 名詞-形容動詞語幹
です デス です 助動詞 特殊・デス 基本形
。 。 。 記号-句点
EOS
: BOS/EOS,*,*,*,*,*,*,*,*
私 : 名詞,代名詞,一般,*,*,*,私,ワタシ,ワタシ
は : 助詞,係助詞,*,*,*,*,は,ハ,ワ
猫 : 名詞,一般,*,*,*,*,猫,ネコ,ネコ
が : 助詞,格助詞,一般,*,*,*,が,ガ,ガ
好き : 名詞,形容動詞語幹,*,*,*,*,好き,スキ,スキ
です : 助動詞,*,*,*,特殊・デス,基本形,です,デス,デス
。 : 記号,句点,*,*,*,*,。,。,。
: BOS/EOS,*,*,*,*,*,*,*,*
実は文字コード周りでちょこっと細工しているのですがそれは割愛。
Python2で使うときはエンコード/デコードの点で少しやることが増えるので注意です。
次回はMecabによって得られたテキストデータをベクトルに変換してみます。