PythonでNEologd (Windows, 64bit, UTF-8)

Windows上のPythonでNEologd(MeCab)を使おうと奮闘して、最終的に上手くできたので手順をまとめました。
MeCabというのは日本語の形態素解析(文を単語に分けること)を行うプログラムで、NEologdはMeCab用の辞書です。NEologdは、新語やネットスラングのような砕けた表現を豊富に収録しているので、WEBスクレイピングで集めたデータの扱いに適しています。
このページの内容は、64bitのPython3.6以上が既にインストールされていることを前提とします。

MeCab

64bit版をインストール

MeCabの公式は32bit版しか配布していないようないので、ikegami-yukinoさんが配布してくれている野良ビルドをダウンロードしてインストールする。
https://github.com/ikegami-yukino/mecab/releases/tag/v0.996
デフォルト設定だとC:\Program Files\MeCab\dic\ipadicにインストールされる。

辞書をUTF-8に変換

MeCabをインストールすると、自動でIPA辞書(ipadic)もインストールされている。場所はC:\Program Files\MeCab\dic\ipadic
NEologdがSJISで扱えない文字を含むので、合わせるためにipadicもUTF-8に変換する。

MeCab/dic/ipadic/dicrcを編集。config-charset = SHIFT-JISUTF-8に変更。

bos-feature = BOS/EOS,*,*,*,*,*,*,*,*
eval-size = 8
unk-eval-size = 4
config-charset = UTF-8

; yomi
node-format-yomi = %pS%f[7]

次にMeCab/dic/ipadic内の.csvファイル.defファイルを全てUTF-8で保存し直す。
どんな方法でも良いが、サクラエディタのマクロを使うと一括変換できて楽。

sjis_to_utf8.mac
//キーボードマクロのファイル
S_SelectAll(0); // すべて選択
SJIStoUTF8(0);  // SJIS→UTF-8コード変換
FileSave( ); // 上書き保存
WinClose( ); // 閉じる

convert.bat

cd ipadic
for /r %%f in (*.csv, *.def) do (
  "C:\Program Files (x86)\sakura\sakura.exe" %%f -M=../sjis_to_utf8.mac
)

sjis_to_utf8.macconvert.batを同じフォルダーに配置して、ipadicフォルダーを同じ場所にコピーする。(Program Files内は初期状態では上書き禁止になっている場合があるので)
convert.batを実行すると、コピーしたipadicフォルダーの.csvと.defがUTF-8に一括変換される。変換が終わったらipadicフォルダーのみ元の場所に上書き移動する。

辞書を再コンパイル

C:\Program Files\MeCab\binに移動して、以下のコマンドを(管理者で)実行。

./mecab-dict-index -d "C:\Program Files\MeCab\dic\ipadic" -f utf-8 -t utf-8

フォルダー内にmatrix.bin, char.bin, sys.dic, unk.dicの4ファイルが作られるので、全てC:\Program Files\MeCab\dic\ipadicに移動して上書きする。

NEologd

ダウンロード

NEologdはここからダウンロード。gitをインストールしていなくても、右側の緑色のボタンからダウンロードできる。
https://github.com/neologd/mecab-ipadic-neologd.git

解凍

7-Zipなどを使って、seedフォルダー内のファイルを全て解凍する。
解凍したらC:\Program Files\MeCab\dic\neologdに移動させる。(フォルダー名は"neologd"でなくても、任意の名前で良い)

辞書をコンパイル

MeCab/dic/neologdに以下の内容でmecab-dict-index.batを作って実行。.dicファイルが作られていく。

for /r %%f in (*.csv) do (
  "%~dp0..\..\bin\mecab-dict-index.exe" -d ../ipadic -u "%%~dpnf.dic" -f utf-8 -t utf-8 "%%f"
)

設定ファイルに追加

MeCab/etc/mecabrcを開いて、追加したneologdの辞書のパスを追加。
以下は例。ファイル名は頻繁に変わる。

userdic = "C:\Program Files\MeCab\dic\neologd\neologd-quantity-infreq-dict-seed.20190415.dic","C:\Program Files\MeCab\dic\neologd\mecab-user-dict-seed.20190930.dic","C:\Program Files\MeCab\dic\neologd\neologd-adjective-exp-dict-seed.20151126.dic","C:\Program Files\MeCab\dic\neologd\neologd-adjective-std-dict-seed.20151126.dic","C:\Program Files\MeCab\dic\neologd\neologd-adjective-verb-dict-seed.20160324.dic","C:\Program Files\MeCab\dic\neologd\neologd-adverb-dict-seed.20150623.dic","C:\Program Files\MeCab\dic\neologd\neologd-common-noun-ortho-variant-dict-seed.20170228.dic","C:\Program Files\MeCab\dic\neologd\neologd-date-time-infreq-dict-seed.20190415.dic","C:\Program Files\MeCab\dic\neologd\neologd-ill-formed-words-dict-seed.20170127.dic","C:\Program Files\MeCab\dic\neologd\neologd-interjection-dict-seed.20170216.dic","C:\Program Files\MeCab\dic\neologd\neologd-noun-sahen-conn-ortho-variant-dict-seed.20160323.dic","C:\Program Files\MeCab\dic\neologd\neologd-proper-noun-ortho-variant-dict-seed.20161110.dic"

これでNEologdの追加は終わり。

NEologd以外のユーザー辞書を登録するときも、ここに書いたのと同じ手順でできる。
辞書csvの仕様はここ。https://taku910.github.io/mecab/dic.html
コスト計算についてはここを参考にできる。https://taku910.github.io/mecab/dic-detail.html
ただし、コストはint型の範囲に収まっている必要があるので、最小値は-36000から-32768(C言語のint型の最小値)に変更したほうが良いかもしれない。

mecab-python-windows

インストール

mecab-python-windowsはPythonでMeCabを扱うためのパッケージのWindows版。(64bit版MeCabを配布しているのと同じ方が作ったものです。)
pipでインストール。Python3.6以上に対応している。

pip install mecab-python-windows

libmecab.dllをコピー

MeCab/bin/libmecab.dllをPythonがインストールされている場所のLib/site-packageにコピーする。
すると、どういうわけかPythonのMeCabパッケージが先程インストールした64bit版MeCabを認識するようになる。

(追記) 解析前に行うことが望ましい文字列の正規化処理

半角に揃える、連続した長音をまとめるなど、NEologdを通す前に行うべき前処理について公式で述べられている。
https://github.com/neologd/mecab-ipadic-neologd/wiki/Regexp.ja

これについても池上さんがpythonのモジュールを作ってくれているので、pipからインストールすると良い。
http://yukinoi.hatenablog.com/entry/2015/10/11/205006

pip install neologdn

以下のようにして使う。

import neologdn
neologdn.normalize(u'1234スーーーーーーパーーーーーー')

使用例

例1 (基本)

# coding: UTF-8
import MeCab

t = MeCab.Tagger()
print(t.parse('8月3日に放送された「中居正広の金曜日のスマイルたちへ」(TBS系)で、1日たった5分でぽっこりおなかを解消するというダイエット方法を紹介。キンタロー。のダイエットにも密着。'))

出力結果

8月3日	名詞,固有名詞,一般,*,*,*,8月3日,ハチガツミッカ,ハチガツミッカ
に	助詞,格助詞,一般,*,*,*,に,ニ,ニ
放送	名詞,サ変接続,*,*,*,*,放送,ホウソウ,ホーソー
さ	動詞,自立,*,*,サ変・スル,未然レル接続,する,サ,サ
れ	動詞,接尾,*,*,一段,連用形,れる,レ,レ
た	助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
「	記号,括弧開,*,*,*,*,「,「,「
中居正広の金曜日のスマイルたちへ	名詞,固有名詞,一般,*,*,*,中居正広の金曜日のスマイルたちへ,ナカイマサヒロノキンヨウビノスマイルタチヘ,ナカイマサヒロノキンヨービノスマイルタチヘ
」	記号,括弧閉,*,*,*,*,」,」,」
(	名詞,サ変接続,*,*,*,*,*
TBS	名詞,固有名詞,一般,*,*,*,TBS,ティービーエス,ティービーエス
系	名詞,接尾,一般,*,*,*,系,ケイ,ケイ
)	名詞,サ変接続,*,*,*,*,*
で	助詞,格助詞,一般,*,*,*,で,デ,デ
、	記号,読点,*,*,*,*,、,、,、
1日	名詞,固有名詞,一般,*,*,*,1日,ツイタチ,ツイタチ
たった	副詞,助詞類接続,*,*,*,*,たった,タッタ,タッタ
5分	名詞,固有名詞,一般,*,*,*,5分,ゴフン,ゴフン
で	助詞,格助詞,一般,*,*,*,で,デ,デ
ぽっこりおなか	名詞,固有名詞,一般,*,*,*,ぽっこりおなか,ポッコリオナカ,ポッコリオナカ
を	助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
解消	名詞,サ変接続,*,*,*,*,解消,カイショウ,カイショー
する	動詞,自立,*,*,サ変・スル,基本形,する,スル,スル
という	助詞,格助詞,連語,*,*,*,という,トイウ,トユウ
ダイエット方法	名詞,固有名詞,一般,*,*,*,ダイエット方法,ダイエットホウホウ,ダイエットホウホー
を	助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
紹介	名詞,サ変接続,*,*,*,*,紹介,ショウカイ,ショーカイ
。	記号,句点,*,*,*,*,。,。,。
キンタロー。	名詞,固有名詞,一般,*,*,*,キンタロー。,キンタロー,キンタロー
の	助詞,連体化,*,*,*,*,の,ノ,ノ
ダイエット	名詞,サ変接続,*,*,*,*,ダイエット,ダイエット,ダイエット
に	助詞,格助詞,一般,*,*,*,に,ニ,ニ
も	助詞,係助詞,*,*,*,*,も,モ,モ
密着	名詞,サ変接続,*,*,*,*,密着,ミッチャク,ミッチャク
。	記号,句点,*,*,*,*,。,。,。
EOS

例2 (未知語の出力)

未知語の出力形式をコンストラクターの引数で指定する。指定しない場合は、MeCab/lib/ipadic/unk.defの記述に従って出力される。

# coding: UTF-8
import MeCab

t = MeCab.Tagger(r'-U %M\t未知語\n -x 未知語,*,*,*,*,*,[UNK],*,*')
node = t.parseToNode('アルブルグでのガウ離脱も調べてみたが、他パーティのティナ、ロックを同じマップ内に置いていても進行不能になってしまった。')
while node:
    print(node.surface , ': ', node.feature)
    node = node.next

出力結果

 :  BOS/EOS,*,*,*,*,*,*,*,*
アルブルグ :  未知語,*,*,*,*,*,[UNK],*,*
で :  助詞,格助詞,一般,*,*,*,で,デ,デ
の :  助詞,連体化,*,*,*,*,の,ノ,ノ
ガウ :  名詞,固有名詞,一般,*,*,*,ガウ,ガウ,ガウ
離脱 :  名詞,サ変接続,*,*,*,*,離脱,リダツ,リダツ
も :  助詞,係助詞,*,*,*,*,も,モ,モ
調べ :  動詞,自立,*,*,一段,連用形,調べる,シラベ,シラベ
て :  助詞,接続助詞,*,*,*,*,て,テ,テ
み :  動詞,非自立,*,*,一段,連用形,みる,ミ,ミ
た :  助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
が :  助詞,接続助詞,*,*,*,*,が,ガ,ガ
、 :  記号,読点,*,*,*,*,、,、,、
他 :  接頭詞,名詞接続,*,*,*,*,他,タ,タ
パーティ :  名詞,サ変接続,*,*,*,*,パーティ,パーティ,パーティ
の :  助詞,連体化,*,*,*,*,の,ノ,ノ
ティナ :  名詞,固有名詞,一般,*,*,*,TINA,ティナ,ティナ
、 :  記号,読点,*,*,*,*,、,、,、
ロック :  名詞,サ変接続,*,*,*,*,ロック,ロック,ロック
を :  助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
同じ :  連体詞,*,*,*,*,*,同じ,オナジ,オナジ
マップ :  名詞,一般,*,*,*,*,マップ,マップ,マップ
内 :  名詞,接尾,一般,*,*,*,内,ナイ,ナイ
に :  助詞,格助詞,一般,*,*,*,に,ニ,ニ
置い :  動詞,自立,*,*,五段・カ行イ音便,連用タ接続,置く,オイ,オイ
て :  助詞,接続助詞,*,*,*,*,て,テ,テ
い :  動詞,非自立,*,*,一段,連用形,いる,イ,イ
て :  助詞,接続助詞,*,*,*,*,て,テ,テ
も :  助詞,係助詞,*,*,*,*,も,モ,モ
進行 :  名詞,サ変接続,*,*,*,*,進行,シンコウ,シンコー
不能 :  名詞,形容動詞語幹,*,*,*,*,不能,フノウ,フノー
に :  助詞,格助詞,一般,*,*,*,に,ニ,ニ
なっ :  動詞,自立,*,*,五段・ラ行,連用タ接続,なる,ナッ,ナッ
て :  助詞,接続助詞,*,*,*,*,て,テ,テ
しまっ :  動詞,非自立,*,*,五段・ワ行促音便,連用タ接続,しまう,シマッ,シマッ
た :  助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
。 :  記号,句点,*,*,*,*,。,。,。
 :  BOS/EOS,*,*,*,*,*,*,*,*

参考