Mecab様で高速気軽に形態素解析ができます。導入も楽ですし、各種プログラムから呼び出すのも簡単です。基本はIPA辞書を使うと思いますが、御存知の通りネットスラングには対応していなかったり、固有名詞には弱かったりします。なので、今回はニコニコ大百科 はてなキーワード 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
ニコニコ大百科
こちらから「ニコニコ大百科データ」をダウンロードします。head.zip
の方です。
$ unzip head.zip
変換スクリプト
convert.rb
require 'csv'
def output(title, type)
title_length = title.length
return nil unless title_length > 3
score = [-36000.0, -400 * (title_length ** 1.5)].max.to_i
[title, nil, nil, score, '名詞', '一般', '*', '*', '*', '*', title, '*', '*', type]
end
CSV.open("user.csv", 'w') do |csv|
# niconico
Dir::foreach('./niconico') do |f|
next unless f =~ /^head[0-9]{4}\.csv$/
open("./niconico/#{f}").each do |line|
title = line.split(',')[1].gsub('"','')
out = output(title, 'niconico')
csv << out unless out.nil?
end
end
# hatena
open('keywordlist_furigana.csv').each do |line|
title = line.split("\t")[1].strip
out = output(title, 'hatena')
csv << out unless out.nil?
end
# Wikipedia
open('jawiki-latest-all-titles-in-ns0').each do |line|
title = line.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.gsub!('_', ' ')
out = output(title, 'wikipedia')
csv << out unless out.nil?
end
end
このRubyスクリプトでCSVに変換してあげます。そして、mecab-dict-indexを使ってdicファイルに変換すれば終了です。
$ ruby convert.ruby
$ mv user.csv /usr/local/lib/mecab/dic/ipadic
$ cd /usr/local/lib/mecab/dic/ipadic
$ /usr/local/libexec/mecab/mecab-dict-index -d /usr/local/lib/mecab/dic/ipadic -u user.dic -f utf-8 -t utf-8 user.csv
ユーザ辞書を使う
$ mecab -u user.dic
おにくだいすき!ゼウシくん
おにくだいすき!ゼウシくん 名詞,一般,*,*,*,*,おにくだいすき!ゼウシくん,*,*,niconico
EOS
ちゃんとゼウシくんが認識されましたね。ただ、記号などが含まれるゲームとかアニメとかの固有名詞の一致は結構難しいですね。ここらへんの表記ゆれに対応するには、どうするのがいいんだろうか。