Mecab+Python

python3でMeCabを使えるようにする


pip install mecab-python3

ファイル作成

import sys
import MeCab

m = MeCab.Tagger ("-Ochasen") #注意、〇Tagger、×tagger

print(m.parse ("すもももももももものうち"))

実行結果

すもも  スモモ  すもも  名詞-一般
も      モ      も      助詞-係助詞
もも    モモ    もも    名詞-一般
も      モ      も      助詞-係助詞
もも    モモ    もも    名詞-一般
の      ノ      の      助詞-連体化
うち    ウチ    うち    名詞-非自立-副詞可能
EOS

node.surfaceのバグ

最新版のmecab-python3はnode.surfaceを行った時にバグがあります。

import MeCab

tagger = MeCab.Tagger('-Ochasen')
tagger.parse('')

node = tagger.parseToNode("すもももももももものうち")

while node:
	word = node.surface
	hinshi = node.feature.split(",")[0]
	print(word+": "+hinshi)
	node = node.next

想定

: BOS/EOS
すもも: 名詞
も: 助詞
もも: 名詞
も: 助詞
もも: 名詞
の: 助詞
うち: 名詞
: BOS/EOS

結果

すもももももももものうち
すもももももももものうち
もももももものうち
ももももものうち
ももものうち
もものうち
のうち
う

 
この解決方法の一つは、mecab-python3のバージョンを下げることです。

pip uninstall -y mecab-python3

pip3 install mecab-python3==0.7

 
参考


parseメソッド

import MeCab

tagger = MeCab.Tagger('-Ochasen')
tagger.parse('')

text = 'すもももももももものうち'

result = tagger.parse(text)

print(result)

 
結果

すもも  スモモ  すもも  名詞-一般
も      モ      も      助詞-係助詞
もも    モモ    もも    名詞-一般
も      モ      も      助詞-係助詞
もも    モモ    もも    名詞-一般
の      ノ      の      助詞-連体化
うち    ウチ    うち    名詞-非自立-副詞可能
EOS

parseToNodeメソッド

import MeCab

tagger = MeCab.Tagger('-Ochasen')
tagger.parse('')

text = 'すもももももももものうち'

node = tagger.parseToNode(text)

while node:
	print(node.surface) #表層形の取得
	print(node.feature) #形態素情報の取得
	print('--------------------------')
	node = node.next

 
結果


BOS/EOS,*,*,*,*,*,*,*,*
--------------------------
すもも
名詞,一般,*,*,*,*,すもも,スモモ,スモモ
--------------------------
も
助詞,係助詞,*,*,*,*,も,モ,モ
--------------------------
もも
名詞,一般,*,*,*,*,もも,モモ,モモ
--------------------------
も
助詞,係助詞,*,*,*,*,も,モ,モ
--------------------------
もも
名詞,一般,*,*,*,*,もも,モモ,モモ
--------------------------
の
助詞,連体化,*,*,*,*,の,ノ,ノ
--------------------------
うち
名詞,非自立,副詞可能,*,*,*,うち,ウチ,ウチ
--------------------------

BOS/EOS,*,*,*,*,*,*,*,*
--------------------------

名詞のみ抽出

import MeCab

tagger = MeCab.Tagger('-Ochasen')
tagger.parse('')

text = 'すもももももももものうち'

node = tagger.parseToNode(text)

keywords = []

#Node.featureのフォーマット
#品詞,品詞細分類1,品詞細分類2,品詞細分類3,活用形,活用型,原形,読み,発音

while node:
	if node.feature.split(",")[0] == u"名詞":
		keywords.append(node.surface)
	node = node.next

for w in keywords:
	print(w)

 
結果

すもも
もも
もも
うち

辞書を指定


tagger = MeCab.Tagger('-Ochasen -d /usr/local/lib/mecab/dic/naist-jdic/')




MeCab

Posted by iser