MeCabの辞書を充実させて、名詞、特に人名が途中でぶった切られる事態を回避したいという話。
MeCabの辞書にはてなキーワードを追加しようを参考に、はてなキーワードの登録単語ライブラリをパクってきてMeCabユーザー辞書に入れる。
データはHatena Developer Centerから入手できる。
やることは上記リンクを参照するが、引っかかったところが
デフォルト辞書の選択
sudo vi /usr/local/etc/mecabrc
viコマンド
r か R で編集モードに入って、編集終わったら ESC して :wq で保存して終了。
辞書の更新
createDict.py というスクリプトを使っているが、これが csv ファイルを作るときに、単語の中にカンマが入っているものがあるようで、これのせいで出来上がった csv ファイルの列数が乱れているので、
context_id.cpp(96) [it != left_.end()] cannot find LEFT-ID for -7408,̾��,����,*,*,*,* make: *** [matrix.bin] エラー 255
となるっぽい(たぶん)。
というわけで、カンマが入っている単語は強制的にカンマを除去することにした。
createDict.py
# -*- encoding: utf-8 -*- import sys import re #数字四桁が入ったキーワードは役に立ちませんので検出して飛ばします。 year = re.compile("[0-9]{4}") #驚くべきことにはてなキーワードには%00というキーワードがありますが、 #これがcsvとして提供されているダンプではヌル文字になっているのでシステム制御文字を非許可にします。 ng = [chr(i) for i in range(0,32)] def main(): for x in sys.stdin: if re.search(year,x): continue #日付スキップ k = re.sub(",", "", x.split("\t")[1].strip()) # 改変箇所。カンマ除去 if len(k) < 2: continue #一文字スキップ for word in ng: if word in k: continue #システム制御文字スキップ k = k.lower() #MeCabはケースセンシティブなので小文字に統一して辞書作成 cost = int(max(-36000, -400 * len(k)**1.5)) #コストについては後述 print "%s,0,0,%s,名詞,一般,*,*,*,*,%s,*,*,はてなキーワード," % (k,cost,k) #0については後述 if __name__ == '__main__': main()
というわけでテスト。
echo さやのうた | mecab
さや 名詞,一般,*,*,*,*,さや,サヤ,サヤ,, の 助詞,連体化,*,*,*,*,の,ノ,ノ,, うた 名詞,一般,*,*,*,*,うた,ウタ,ウタ,, EOS
echo 沙耶の歌 | mecab
沙耶 名詞,固有名詞,人名,名,*,*,沙耶,サヤ,サヤ,, の 助詞,連体化,*,*,*,*,の,ノ,ノ,, 歌 名詞,一般,*,*,*,*,歌,ウタ,ウタ,, EOS
echo 沙耶の唄 | mecab
沙耶の唄 名詞,一般,*,*,*,*,沙耶の唄,*,*,はてなキーワード, EOS
沙耶の唄がきちんと抽出できた。