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

【mecab】hatenaキーワードとwikipediaのタイトルからオリジナルの辞書を作る

mecabデフォルトの辞書では以下のようにちょっと専門用語などが入ってくると解析が不十分

$ mecab
クラウド
クラ    名詞,固有名詞,一般,*,*,*,クラ,クラ,クラ
ウド    名詞,一般,*,*,*,*,ウド,ウド,ウド
EOS

hatenaキーワードやwikiからもっと多くの単語を取り込むことで精度を上げる

wikipediaの辞書をダウンロード

$ curl -L http://dumps.wikimedia.org/jawiki/latest/jawiki-latest-all-titles-in-ns0.gz | gunzip > jawiki-latest-all-titles-in-ns0

はてなキーワードのリスト取得

$ curl -L http://d.hatena.ne.jp/images/keyword/keywordlist_furigana.csv | nkf -w  > keywordlist_furigana.csv

辞書用のCSVにフォーマットを変更するスクリプトを作成

$ vi store_wikipedia_and_hatena_to_csv.rb

require 'csv'

original_data = {
  wikipedia: 'jawiki-latest-all-titles-in-ns0',
  hatena: 'keywordlist_furigana.csv'
}

CSV.open("custom.csv", 'w') do |csv|
  original_data.each do |type, filename|
    next unless File.file? 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, '*', '*', type]
      end
    end
  end
end

さっきダウンロードしてきたファイルをCSVに出力。

$ ruby store_wikipedia_and_hatena_to_csv.rb

実行するとcustom.csvが作成される

ユーザー辞書を作成する

custom.csvを元に mecab-dict-index コマンドでユーザー辞書 custom.dic を作ります。

$ /usr/lib/mecab/mecab-dict-index -d /usr/lib/mecab/dic/ipadic -u custom.dic -f utf-8 -t utf-8 custom.csv
reading custom.csv ... 1720131
emitting double-array: 100% |###########################################|

done!

これでユーザー辞書は完成

作成した辞書を使ってみる

$ mecab -u custom.dic
クラウド
クラウド        名詞,一般,*,*,*,*,クラウド,*,*,wikipedia
EOS

今度はクラウドが名詞として認識された!

システムとして作成した辞書を使うなら/etc/mecabrcのuserdicに指定しておくこと