読者です 読者をやめる 読者になる 読者になる

MeCabのユーザー辞書にWikipediaとはてなの単語を追加する

自然言語処理

MeCabの辞書に新しい単語を追加してみたいと思います。
追加する単語はWikipediaとはてなのものを使用します。

Wikipediaの準備

$ wget http://dumps.wikimedia.org/jawiki/latest/jawiki-latest-all-titles-in-ns0.gz
$ gunzip jawiki-latest-all-titles-in-ns0.gz

はてなの準備

$ wget http://d.hatena.ne.jp/images/keyword/keywordlist_furigana.csv
$ nkf -w --overwrite keywordlist_furigana.csv

CSV変換用のスクリプトを作成する

# makedic.rb

require 'csv'

CSV.open("onomasticon.csv", 'w') do |csv|
  %w(jawiki-latest-all-titles-in-ns0 keywordlist_furigana.csv).each do |filename|
    open(filename).each do |title|
      title.strip!

      next if title =~ %r(^[+-.$()?*/&%!"'_,]+)
      next if title =~ /^[-.0-9]+$/
      next if title =~ /曖昧さ回避/
      next if title =~ /_\(/
      next if title =~ /^PJ:/
      next if title =~ /の登場人物/
      next if title =~ /一覧/

      title_length = title.length

      if title_length > 3
        score = [-36000.0, -400 * (title_length ** 1.5)].max.to_i
        csv << [title, nil, nil, score, '名詞', '一般', '*', '*', '*', '*', title, '*', '*']
      end
    end
  end
end

エントリーのフォーマット

表層形,左文脈ID,右文脈ID,コスト,品詞,品詞細分類1,品詞細分類2,品詞細分類3,活用形,活用型,原形,読み,発音
  • 左文脈IDと右文脈IDは空にしておくと自動的にIDを付与してくれる。
  • コストは参考サイトにあったものを使ってみた。

辞書のコンパイル

$ ruby makedic.rb
$ /usr/local/libexec/mecab/mecab-dict-index -d /usr/local/lib/mecab/dic/ipadic -u onomasticon.dic -f utf-8 -t utf-8 onomasticon.csv
reading onomasticon.csv ... 1605477
emitting double-array: 100% |###########################################|

done!

オプション

-d システム辞書があるディレクトリ
-u 辞書ファイル名
-f CSVの文字コード
-t バイナリ辞書の文字コード

ユーザー辞書を指定して実行する

$ mecab
人工無脳
人工    名詞,一般,*,*,*,*,人工,ジンコウ,ジンコー
無      接頭詞,名詞接続,*,*,*,*,無,ム,ム
脳      名詞,一般,*,*,*,*,脳,ノウ,ノー
EOS

$ mecab -u onomasticon.dic
人工無脳
人工無脳        名詞,固有名詞,*,*,*,*,人工無脳,*,*
EOS

認識してくれるようになった!

参考

http://mecab.googlecode.com/svn/trunk/mecab/doc/dic.html