MeCabの辞書にWikipediaの単語を登録してみる
前の記事で、MeCabの辞書に自分の好きな単語を登録して、解析の精度を上げるというようなことをしました。今回は、Wikipedia(以降 うぃきさん)で公開されている膨大な記事のタイトルを、名詞と言い張り、これを辞書に登録することで、精度向上に挑戦してみます。
OS : Ubuntu14.04 LTE版
MeCab : ver0.996
1. wikipediaのオープンデータからタイトル一覧を入手
兎にも角にも、登録するためのデータが無くては何もできません。今回は、うぃきさんの記事タイトルということで、うぃきさんが公開している全記事のタイトル一覧のテキストファイルを貰ってきます。
テキストのおき場所はこちら(他にも色々なオープンデータがあるみたい)です。ここのページから「jawiki-latest-all-titles-in-ns0.gz」というファイルをダウンロードしてください。公式のオープンデータなので、常に最新の情報が登録されているそうです。
ちなみに、うぃきさんは記事に対するクローリングを明確に拒否しているらしいので、やっちゃだめですよ。
2. タイトル一覧からMeCab辞書用のCSVを作成
ダウンロードしたファイルを解凍すると、「jawiki-latest-all-titles-in-ns0」というテキストファイルが出てきます(このファイルはものすごく大きいので、catコマンドとかで見るとグワーってなるので注意)。
実際にこのファイルを見ると分かるのですが、「(曖昧さ回避)」や「~一覧」といったうぃきさん独特のタイトルも登録されている事が分かります。また、タイトル内のスペースはアンダーバーになっているようです。
なので、これらに対策を討ちつつ、csvファイルに整形していきます。
ほとんど参考元サイトさんのプログラムのままですが、そのままでは、エラーを吐いて動かなかったため、訂正したものを載せておきます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
import codecs import unicodedata cheaker = re.compile(ur"^([0-9]{4})|^([0-9|!-/:-@[-`{-~])|(()|^[a-zA-Z]$|^[ぁ-んァ-ヴ・ー]$|_|,|(一覧)") ng = [chr(i) for i in range(0,32)] def isValid(word): if len(word) == 1: return False if cheaker.search(word): return False for ng_ch in ng: if ng_ch in word: return False if len(word) == 2 and unicodedata.name(word[0])[0:8] == "HIRAGANA" and unicodedata.name(word[1])[0:8] == "HIRAGANA": return False for c in word: if not (unicodedata.name(c)[0:8] == "HIRAGANA" or unicodedata.name(c)[0:8] == "KATAKANA" or unicodedata.name(c)[0:3] == "CJK" or unicodedata.name(c)[0:5] == "DIGIT" or unicodedata.name(c)[0:5] == "LATIN"): return False return True if __name__ == "__main__": argvs = sys.argv argc = len(argvs) if (argc != 3): print 'Usage: # python %s Input_FileName Output_FileName' % argvs[0] quit() fin_name = argvs[1] fout_name = argvs[2] fin = codecs.open(fin_name, "r", "utf-8") fout = codecs.open(fout_name, "w", "utf-8") for line in fin: word = line.rstrip() if isValid(word): word = word.lower() cost = int(max(-36000, -400*len(word)**1.5)) fout.write(u"%s,-1,-1,%d,名詞,一般,*,*,*,*,*,*,*,%sn" % (word, cost, "Wikipedia")) fin.close() fout.close() |
コードを読んでもらえれば分かるかと思いますが、タイトル一覧から、西暦っぽいもの(4桁の数字)、文頭が記号のもの、括弧を含んでいるもの、一文字のもの、「,」「_」「一覧」を含んでいるものを削除した上で、残ったものをcsvに出力しています。
ちなみに、Pythonのバージョンは2.7です。また、実行コマンドは以下のようになります。
1 |
python wiki2csv.py jawiki-latest-all-titles-in-ns0 out.csv |
3. 辞書のコンパイル
さて、仕上げに参りましょう。あとは、コンパイルして設定ファイルに参照するだけ。この後は前の記事と全く同じなので、簡単に書きます。
まずは、コンパイル用のコマンド
1 |
/usr/lib/mecab/mecab-dict-index -d /usr/lib/mecab/dic/ipadic -u [作成する辞書名].dic -f utf-8 -t utf-8 [作成したcsv].csv |
そして、編集する設定ファイル(/etc/mecabrc)の編集です。
1 2 3 4 5 |
;userdicの後ろを編集 ;自分の辞書へのパスにあわせてください userdic = /home/[ユーザー名]/mecabDic/user.dic ;複数の場合は以下のように書くらしいです。 ;userdic = /home/hoge1.dic,/home/hoge2.dic |
これにて、終わりです。
お疲れ様でした。
「人工知能に関する断創録」