前回の続きで、N-gramの代わりに形態素解析を行って登録する方法について書いてみます。
記憶が正しければ、Namazuなどはこの方式のようです。
さて、今回はMeCabを使ってみます。
このあたりから頂いてくればよいでしょう。
これもまた、お名前.com VPSへインストールしました。
文字コードはeucではなくutf8をデフォルトにします。
そのままmakeすると途中で仮想メモリの確保に失敗するかもしれません。
失敗したら、-O0でコンパイルします。このようにすると大体のものはコンパイルできます。
それから、pythonで使うのでpythonのバインディングもインストールしておきます。
ここまでできたら、
import MeCab
t = MeCab.Tagger(”)
print t.parse(‘今日は学校で数学の勉強をしました’)
などで動作を確認してみるとよいでしょう。
インストールが正しく終わっていれば、うまく分解される様子がわかると思います。
MeCabの出力結果は100%正しいわけではないので取扱に注意が必要ですが、N-gramと違って言葉の意味で区切られるのでノイズが少ないといったメリットがあります。
たとえば、大岡山という単語はN-gramでは、岡山でヒットしてしまいます。こういったノイズは形態素解析をした場合は激減します。
逆にMeCabの辞書にない単語はうまく解析できません。人だって知らない言葉の切れ目は分かりませんからね。
ですからMeCabを使うなら、サイトに合わせたユーザ辞書を定義することは必須でしょうね。
音楽サイトなら全アーティスト名は少なくとも登録しておくべきでしょう。
まあ、そういったひと手間はサイトのコンテンツに応じて必要でしょうが、それを惜しまなければ、なかなかの良い結果が得られると思います。
それから実際にテーブルに登録する場合は、助詞などは取っ払っておいたほうがいいかもしれません。
若干の容量削減になります。
あと、僕がやっている方法では、2番目、3番目の候補を拾っておくことです。
たとえば「京都大学」は、「京都+大学」 「京都大+学」 「京都大学」の3通りの言葉をインデックスに入れてしまいます。
そうするとこのコンテンツは、京都、京都大、京都大学のどれで検索してもヒットするようになります。
同様な考え方で、サイト固有のシソーラス(*)を登録しておくのもよいでしょう。
たとえば、IT関係のサイトなら、プログラマとプログラマーは同一視したいところですので、プログラマという単語を見つけたら、「プログラマ プログラマー」といった感じで登録するとよいかもしれません。
とはいえ、やりすぎはやはりノイズを産みます。
さじ加減は難しいですが、試行錯誤してみてください。
(*)言語工学研究所というところが商用のシソーラスデータを扱っています。サイトは非常にマニアックですが面白いです。