takuti.me ABOUT

2013-07-29

はてなキーワードを使ってigo-ruby(MeCab)用の辞書をナウい感じにする

igo-ruby(辞書はMeCabとほぼ同じなのでMeCabのこととして読んでも可)の辞書はナウくないです。

人工知能」を分かち書きすると「人工 知能」になっちゃいます。
ニコニコ動画」を分かち書きすると「ニコニコ 動画」になっちゃいます。
IPアドレス」を分かち書きすると「IP アドレス」になっちゃいます。
ニューラルネットワーク」を分かち書きすると「ニュー ラ ル ネットワーク」になっちゃいます。

形態素解析器の応用例が増えてくる中で必要となるのは、上記で挙げたようなナウいワードを1つの単語として扱ってくれることです。

例えばbuzztterのようなサービスでは、「ニコニコ動画」は「ニコニコ動画」でいて欲しいし、「ニューラルネットワーク」は「ニューラルネットワーク」のままであってほしいわけですね。

僕も最近ちょっと辞書をナウくする必要が出たので、早速公開されているはてなキーワードのデータを使ってやってみました。

はてなキーワードのデータから辞書を作るコード(仮)は以下。
takuti / twitter_bot / tool / hatena2dic.rb

はてなキーワードのデータはキーワードそのものとふりがながタブ区切りで各行に書かれているので、それに合わせる形でそれぞれを読んであげる。元データの文字コードはEUC-JP。

そしてお好みの条件で辞書に加えたくないキーワードなんかも除外する。
今回は、

  • 2009-09-04のような年月日
  • 1945年のような年
  • すでに1単語として判断されるもの

を除外しています。

ふりがなはMojiモジュールを使ってカタカナ化しています。

加えて、辞書を作る時に大切なコスト計算もしています。MeCabだとコストに-1を指定すると自動でコストを割り振ってくれるみたいですが、igo-rubyにはそんな機能ありません。

辞書のコストについては以下を参考にさせていただきました。

最終的には2番目のリンク先に記載されていた、
score = [-32768.0, (6000 - 200 *(title.size**1.3))].max.to_i
を利用させていただくことに。

各キーワードの情報はCSVに以下のような形で書き込んで、それを追加用辞書ファイルとする。既存の辞書ファイルの文字コードがすべてEUC-JPなのでこれもEUC-JPで。

#{word},0,0,#{cost},名詞,一般,*,*,*,*,#{word},#{furigana},#{furigana}

最後に、追加用辞書ファイルをディレクトリ mecab-ipadic-2.7.0-20070801 内に移動して、あとは通常の辞書生成と同じようにコマンドを叩いて終わり。

java -Xmx1024m -cp igo-0.4.5.jar net.reduls.igo.bin.BuildDic ipadic mecab-ipadic-2.7.0-20070801 EUC-JP

これで生成された辞書を使って形態素解析なんかを行えば、「人工知能」は「人工知能」のままで、「ニコニコ動画」は「ニコニコ動画」のままで解釈される!ぱちぱち。

問題点

1. カンマを含むキーワードが登録できない
カンマを含むキーワード(「NO MUSIC, NO LIFE.」とか)を今の実装で辞書に登録しようとすると、カンマそのものがCSVの区切り文字と判断されて上手くいきません。

これはMeCabの場合、そのキーワードをダブルクォーテーションで囲ってあげることで解決できます。

しかしigo-rubyの場合、MeCabとの相違点として挙げられているように、

"組打ち",1285,1285,5622,名詞,一般,*,*,*,*,組打ち,クミウチ,クミウチ
 ※ ↑この単語の表層形は、'組打ち'ではなく'"組打ち"'となる

と、ダブルクォーテーションそのものも単語の一部として解釈されてしまうらしく、しかしまぁさほど影響は無さそうなので今はカンマを含むキーワードを全てスキップすることで応急処置としています。

2. 文字コードCP51932の扱い
といった機種依存文字を含むキーワードはデータから読み込んだときの文字コードがCP51932になっています。「東大理Ⅲ」とかですね。

それらを他のEUC-JPのキーワードと同じように扱うと、「人工知能」は「人工知能」のままになっても、「東大理Ⅲ」なんかは「東大理Ⅲ」のままにはならない。

困ったのでひとまず保留ということで、文字コードがCP51932のキーワードを全てスキップすることでこちらも応急処置としています。

CP51932がEUC-JPになればこの問題は解決するの?どうやってそれを確認するの(どうやってCP51932からEUC-JPへの変換を行うの)?

このあたりに答えを出す必要がありそう。

というわけで

問題点が残っていて未完成ではありますが、ひとまずある程度辞書がナウい感じになったということでまとめておきます。

今回ははてなキーワードでしたが、Wikipediaのタイトルでも元データがどんな規則で書かれているかに注意すれば同じ事は簡単にできますね。
【参考】Wikipediaのダウンロードできるデータファイル一覧 | mwSoft

その他参考にさせていただものは以下です。