mixi engineer blog

*** 引っ越しました。最新の情報はこちら → https://medium.com/mixi-developers *** ミクシィ・グループで、実際に開発に携わっているエンジニア達が執筆している公式ブログです。様々なサービスの開発や運用を行っていく際に得た技術情報から採用情報まで、有益な情報を幅広く取り扱っています。

検索クエリログからのスペル訂正辞書の自動生成

先月ハワイに行ってきてオルオルな (ハワイ語で '楽しい' という意味) 気分の takahi-i です。最近ログデータの有効活用が話題になっていますが、検索エンジンが出力する検索クエリログを使用してどんなことができるのかについて紹介させていただきます。

検索クエリログ

検索クエリログ (以下検索ログ) は検索エンジンを使用するユーザから発行された検索の履歴を保存したファイルです。検索ログのフォーマットは使用する検索エンジンや Web サーバによって異なります。さらにまた検索ログが含む情報にも差異があることが考えられますが、本稿では検索ログは解析を行う上で重要な三つの要素を含むと仮定します。三つの要素とはユーザ ID (もしくは IP アドレス)、クエリ文、そしてクエリが検索エンジンに処理された時間です。以下検索ログの一例を載せます。
ユーザID クエリ文 クエリ発行時
438904 Suversion 2009-11-21 11:16:12
943849 英語 2009-11-21 12:16:12
34443 Java 2009-11-21 12:16:13
438904 Subversion 2009-11-21 11:16:20
34443 Scala 2009-11-21 12:16:25
84984 ナポレオン 2009-11-21 12:16:26
この検索ログを表す表において、一列目はユーザID を二列目、三列目はそれぞれクエリ文、クエリが発行された時間を表します。たとえば、上記の例の一行目はユーザ 438904 が二千九年十一月二十一日午前十一時十六分十二秒に 'Suversion' というクエリで検索したことを示しています。

検索ログで実現できること

前節で紹介したような検索ログが大量に得られると、スペル(字面)訂正辞書を自動生成することができます。ここでスペル訂正辞書とは、各要素がスペルミスを含む単語と正しいスペルの単語のペアからなる辞書です。以下スペル訂正辞書の一例です。
pthon python
レz−   レザ−
このようなスペル訂正辞書を用いることで、Yahoo! や Google で提供されている did you mean (もしかして) サービスが可能になります。Did you mean サービスとはユーザがスペルミスを含むクエリを発行した際、検索エンジンが正しいスペルの候補となるクエリ単語を提示してくれるサービスです。 例えばユーザが python というクエリを発行するつもりが、間違って pthon というクエリを発行してしまった場合、did you mean サービスは上記の辞書を用いてユーザに 'もしかして python' と正しいスペルを提示してくれます。 とくに日本語はかな漢字変換で多くの間違いが発生し、クエリ単語を書きなおすのに時間がかかるため、 did you mean サービスが有効に働く言語であると言えます。

スペル訂正辞書の生成方法

それではスペル訂正辞書の自動生成方法について考えてみます。単純には同一ユーザから短い時間に連続して二つの検索クエリが発行された場合、ユーザがスペルミスをしてしまい、直後にスペルミスを訂正したクエリを発行した可能性があると考えられます。ただし、二つのクエリが類似した単語でない場合にはスペルミスしたクエリと訂正したクエリのペアではないとして抽出を行わないこととします。

上記検索ログの例で考えてみます。ユーザ 34443 は短い期間 (2009-11-21 12:16:13、2009-11-21 12:16:25) に二つの検索クエリを発行していますが、クエリ文はそれぞれ Java と Scala とお互いの字面が大きく違うのでスペル訂正辞書には追加しません。

これに対して、ユーザ 438904 も二つの検索クエリを短い期間 (2009-11-21 11:16:12、2009-11-21 11:16:20) に発行していて、さらに二つの検索クエリ、Suversion と Subversion は類似した字面となっていますので、Suversion と Subversion ペアをスペル訂正辞書に追加します。

ミクシィの検索ログに適用

今まで述べてきた処理を大量なクエリログに適用すると自動で大規模なスペル訂正辞書が生成できます。実際にミクシィのコミュニティ検索のログデータ一週間分、約三ギガバイトのデータからスペル訂正辞書を生成してみました。以下、抽出されたスペル訂正辞書の要素です。
内藤代助        内藤大助
ファミリーまー後        ファミリーマート
アフリカ像      アフリカ象
今回の紹介した方法では変換ミスのせいで大幅に字面が違ってしまうペアは抽出されません(たとえば、'うただひかう' と '宇多田ヒカル' ペア)。このような変換ミスとその正解ペアを抽出するには、たとえクエリペア間の類似度は低くても、頻繁に出現するペアを抽出したり、文書のヒット件数を考慮するなどの拡張が必要になりそうです。 なおこの実験に使用したプログラム、Oluolu (オルオル) はアップロードしてありますので、使用していただいてフィードバックをいただけると幸いです (Oluolu をインストールするには Java、Ant、Hadoop をインストールする必要があります)。 Hadoop を計算機 四台にインストールして使用した際、三ギガバイトの検索ログを処理するのにかかった時間は二分程度でした。

まとめ

検索ログからスペルチェック訂正辞書の作成方法について紹介させていただき、実験で使用した検索ログマイニングツール、 Oluolu について触れさせていただきました。次回は Oluolu の機能や使い方について紹介できればと考えています。