MeCabの辞書をはてなキーワードで充実させるのにものすごい苦労した話

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

沙耶の唄がきちんと抽出できた。