Categories: Python

【Python】MeCab(めかぶ)を使って形態素解析する

この記事では、Pythonで「MeCab(めかぶ)」を使って形態素解析を行う方法を解説します。

MeCab(和布蕪)とは?

MeCabは、京都大学情報学研究科−日本電信電話株式会社コミュニケーション科学基礎研究所 共同研究ユニットプロジェクトを通じて開発されたオープンソース 形態素解析エンジンです。公式サイトはこちら → MeCab: Yet Another Part-of-Speech and Morphological Analyzer

ちなみに形態素解析とは、ある文章・フレーズを「意味を持つ最小単位(=形態素)」に分解し、内容を判断するための解析方法です。検索エンジンなどに用いられています。

それでは、Python から MeCab を使用できるようにし、実際に形態素解析を行ってみましょう。

MeCabのインストール

PythonでMeCabを使用するには、mecab-pythonpipでインストールします。通常のMeCabはPythonで使用できないので注意してください。

mecab-python を使用するには Python 3.6以上 が必要です

以下のコマンドをターミナルで実行してください。

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を使って解析するとよく使う単語やクセなんかも読み取れて面白いかもしれません。

それでは今回の内容はここまでです。ではまたどこかで〜( ・∀・)ノ

ゆうまる

独学でプログラミングを勉強しているおじさん。いろんな言語を勉強したが浅く広くなためあまり仕事につながらない。また忘れっぽいため自分のブログを備忘録としても使っている。産まれてこのかたずっとネコを飼ってる生粋のネコ派。最近お腹が出てきて筋トレに奮闘中!

Recent Posts

【Dart】コンストラクタのデフォルト引数について

Dartのコンストラクタのデフォルト引数…

2週間 ago

【Unity】有料アセットを無料で手に入れる方法

この記事では、Unityの有料アセットを…

4か月 ago

【Python】任意の秒数だけ処理を一時停止する方法【sleep()関数】

この記事では、Pythonで任意の秒数だ…

1年 ago

【Python】Wordの文書の新規作成と読み書き

この記事では、Pythonを使ってWor…

1年 ago

【Python】メタクラスって結局なんなの?

この記事では、Pythonのメタクラスに…

1年 ago