プログラミング備忘録

初級プログラマ。python、DL勉強中

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,*,*,*,*,*,*,*,*