mecab
unicode
python3

mecab surface 表層エラー?

備忘録。

gensimの動作確認を行うのに、どうやってやろうか探していたところ、yasunoriさんのサイトを参考に、試していました。
https://qiita.com/yasunori/items/31a23eb259482e4824e2
参考にさせていただきます。ありがとうございます。

参考にさせていただいたコードをjupyterに貼り付けて実効すると、途中まですんなり動きました。
ちょっと安心して、再び最初から実効してみると、次のエラーが。

UnicodeDecodeError: 'utf-8' codec can't decode byte 0x90 in position 0: invalid start byte

bash on windows環境なので、一応、shit-jsやutf-8などを疑い、現状を確認。

$ python
Python 3.6.3 |Anaconda, Inc.| (default, Oct 13 2017, 12:02:49)
[GCC 7.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> sys.getdefaultencoding()
'utf-8'
>>>

それとこの時点で僕がインストールしていたmecabのバージョンです。
最新バージョンのようです。

~$ mecab --version
mecab of 0.996

いろいろ調べた結果

調べてみたところ、トラーフィールズさんのブログに次のようなことが書かれていました。
Mecab関係の問題のようでした。

https://www.trifields.jp/how-to-use-mecab-in-ubuntu-14-04-and-python-3-1196
(トライフィールズさんのブログより)
MeCabのバージョン0.996で、この方法によりPython3からMeCabのparseToNode関数を使うと、最初のsurface(表層形)が表示されないというバグが・・・

ブログに書かれていた修正方法で試してみると、

import MeCab
mecab = MeCab.Tagger('mecabrc')
mecab.parse("")  # ここを追加しましたYYY


def tokenize(text):
    node = mecab.parseToNode(text)
    while node:
        if node.feature.split(',')[0] == '名詞':
            yield node.surface.lower()
        node = node.next


def get_words(contents):
    ret = []
    for k, content in contents.items():
        ret.append(get_words_main(content))
    return ret


def get_words_main(content):
    return [token for token in tokenize(content)]

なんとかうまくいくました(*''▽'')