UniDicをPythonで使おうとして詰まった話


PythonでUniDicを使おうとして、かなり詰まったので備忘録も兼ねて記録
なお、Python3環境かつ、すでにMeCabを導入している前提で話を進めます。

mecab-python3の導入

pipを使ってmecab-python3を導入

pip install mecab-python3 

筆者の環境ではpyenvを使ってインストールしているので--userオプション付けずにインストールしていますが、環境に合わせてオプションを付けてください。
導入後にpythonを起動し、次のコマンドを入力して導入できているか確認してください。

import MeCab

何かエラーコードを吐かなければ導入成功です。

UniDicのダウンロード

次のリンクからUniDicをダウンロードできます。
「UniDic」国語研短単位自動解析用辞書
ダウンロードする辞書はお好きなものを選択してください。

UniDicとは国語研が公開している形態素解析用(実際は短単位)辞書です。
公開している辞書の種類はかなり豊富で、現代書き言葉と話し言葉に加えて近代文語など旧仮名表記にも対応した辞書も公開されており、MeCabでの運用が可能です。

閑話休題。

ダウンロード後は好きなフォルダに解凍しておいてください。

UniDicをpythonで使う

UniDicをpythonで使うには、通常のMeCabにおいて外部辞書を使用する方法とあまり変わりません。

import MeCab

m = MeCab.Tagger('-d path/to/UniDic') # MeCabのオプション指定と同じ

後は好きなように解析するだけ。

s = "ほげほげ"
result = m.parse(s)
print(result)

結果はこんな感じ

ほげ  感動詞,一般,*,*,*,*,ホゲ,ほげ,ほげ,ホゲ,ホゲ,和,ほげ,ホゲ,ホゲ,ホゲ,*,*,*,*,*,*,2,*,*
ほげ  感動詞,一般,*,*,*,*,ホゲ,ほげ,ほげ,ホゲ,ホゲ,和,ほげ,ホゲ,ホゲ,ホゲ,*,*,*,*,*,*,2,*,*
EOS

テキストファイルから読み込んで使う

テキストファイルから読み込むことで、大量の文書に対して解析することが可能です。

import MeCab

m = MeCab.Tagger('-d path/to/UniDic')

with open('hogehoge.txt') as t:
  result = m.parse(t.read())

print(result)

結果は次の様に


?
何も表示されない?

トラブル発生

python上でテキストファイルを読み込んで形態素解析をすると、何故か結果が表示されません。

筆者の環境で試した範囲ですが、今のところ分かっていることは次の通りです。

  • string型変数を解析するには問題なし
  • 端末から直接UniDicを指定しMeCabを起動して、入力文字を解析しても問題なし
  • 同様に、txtファイルを読み込ませても問題なし
  • pythonでread()を使って解析しようとすると結果が返ってこない
    • エラーは吐かない
  • 短文ならread()から読み込ませてもエラーが出ない

原因は執筆時点でも不明で、read()の結果をparse()に受け渡し、解析するまでは問題ないようなのでMeCab側からの受け渡しに何か問題がある可能性が一番尤もっぽく感じます。
原因がわかりました。恐らくですが、一行に連結した長い文章を渡すと返すのに失敗するみたいです。
しかし、直接的な原因は不明なままで、デフォルト辞書ではこのような現象には遭遇したことがありません。 とはいえ、解決しないことには色々不都合しかないので、以下に解決策を載せます。

解決策

次のものを用意してください。

  • 使いたいUniDic辞書
  • UniDic現代書き言葉辞書

もし、現代書き言葉辞書を使う場合は、それだけで問題ないです。

まず、最初にダウンロードしてきた現代書き言葉辞書のフォルダに含まれているdicrcで使用したい辞書のdicrcを上書きします。(このとき元のdicrcのバックアップを取るようにしてください)
上書きしたdicrcを開いてoutput-format-typeと書かれている行に対し、次の様に書き換えてください。

;output-format-type=unidic22

これでread()を使ってもちゃんと結果が返ってくるようになります。
先程のコードを実行すると

ほげ  感動詞,一般,*,*,*,*,ホゲ,ほげ,ほげ,ホゲ,ホゲ,和,ほげ,ホゲ,ホゲ,ホゲ,*,*,*,*,*,*,2,*,*
ほげ  感動詞,一般,*,*,*,*,ホゲ,ほげ,ほげ,ホゲ,ホゲ,和,ほげ,ホゲ,ホゲ,ホゲ,*,*,*,*,*,*,2,*,*
あれ  動詞,非自立可能,*,*,文語ラ行変格,已然形-一般,アル,有る,あれ,アレ,アレ,和,あり,アリ,アリ,アリ,*,*,*,*,*,*,1,C3,*
これ  代名詞,*,*,*,*,*,コレ,此れ,これ,コレ,コレ,和,これ,コレ,コレ,コレ,*,*,*,*,*,*,0,*,*
EOS

といった感じに結果が返ってきます。

終わりに

これでUniDicを使った大量の形態素解析が出来るようになりました。
とはいえ、結局表示されない原因が突き止められませんでした。
何か原因がわかる方、情報をいただけると幸いです。