1. Qiita
  2. 投稿
  3. mecab

形態素解析のために Wikipedia とはてなキーワードからユーザー辞書を生成し利用する

  • 116
    いいね
  • 3
    コメント
この記事は最終更新日から1年以上が経過しています。

形態素解析エンジンと辞書

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 に掲載されているような有名な固有名詞の解析もこれでバッチリです。