形態素解析したい。品詞分解して文章を分析したい。
Mecabを使えばこんなことができるようになります。
Mecabとは、日本語の文章を形態素解析を用いて分割し、各要素の読み方から活用形までを自動で解析してくれるパッケージです。
今回はMecabを使って、文章を形態素解析し、品詞分解する方法をまとめていきます。
具体的には、Mecabを使って形態素解析し、それぞれの品詞がどれくらい使われているかをカウントする機能を実装していきます。
■Mecabで形態素解析:品詞分解
MeCabで形態素解析する方法を解説します。
最後まで読めば形態素の処理もできるようになるので、ぜひ覚えていってくださいね。
以下MeCabをインストールしている前提で進めていきます。
まだMeCabをインストールしてないよって方には私も記事でMeCabインストールの手順を書いておりますので、参考までに。
簡単に形態素解析を行う方法
初めに簡単な形態素解析を行う方法です。
以下のコードで、テキスト文を形態素解析し、結果をstr型で返してくれます。
import MeCab
mecab= MeCab.Tagger("")
text="明日は明日の風が吹く"
result = mecab.parse(text)
print(result)
mecab.parse(text)でparseメソッドを使っています。parseメソッドを使うと、形態素解析した結果をstr型で返してくれます。
textの部分に、自分の解析したい文字列を与えれば、形態素解析して文字列として結果を出力します。
以上のコードを実行した結果がこちら。ちゃんと形態素解析できていることが確認できるかと思います。
明日 名詞,副詞可能,*,*,*,*,明日,アシタ,アシタ は 助詞,係助詞,*,*,*,*,は,ハ,ワ 明日 名詞,副詞可能,*,*,*,*,明日,アシタ,アシタ の 助詞,連体化,*,*,*,*,の,ノ,ノ 風 名詞,一般,*,*,*,*,風,カゼ,カゼ が 助詞,格助詞,一般,*,*,*,が,ガ,ガ 吹く 動詞,自立,*,*,五段・カ行イ音便,基本形,吹く,フク,フク EOS
分かち書きの方法
次に分かち書きを行う方法についてです。分かち書きの説明をWikipediaより引用です。
わかち書き(わかちがき)とは、文章において語の区切りに空白を挟んで記述することである。分かち書き・別ち書きとも表記する。
Wikipedia
英文を想像しただければわかると思います。単語の間に半角スペースが入ってますよね。あれを自動でやってくれます。
先ほど紹介したコードのTagger(“”)の部分を、Tagger(“-Owakati”)をすることで、分かち書きができるようになります。
実行結果は以下のようになります。
明日 は 明日 の 風 が 吹く
形態素の解析
形態素解析した結果でデータ処理を行いたい場合には、parseToNodeメソッドを使います。
parseメソッドを使うことでもできるみたいですが、わかりやすいので、parseToNodeメソッドを紹介します。
parseToNodeメソッドは、例えば名詞だけを抽出したり、品詞ごとに出現数をカウントしたりする場合に便利です。
parseToNodeメソッドは、Mecab内で生成される文頭の形態素のインスタンスを返します。
例えば、”明日は明日の風が吹く”をparseToNodeメソッドで解析すると、文頭の”明日”の形態素(明日 名詞,副詞可能,*,*,*,*,明日,アシタ,アシタ)が返り値になります。
また、nextメソッドにより次の形態素のインスタンスにアクセスできるので、parseToNodeメソッド、nextメソッドを使い合わせることで、形態素1つ1つに対して処理が行えます。
以下のコードは各形態素の出現数をカウント、解析された単語を分析するコードです。
import MeCab
mecab= MeCab.Tagger("-Ochasen")
text="夢ならばどれほど良かったでしょう。今だにあなたのことを夢に見る。" \
"忘れたものを取りに帰るように、古びたアルバムの埃を払う。"
#parseToNodeで形態素解析
node = mecab.parseToNode(text)
#各変数の初期化
meishi_count = 0
doushi_count = 0
keiyou_count = 0
meishi_list=[]
doushi_list=[]
#形態素1つ1つを処理
while node:
if node.feature.split(",")[0] == "名詞":
meishi_count = meishi_count + 1
meishi_list.append(node.surface)
elif node.feature.split(",")[0] == "動詞":
doushi_count = doushi_count + 1
doushi_list.append(node.surface)
else:pass
node = node.next
print("名詞:"+str(meishi_count)+str(meishi_list)+"\n",
"動詞:"+str(doushi_count)+str(doushi_list)+"\n", )
node.feature.split(‘,’)[0]についてfeatureは形態素の解析結果のパラメータです。
例えば、明日 名詞,副詞可能,*,*,*,*,明日,アシタ,アシタでは、名詞以降がfeatureに含まれます。,(カンマ)で分割されているfeatureの[0]番目を指定します。
「明日」の形態素解析を行った場合は、featureの0番目の要素[名詞]が指定される。
品詞は全部で9種類あるので、それぞれに別のコードを記述することで、品詞別に処理することができます。
また、node.surfaceで、surfaceは形態素解析された単語を指します。上記の分の場合は、surface=[明日]となります。
node = node.nextで次の形態素に移ります。
結果は、以下のようになりました。
名詞:9['夢', '今', 'あなた', 'こと', '夢', 'もの', 'よう', 'アルバム', '埃'] 動詞:6['見る', '忘れ', '取り', '帰る', '古び', '払う']
■まとめ
MeCabの形態素解析のためのメソッドは、以下2つ。
| 返り値(明日は明日の風が吹く) | |
| parse | str型(文字列)の解析結果 例:明日 名詞,副詞可能,*,~ は 助詞,係助詞,*,*,*,*,は~ 明日 名詞,副詞可能,*~~ |
| parseToNode | 形態素解析結果文頭のnodeインスタンス 例:明日(surface) 名詞,副詞可能,*,*,*,*,明日,アシタ,アシタ(feature.split(“,”)[]) |
parseToNodeメソッドの返り値は以下のようになります。
surface feature[0],feature[1],feature[2],***
例:明日 名詞,副詞可能,*,*,*,*,明日,アシタ,アシタ
最後まで読んでいただきありがとうございました。
