この記事では、Pythonで「MeCab(めかぶ)」を使って形態素解析を行う方法を解説します。
MeCab(和布蕪)とは?
MeCabは、京都大学情報学研究科−日本電信電話株式会社コミュニケーション科学基礎研究所 共同研究ユニットプロジェクトを通じて開発されたオープンソース 形態素解析エンジンです。公式サイトはこちら → MeCab: Yet Another Part-of-Speech and Morphological Analyzer
ちなみに形態素解析とは、ある文章・フレーズを「意味を持つ最小単位(=形態素)」に分解し、内容を判断するための解析方法です。検索エンジンなどに用いられています。
それでは、Python から MeCab を使用できるようにし、実際に形態素解析を行ってみましょう。
MeCabのインストール
PythonでMeCabを使用するには、mecab-pythonをpipでインストールします。通常のMeCabはPythonで使用できないので注意してください。
以下のコマンドをターミナルで実行してください。
pip install mecab-python3
次に MeCab で使用する辞書をインストールします。ここでは「unidic-lite」を使います。他の辞書でも構いませんが、長い間更新されていなかったりするので注意してください。
以下のコマンドをターミナルで実行してください。
pip install unidic-lite
これで Python で MeCab を使えるようになりました。
基本的な使い方
mecab-pythonで形態素解析するには、MeCab.Taggerオブジェクトを生成し、そのインスタンスからparse()メソッドを実行して行います。
import MeCab tagger = MeCab.Tagger() tagger.parse('PythonでMeCabを使ってみる')
実行結果
Python Python Python Python 名詞-普通名詞-一般 0 で デ デ で 助詞-格助詞 MeCab MeCab MeCab MeCab 名詞-普通名詞-一般 0 を オ ヲ を 助詞-格助詞 使っ ツカッ ツカウ 使う 動詞-一般 五段-ワア行 連用形-促音便 0 て テ テ て 助詞-接続助詞 みる ミル ミル 見る 動詞-非自立可能 上一段-マ行 終止形-一般 1 EOS
わかち書き
わかち書きとは、単語の間に空白を入れる書き方です。mecab-pythonでは、MeCab.Taggerオブジェクトを生成する際にオプションを指定することで実行できます。
import MeCab tagger = MeCab.Tagger('-Owakati') tagger.parse('PythonでMeCabを使ってみる')
実行結果
Python で MeCab を 使っ て みる
このままでは使いづらいのでstr.split()を使って分割します。
tagger.parse('PythonでMeCabを使ってみる').split()
実行結果
['Python', 'で', 'MeCab', 'を', '使っ', 'て', 'みる']
例題: 名詞を数える
ここでは、夏目漱石の「吾輩は猫である」の冒頭18行ぐらいに出現する名詞を数えてみます。
import MeCab from collections import Counter text = ''' 吾輩は猫である。 名前はまだ無い。 どこで生れたかとんと見当がつかぬ。 何でも薄暗いじめじめした所でニャーニャー泣いていた事だけは記憶している。 吾輩はここで始めて人間というものを見た。 しかもあとで聞くとそれは書生という人間中で一番獰悪な種族であったそうだ。 この書生というのは時々我々を捕えて煮て食うという話である。 しかしその当時は何という考もなかったから別段恐しいとも思わなかった。 ただ彼の掌に載せられてスーと持ち上げられた時何だかフワフワした感じがあったばかりである。 掌の上で少し落ちついて書生の顔を見たのがいわゆる人間というものの見始であろう。 この時妙なものだと思った感じが今でも残っている。 第一毛をもって装飾されべきはずの顔がつるつるしてまるで薬缶だ。 その後猫にもだいぶ逢ったがこんな片輪には一度も出会わした事がない。 のみならず顔の真中があまりに突起している。 そうしてその穴の中から時々ぷうぷうと煙を吹く。 どうも咽せぽくて実に弱った。 これが人間の飲む煙草というものである事はようやくこの頃知った。''' # 単語の記録用リスト words = [] tagger = MeCab.Tagger() r = tagger.parse(text) # 改行で分割 lines = r.splitlines() # 最後の行(EOS)を除いてループ処理 for line in lines[0:-1]: # タブ文字で分割 fields = line.split('\t') # 名詞を判別(startswith()で文字列の最初が'名詞'か判別) if fields[4].startswith('名詞'): # リストに単語を追加 words.append(fields[0]) # Counterでカウント + (key, value) でカウント数が多い順に出力 Counter(words).most_common()
実行結果
[('人間', 4), ('もの', 4), ('事', 3), ('書生', 3), ('顔', 3), ('猫', 2), ('時々', 2), ('掌', 2), ('時', 2), ('感じ', 2), ('一', 2), ('名前', 1), ('見当', 1), ('所', 1), ('記憶', 1), ('あと', 1), ('獰悪', 1), ('種族', 1), ('そう', 1), ('話', 1), ('当時', 1), ('考', 1), ('スー', 1), ('上', 1), ('見', 1), ('始', 1), ('妙', 1), ('今', 1), ('毛', 1), ('装飾', 1), ('はず', 1), ('薬缶', 1), ('後', 1), ('片輪', 1), ('度', 1), ('真中', 1), ('突起', 1), ('穴', 1), ('中', 1), ('煙', 1), ('実', 1), ('煙草', 1), ('この頃', 1)]
MeCabで形態素解析した結果をsplitlines()で行ごとに分割してfor文でループ処理します。その際、if文を使って品詞が名詞の単語をリストに保存しておき、最後にcollectionsモジュールのCounterを使ってカウントしました。
Linkオブジェクトを数える(カウント)する方法【Counter】
まとめ
この記事では、Pythonで「MeCab(めかぶ)」を使って形態素解析を行う方法を解説しました。
いろんな文章を形態素解析するにはもちろんですが、自分で書いた論文や作文なんかをMeCabを使って解析するとよく使う単語やクセなんかも読み取れて面白いかもしれません。
それでは今回の内容はここまでです。ではまたどこかで〜( ・∀・)ノ


