Help us understand the problem. What is going on with this article?

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

More than 5 years have passed since last update.

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

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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした