MeCabの形態素解析にハマった話
MeCabを使用して形態素解析を行った際に、 surfaceメソッドを使用するも、一部の単語が表示されないことがあった
参考
programdl.hatenablog.com
programdl.hatenablog.com
事象
解析文章
以下の文章を解析する
自然言語処理についてのお勉強
解析結果
BOS/EOS,*,*,*,*,*,*,*,* 名詞,形容動詞語幹,*,*,*,*,自然,シゼン,シゼン 名詞,一般,*,*,*,*,言語,ゲンゴ,ゲンゴ 処理 名詞,サ変接続,*,*,*,*,処理,ショリ,ショリ について 助詞,格助詞,連語,*,*,*,について,ニツイテ,ニツイテ の 助詞,連体化,*,*,*,*,の,ノ,ノ お 接頭詞,名詞接続,*,*,*,*,お,オ,オ 勉強 名詞,サ変接続,*,*,*,*,勉強,ベンキョウ,ベンキョー BOS/EOS,*,*,*,*,*,*,*,*
例の文章だと、文頭の「自然言語」が第1カラムに表示されなかった
エラー時のソース
import MeCab def main(): tagger=MeCab.Tagger("-Ochasen") text="自然言語処理についてのお勉強" result=tagger.parseToNode(text) while result: print(result.surface," ",result.feature) result=result.next if __name__=="__main__": main()
対処
こちらのサイトを参考に修正した。どうやらMeCabのバグのよう。。 kenichia.hatenablog.com
parseToNodeを使用する前にparseを使用することで回避できるらしい
正しいソース
import MeCab def main(): tagger=MeCab.Tagger("-Ochasen") text="自然言語処理についてのお勉強" tagger.parse("") #追加 result=tagger.parseToNode(text) while result: print(result.surface," ",result.feature) result=result.next if __name__=="__main__": main()
結果
BOS/EOS,*,*,*,*,*,*,*,* 自然 名詞,形容動詞語幹,*,*,*,*,自然,シゼン,シゼン 言語 名詞,一般,*,*,*,*,言語,ゲンゴ,ゲンゴ 処理 名詞,サ変接続,*,*,*,*,処理,ショリ,ショリ について 助詞,格助詞,連語,*,*,*,について,ニツイテ,ニツイテ の 助詞,連体化,*,*,*,*,の,ノ,ノ お 接頭詞,名詞接続,*,*,*,*,お,オ,オ 勉強 名詞,サ変接続,*,*,*,*,勉強,ベンキョウ,ベンキョー BOS/EOS,*,*,*,*,*,*,*,*