Amazon Search のコンテンツ解析ロジックをリファクタリング中

Amazon Search サービスを開始してから約2年になりました。開始始めは 2004 年 03 月 07 日らしいんですが、自分でも覚えていません・・・

細かい修正を含めるて数えてみたら、52回目のバージョンアップになりますが、サーバの計算力も Pentium 4 から Athlon 64 X2 と大幅に向上したこともあり、コンテンツ解析部分の計算量を増やして、より適合度の高い関連商品が選択されるようにしてみました。

前より良くなってますよね? (なってなかったらごめんなさい・・・)
※新しいエントリーもしくは古いキャッシュが消えるまでお待ち頂いてからご確認ください。

- スポンサーリンク -

さて、計算量を増やす代わりに、形態素解析を ChaSen (茶筌)から MeCab に変更しました。MeCab は ChaSen の3〜4倍程度は高速に動作するので、全体としては速度的に速くなっているかもしれません。

前から MeCab には注目していて、いろいろ実験を繰り返してきてはいたのですが、辞書追加や chasenrc で納得のいくまでカスタマイズした ChaSen の分かち書きの結果に比べて MeCab 0.8 系の分かち書きの精度が低かったため、導入を見送ってきました。

MeCab 0.9 系は、0.8 系以前とは根本的に設計自身が違うようでして、かなり満足のいく分かち書きをしてくれるようになりました。速度も 0.8 系とほぼ変わらないようです。

MeCab 0.9 系で変更された点は下記の通りとのことです。

- ipadic のパラメータを mecab 自身で学習するように変更。mecab-ipadic という辞書パッケージを独自に作成した
- 辞書のテキスト/バイナリフォーマットの変更
- ユーザ辞書のサポート
- CRF に基づく解析精度の向上
- ユーザ自身による CRF 学習のサポート
- コーパス/辞書非依存性の徹底
- ソフト分かち書き
- 未知語処理の性能向上
- 未知語処理ルールのユーザ定義
- Perl/Ruby/Java/Python のインタフェイスの変更
- Perl/Ruby/Java/Python インタフェイスの簡略化 (SWIG レベルでの簡略化)

中でも一番結果として嬉しかったのが未知語処理。以前は分割されすぎな感じがありましたが、今回は良い感じにまとまった単語として分かち書きされるようになっています。作者のサイトにもある例を Chasen、MeCab 0.81、MeCab 0.9 で比較してみますと、

ChaSen 2.3.3

ホリエモン氏に会った。
ホリエモン                      未知語
氏      シ      氏      名詞-接尾-人名
に      ニ      に      助詞-格助詞-一般
会っ    アッ    会う    動詞-自立       五段・ワ行促音便        連用タ接続
た      タ      た      助動詞  特殊・タ        基本形
。      。      。      記号-句点

MeCab 0.81

ホリエモン氏に会った。
ホ      名詞,一般,*,*,*,*,ホ,ホ,ホ
リエ    名詞,固有名詞,人名,名,*,*,リエ,リエ,リエ
モン    名詞,固有名詞,一般,*,*,*,モン,モン,モン
氏      名詞,接尾,人名,*,*,*,氏,シ,シ
に      助詞,格助詞,一般,*,*,*,に,ニ,ニ
会っ    動詞,自立,*,*,五段・ワ行促音便,連用タ接続,会う,アッ,アッ
た      助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
。      記号,句点,*,*,*,*,。,。,。

MeCab 0.9

ホリエモン氏に会った。
ホリエモン      名詞,固有名詞,一般,*,*,*,*
氏      名詞,接尾,人名,*,*,*,氏,シ,シ
に      助詞,格助詞,一般,*,*,*,に,ニ,ニ
会っ    動詞,自立,*,*,五段・ワ行促音便,連用タ接続,会う,アッ,アッ
た      助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
。      記号,句点,*,*,*,*,。,。,。

こんな感じで、CaSen の結果と同じ結果が出力されます。その他、いろいろな例を試してみたのですが、MeCab 0.9 系と ChSen 2.3.3 で違う結果を見つける方が苦労します。半角カナ文字とかは MeCab 0.9 の方が上手く処理してくれます。

ChaSen 2.3.3

( ゚Д゚)ウマーなメールを貰う
(       (       (       記号-括弧開
゚                       未知語
Д                      未知語
゚                       未知語
)       )       )       記号-括弧閉
ウ                       未知語
マ                       未知語
ー                       未知語
な      ナ      だ      助動詞  特殊・ダ        体言接続
メール  メール  メール  名詞-サ変接続
を      ヲ      を      助詞-格助詞-一般
貰う    モラウ  貰う    動詞-自立       五段・ワ行促音便        基本形

MeCab 0.9

( ゚Д゚)ウマーなメールを貰う
(       名詞,サ変接続,*,*,*,*,*
゚       名詞,固有名詞,一般,*,*,*,*
Д      名詞,固有名詞,一般,*,*,*,*
゚       名詞,固有名詞,一般,*,*,*,*
)       名詞,サ変接続,*,*,*,*,*
ウマー     名詞,固有名詞,一般,*,*,*,*
な      助動詞,*,*,*,特殊・ダ,体言接続,だ,ナ,ナ
メール  名詞,サ変接続,*,*,*,*,メール,メール,メール
を      助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
貰う    動詞,自立,*,*,五段・ワ行促音便,基本形,貰う,モラウ,モラウ

やっぱり、2ch 文字というか、顔文字みたいなヤツは辞書を整備していかないと無理っぽいです。結構、こういった文字がノイズになってくるので、コンテンツ解析の精度を向上させるためには、この辺を手厚く辞書整備していくことが大切になります。

更新が 2003 年で停止して、2.3.3 が最終バージョンとなっている ChaSen より、更新が続けられている MeCab に今後も期待です。各言語のバインディングも一新されて、メソッドとかかっちょ良くなって嬉しいです。イテレータっぽく結果をループさせるのが今風。

use MeCab;
my $m = new MeCab::Tagger ("");

for (my $n = $m->parseToNode ("今日もしないとね"); $n ; $n = $n->{next}) {
   printf ("%s\t%s\t%d\n",
        $n->{surface},          # 表層
        $n->{feature},          # 現在の品詞
        $n->{cost}              # その形態素までのコスト
        );
}

ちなみに、Amazon Search ですが、英語文章がたくさん入っていると結構解析が苦手。英単語って結構ノイズっぽくって、いろんなところでマッチングされてしまうので、結果として関連性の薄いものがレコメンドされる傾向にあるようです。今後の課題です。時間の空きが余り無いので、ゆっくりとリファクタリングを続けていこうと思います。

あ、あとは書籍以外のレコメンドも弱いですね。なかなか難しいなぁ〜Google AdSense も最近かしこくなってきているように思えます。どうやってるんだろう??

- スポンサーリンク -