形態素解析エンジンと辞書
MeCab はオープンソースの形態素解析エンジンであり、自然言語処理の基礎となる形態素解析のデファクトとなるツールです。また各言語用バインディングを使うことで Ruby や Python をはじめ多くのさまざまなプログラミング言語から呼び出して利用することもでき大変便利です。
MeCab の仕組みとしては、対象言語の文法の知識を形態素解析用「辞書」 (品詞等の情報付きの単語リスト) という形で用意しこれをもとに自然言語を分解、品詞を判定します。プロジェクトページには 3 種類の辞書が紹介されています。ほぼそのまま引用ですがまとめると以下の通りです。
辞書名 | 説明 |
---|---|
IPA 辞書 | IPAコーパス に基づき CRF でパラメータ推定した辞書 |
Juamn 辞書 | 京都コーパスに基づき CRF でパラメータ推定した辞書 |
Unidic 辞書 | BCCWJ コーパスに基づき CRF でパラメータ推定した辞書 |
形態素解析用辞書の問題点
さて、これらの辞書、たとえばもっともポピュラーと思われる IPA 辞書を利用してみますと、一部の IT 用語など専門用語がうまく解析できません。たとえば以下の通り「クラウド」という言葉はクラとウドに分かれて解析されてしまいます。
require 'MeCab'
m = MeCab::Tagger.new
print m.parse("クラウド")
#=>
# クラ 名詞,固有名詞,一般,*,*,*,クラ,クラ,クラ
# ウド 名詞,一般,*,*,*,*,ウド,ウド,ウド
# EOS
IT 関連の分野におけるテキストマイニングをするにあたり、この精度では色々と支障をきたすことになってしまいます。そこで、辞書を独自に作成し、オリジナルのカスタム辞書を用意することにします。
ユーザー辞書を作成する
Wikipedia やはてなキーワードには最新の IT 関連の語彙も満載ですから、これらを元に MeCab 用のユーザー辞書を作ります。
キーワードファイルをダウンロードする
curl または wget などでソースとなるキーワードファイルを取得します。
# はてなキーワード
curl -L http://d.hatena.ne.jp/images/keyword/keywordlist_furigana.csv | iconv -f euc-jp -t utf-8 > keywordlist_furigana.csv
# Wikipedia
curl -L http://dumps.wikimedia.org/jawiki/latest/jawiki-latest-all-titles-in-ns0.gz | gunzip > jawiki-latest-all-titles-in-ns0
名詞を抜き出して CSV ファイルにする
これらから名詞を抽出して CSV ファイルを生成します。
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
これにより custom.csv というファイルが生成されます。
ユーザー辞書を作成する
こうして出来た CSV ファイルを元に mecab-dict-index コマンドでユーザー辞書 custom.dic を作ります。
/usr/local/libexec/mecab/mecab-dict-index -d /usr/local/lib/mecab/dic/ipadic -u custom.dic -f utf-8 -t utf-8 custom.csv
これでユーザー辞書は完成です。
ユーザー辞書をプログラム言語から使う
プログラムからユーザー辞書を指定して利用する場合には、インスタンス生成時の引数にユーザー辞書のパスを指定します。
userdic_path = "./custom.dic"
c = MeCab::Tagger.new("-u #{userdic_path}")
print c.parse("クラウド")
#=>
# クラウド 名詞,一般,*,*,*,*,クラウド,*,*,wikipedia
# EOS
今度はうまく「クラウド」という用語がひとつの名詞として解析できました。
Wikipedia に掲載されているような有名な固有名詞の解析もこれでバッチリです。