「コンテンツがアプリケーション内に存在していても検索できない場合、果たして本当にコンテンツは存在していると言えるのか?」このような疑問に対して、この記事では、Lucene スタックを活用して、コンテンツ内の重要な内容を見つけ出すためのヒントおよびテクニックを提示し、コンテンツが見つけられるようにするにはどうすればいいかを考察する。
目次
読者の方々が私と同じであれば、子供の頃、ウェブ サイトまたはハードディスク内のテキストおよびデータの検索を向上させる仕事をするようになるなんて思いもしなかったでしょう。さらに言えば、大学に入って計算機工学を専攻しているときでも、そんなことは考えつきもしなかったでしょう。それなのに現実には、コンテンツを検索する必要があるプロジェクトに携わっており、その方法を模索してます。あるいは、既に検索できるようにはなっているものの、テストの結果やプログラミングで培った直感から、もっと優れた検索を実現できると感じてらっしゃるのかもしれません。ひどい場合には、上司、QA 部門、CEO、あるいは、お客様から、検索機能を改善するように求められている方もいらっしゃるでしょう。あれやこれやで、皆様は見つけやすさの問題を抱えていて、どうしたらよいのか分からない状態にあるということです。結局のところ、検索ライブラリーがうまく機能すればよいのですよね?
ルーシッド・イマジネーションの最近のお客様を例にとってみましょう。このお客様は誰でも知っている会社であり、Lucene を使用してオンライン・ストアを構築していました。このオンライン・ストアでは、1 日に何百万もの要求を処理しており、非常に高度な分析を使用して、購入につながった検索のコンバージョンを追跡していました。残念なことに、ベストセラー製品の 1 つ (ここでは、「ウィジェット X」と呼ぶことにします) に、見つけやすさの問題が生じていました。ユーザーが検索ボックスに「ウィジェット X」と入力すると、ウィジェット X に関係するあらゆる項目が表示されるのですが、ウィジェット X 自体が表示されるのは検索結果の 12 ページ目だったのです。言うまでもなく、ウィジェット X は他の流通経路でベストセラーであるため、これはかなりの利益を失っていることを意味しました。分析を行い、再現率の向上に関する私の記事のヒントをいくつか試した後に、ウィジェット X の検索対象の主フィールドの 1 つが空になっていることが分かりました。この問題をデータ入力システムまで追跡して修正を施し、次のサイト更新時にこの問題を解決しました。これで、ウィジェット X の問題は解決しました。
データベースなどのほとんどのツールは、非構造化コンテンツの検索に対応していることになっていますが、ほとんどのツールは問題に対して画一的な手法を使用するため、検索結果で問題が生じます。実際、Lucene のような検索ライブラリーはデフォルトのままでかなりの機能を実現しますが、検索機能をさらに向上させるために開発者および対象分野の専門家ができることもたくさんあります。
まず、既存のプロジェクトを修正するのではなく、新規プロジェクトを開始する場合には幸運です。優れた要件の収集、設計および仕様作成は、時代が変わっても大事なスッテプです。そのため、時間をかけてコンテンツ検索方法の計画を立てれば、確実に成功することができます。もちろん、一から開始しなくても、少し手間がかかるかもしれませんが、ここで説明するほとんどのテクニックはうまくいくでしょう。
特定のテクニックに触れる前に、理想的な検索エンジンについて考えて見ましょう。もちろん、本当は、検索 エンジンと呼ぶべきではありませんね。結局は、探し出してくれる エンジンです。言い換えれば、何らかの説明を入力する (または将来的には話す) と、魔法のようなエンジンが、探していたまさにそのものを瞬時に見つけてくれるということです。検索対象は、単語、文、段落、文書、一連の文書全体のどれか分かりません。理想的なエンジンでは、検索結果のすべての項目が検索に関連していて、関連した文書を見落とすことがないということが重要です。さらに、理想的なエンジンでは、構造やその欠落を考えることなく、あらゆる種類のコンテンツをシームレスに検索できます。理想的なエンジンは、高速でコンテンツを処理し、データ構造を構築して、すべてのユーザーのすべての検索ニーズを満たします。
注意
情報検索 (IR) の分野では、この魔法のエンジンの適合率と再現率はともに 100% ということになります。適合率と再現率の定義については、用語集を参照してください。
これは優れたエンジンです。このエンジンが存在すればどんなにすばらしいことでしょう。実際は、データの全容を把握できるエンジンは存在しません。さらに、非常に単純なアプリケーションでも、ユーザーが検索できるようにデータを把握して総合的に処理することさえできません。そのため、できる限り短期間でコンテンツをできる限り詳しく把握するための計画を練る必要があります。
新しいコンテンツを使用して新しいアプリケーションを作成しはじめるときには、以下の節で説明するように、コレクション(訳注:検索で探し出したい文書・情報の集まりのこと)をトップダウン方式で入念に調べます。ただし、このプロセスは、見返りがどんどん小さくなっていくタイプのものです。すぐにたくさんのことが分かりますが、だんだんと分かることは減っていきます。そうなった段階で、アプリケーション開発を先に進める必要があります。また、ユーザー (次節を参照) およびシステムの目標を常に意識してください。
収集時には、私は、コンテンツの集約的な情報を確保することに努めます。以下のような情報です。
-
コンテンツの場所。ウェブ上にあるのか、ファイルシステム上にあるのか、データベース上にあるのか、それともその他の場所にあるのか?
-
コレクション内の生の項目 (つまり、ファイル、行など) の数。ここで「生」と言ったのは、項目と検索エンジンに記録されるものとの間に 1 対 1 の対応があるとは必ずしも言えないからです。
-
該当する場合には、MIME タイプ。一般的な MIME タイプには、Microsoft Office™、Adobe PDF™ ファイル、HTML、XML などがあります。ファイルが XML などのマークアップ言語である場合は、DTD、XML スキーマ、またはファイル構造を記述したそれに類するものがないかも調べます。分からない場合には、Tika を使用して MIME タイプを判別できます。
-
コンテンツ内の言語。言語が分からない場合には、ウェブで言語判別ソフトウェアを探してください。(日本語訳追記:ベイシス・テクノロジーの言語判別製品もご検討ください。)
-
該当する場合には、コンテンツの文字コード。ファイルの先頭部分をサンプルとして使用して、文字コードを判別できるツールがあります。(日本語訳追記:、ベイシス・テクノロジーの言語判別製品は、文字コードと言語を同時に判別します。)
-
コレクションの更新頻度。既存のシステムで処理できるドキュメント数以上のドキュメントを処理したい場合には、トレードオフを考慮する必要があります。
-
求められる応答時間。ここでも、高度なテクニックにあまりにも時間がかかりすぎる場合には、トレードオフを考慮する必要があります。
-
平均文書長、合計用語数、最頻出用語 (および句) などの有益な統計情報。
-
辞書、シソーラスなどの関連リソース。
-
文書間に論理的な関係があるかどうか。例えば、インターネット検索エンジンでは多くの場合、文書間のリンク構造を利用します。
-
コレクションの内容を他のユーザーが簡単に把握できるようにするいくつかのキーワードをコレクション全体に割り当てることができるかどうか。例えば、アイスホッケー選手に関するウェブ・サイトの場合、「スポーツ、アイスホッケー、選手、チーム」というようになります。時間があれば、Apache Mahout のようなツールを使用してコレクションをクラスター化し、関連コンテンツを検索することもあります。
統計処理により、コレクションの概要を調べる場合には、多くの場合、エラーや障害の克服にあまり手間をかけないで、コンテンツに対して最初の反復を実行することが可能です。Lucene を直接使用する場合でもたいていは、非常に単純なスキーマを使用して、文書を Solr に送信します。これにより、テキストの基本的分析を実行し、ファイル名や主キーに基づいた単純な固有 ID を持ついくつかのフィールドにあらゆるものを入れます。文書が PDF や Word などの一般的なファイル・フォーマットである場合は、まず Tika で実行して、索引付けのためのテキストおよびメタデータを抽出します。このプロセスでは、索引付けが失敗するファイルがないかを調べて、そのようなファイルが存在した場合には、別途詳しく調査します。この索引付けの終了後には、次節で説明するように、Luke で索引を開いて文書レベルで調査します。
コレクションを全体として評価した後には通常、文書の一部をサンプルとして抜き出して綿密に調査します。ディレクトリー・ビューでリストされている最初の数ファイルだけを見るということはしないでください。それではコレクションの十分なサンプルにはならない可能性があります。確認するファイルの数についての決まったルールはありませんが、恐らく平均で 30 から 50 文書ぐらいになります。各文書で以下を調べます。
-
タイトル、ヘッダー、価格、要約、表、リスト、および画像などの構造。一部のアプリケーションでは、段落、文、節、および章の情報も有益です。
-
作者、ページ数、要約などの重要なメタデータ。
-
文書の重要性に関するヒント、およびそれをアルゴリズムで特定する方法。例えば、HTML 文書には、重要なページを判別するために使用できるリンクが含まれています。また、E メール・アプリケーションでは、会社のアドレス帳を使用して、E メールで記載された人の役職を判別できるかもしれません。それにより、CEO からの社内連絡などを新入社員の E メールよりも優先することができます。なお、「把握する」だけでは十分ではなく、プログラムできる必要があります。重要性を判別した後には、索引付けの際に文書のランキングを調整できます。
-
単語/トークンの識別方法。ホワイトスペース(訳注:空白、タブ、改行文字等の総称)で分割できるのか、それとも句読点に対応した何か別のものが必要か? ほとんどの場合、あまり難しく考えなくても単語がどのようなものかは明らかです。
-
専門用語、シノニム(訳注:原義は類義語)、頭字語、短縮語、句、代名詞、場所などの重要な単語。これらの単語が存在する場合 (当然存在しますが)、その取得方法が存在するかどうか。取得する価値があるかどうか。
-
目に留まったものや普通ではないように見えるものすべて。普通ではないものはたいてい、コンテンツでの初期のパスでエラーにつながります。空のフィールド、変な文字、閉じられていないタグなどがその例です。
ここまでの作業で、コンテンツの概要を十分把握できたはずです。高度な自然言語処理 (NLP) テクニックを使用したシステムを実装する場合には、単語、文、および段落の各レベルでさらに詳細に調査して、品詞、文法構造、およびその他の類似情報について考えることもあります。ただし、ここではユーザーをプロセスで考慮する方法に進みたいと思います。
ユーザーは、時に破壊的な操作をしますが、敵ではありません。システムを過負荷状態に陥らせ、説明も読みません。ほとんどのユーザーは、自分が期待したとおりに動作しない場合、その理由をきいてくれません。端的に言うと、ユーザーの期待に応えないと、ユーザーは別のサービスに切り替えてしまいます。ユーザーの立場に立って、その期待を理解することが、こうしたすべての問題を解決する唯一の方法です。
議論のため、ユーザーの把握という場合、ユーザーがユーザー・インターフェース (UI) とどのように対話するかではなく、ユーザーがどのように検索するかに焦点を絞ります。だからといって、ユーザー・インターフェースが重要でないわけではありません。単に著者が UI の専門家ではないというだけです。幸いなことに、検索に最適な UI を理解させてくれる専門家はたくさんいます。また、ユーザー・インターフェースとユーザがどのように検索するのか。の 2 つは密接に関係しているということを覚えておいてください。恐らく、両トピックはお互いを深め合う関係にあり、何度か行き来することになるでしょう。
ユーザーの把握では、まずユーザーの検索技術のレベルを評価します。平均的なインターネットの検索者 (以下、「一般的な検索者」) は、司書や情報分析官のような十分な訓練を受けた情報作業者とはまったく異なる期待を抱いています。一般的な検索者を対象とする場合、UI およびクエリー構文の選択の多くは、Google や Yahoo! によって既に用意されており、単純なテキストボックスと基本的なクエリー構文に基づいたものになります。一般的な検索で新しい構文や異なるタイプの入力メカニズムを導入する場合には、新しい機能を利用できるようにユーザーを訓練するためにかかる手間を考慮する必要があります。一方、検索の専門家は多くの場合、優れた検索結果が得られることを示した場合、新しい機能を喜んで学習します。たいてい、単純な入力ボックスと高度検索に切り替えるオプションを用意するのが最適です。専門家ユーザーでさえ、多くの簡単なタスクでは単純性を好みます。
いくつか有益なヒントを以下に挙げます。
-
ベータ版と表示することを恐れず、ユーザーが試用できるようにしてください。必ず詳細なログを生成して、ユーザーの対話を追跡し、うまくいったものといかなかったものについてのフィードバックを受けてください。
-
既存のシステムをアップグレードする場合には、システム・ログ内の情報、特にクエリー入力と検索結果でのクリックスルーを必ず活用してください。
-
フォーカス・グループおよび A/B テスト (あるユーザー・グループに 1 つのインターフェースを表示し、別のグループに別のインターフェースを表示) は、最適なインターフェースを判別するのに役に立ちます。実験することを恐れないでください。
ここで、ユーザーがシステムとどのように対話するのかを考えてみましょう。入力側では、主な質問は、サポートするクエリー構文および許可するオプションを中心に展開します。例えば、単純なキーワード入力と句のみを許可するシステムもあれば、段落全体やブール・ロジックを許可するシステムもあります。オプションについては、コレクション、日付、場所、またはその他のコンテンツ内に存在する属性によって、ユーザーが検索結果を制限できるようにすることを検討します。また、ソート順を指定できるようにすることも考えます。
出力側では、恐らく、関連性または日付などのその他の基準でソートされた検索結果のリストを返します。また、ファセット、抜粋、スペルのサジェスチョン、ハイライト、関連検索などの機能も見つけやすさ性向上に役に立ちます。見つけやすさとは、常に検索のみを意味するわけではなく、多くの場合、検索結果をナビゲートすることも意味するということに注意してください。Solr や Lucene のようなツールには、高度なナビゲーション機能も用意されています。
明らかに、ユーザーの把握についてはまだまだ言及できることがたくさんあります。読者の皆様には、文献を掘り下げたり、成功しているサイトの検索を参照して、ご自分のサイトでも活用できることを確認したりすることをお勧めします。
よく見過ごされますが、「クリーンな」データの価値を過小評価しないでください。データベースおよび純粋なテキストを処理する際にも当てはまりますが、Microsoft Word や Adobe PDF などの一般的なオフィス文書を処理する際には特に当てはまります。例えば、ほとんどの科学論文の標準スタイルでは段組が使用されますが、抽出プログラムの多くは段組を適切に処理しないため、文が段組を超えてつながっているかのようになっているコンテンツを返します。他にも、形式が正しくないファイル、OCR で抽出されたスキャン・テキスト、言語混合テキスト、識別子の不足などの問題があります。これらの問題のほとんどは、プロセスのかなり初期段階で捕捉されますが、OCR データや言語混合テキストなどの一部の問題では、解決するために少し余分に時間が必要になるか、少なくとも回避策が必要になります。
幸運な場合は、不適切なデータのコストは、文書エラーという形で索引付け時に表れます (このエラーは適切に回復できます)。しかし、エラーにならずにプロセスが終了して、検索結果が不適切になったり、検索結果がなくなったりする場合もあります。このような場合には、ログを監視して、適合性テスト を忠実に実行し、正しくない文書を追跡および修正するしかありません。
最後に、コンピューター・フォレンジックなどの一部のフィールドでは、データの処理は元々困難です。このような状況では、できることを最大限実行して、寄せ集めのデータから価値を引き出せればと、代替アプローチを辛抱強く試行します。どのような場合でも、状況を改善できる分析およびクエリーのテクニックが存在します。次に続く3つの節では、見つけやすさを向上させる多くの一般的な IR テクニックの概要を説明します。
長年にわたって、検索プロセスで Lucene が「解析」(analysis)と呼んでいるものの役割に関する多くの研究がなされてきました。学術機関では、基本的出力、大/小文字の区別、句および固有表現などの抽出の使用、N グラム、その他の多くのテクニックに関して研究を行ってきました。これらのテクニックについては簡潔に説明します。これらのテクニックの中には、検索を大幅に改善するものもあれば、ほとんどのユーザーが気づくことのない非常に小さな改善をひねり出すものもあります。本当に役立つものに焦点を合わせたいと思いますが、状況によって異なることも理解しています。すべてのテクニックがすべての状況で役立つわけではありません。実際、悪影響を及ぼす場合もあります。
要約すると、Lucene では解析は、入力文字列をトークンに変換するプロセスです。トークンはその後索引付けされて検索可能な状態にされます。例えば、解析は以下の文の変換を行います。
The quick red fox jumped over the lazy brown dogs.
この文を以下のトークンに分割します。
Lucene (なお、Solr も Lucene の解析プロセスを共有します) での解析の選択は、システムが返す検索結果の精度に非常に大きな影響を与えます。また、他の画一的なシステムとは異なり、Lucene では必要に応じてプロセスを直接制御できます。
ヒント
Lucene での解析 (アナライザー、トークナイザー、トークン・フィルター) の仕組みの詳細については、Lucene 入門に関する私の記事を参照してください。
以下に示す表で、長年の研究によって、全体的に検索を改善することが示されている、多くの一般的なテクニックについて詳しく説明します。
表 1. 一般的な解析テクニックおよびトレードオフ
| 名前 | 説明 | 長所 | 短所 | Lucene/Solr での実装 |
|---|---|---|---|---|
| 大/小文字の変換 | すべての文字をそれに相当する小文字 (または大文字) に変換します。 | ユーザーは多くの場合、正しい大文字表記を知りません。また、多くの言語では、文の最初の単語の先頭文字を大文字化しますが、その単語も一致する必要があります。 | 完全一致が妨げられ、大/小文字が意味を持つ頭字語などの単語と、それに相当する単語との区別がつかなくなる可能性があります。 |
|
| インテリジェントな停止語処理 | 多くの場合停止語を削除しますが、停止語を索引付けして検索時にインテリジェントに使用すると、検索結果を強化できます。基本的に、句を構成するために停止語を保持しますが、それ以外のときにはドロップします。 | キーワード検索で余分なノイズを発生させずに、句の一致を向上させることができます。停止語が索引付け時にドロップされないため、情報が損失しません。 | ディスク・スペースの節約になりません。Lucene および Solr のデフォルトではない QueryParser が必要になります。 | 停止語を削除するアナライザーは以下のとおりです。
|
| 基本形出力 | 元の単語を基本形に変換します。例えば、複数形や接尾辞の削除は、一般的な基本形出力テクニックです。詳細については、stemming を参照してください。 | 「bank」を検索したユーザーは、「banks」が含まれた文書にも関心がある可能性は高いといえます。 | 単語の基本形が、元の単語にあまり関係していない場合があります。これは、単語を接頭辞、接中辞、および接尾辞から構築するアラビア語などの言語によく当てはまります (アラビア語は膠着語です)。また、基本形出力により、完全一致が妨げられます。 | Lucene の基本形出力機能の限定的なリストを以下に挙げます。
|
| インテリジェントな複合語解析 | 複合語、ハイフンで結ばれた単語などの「結合された」単語をより小さなトークンに分割します。例えば、「iPod」は「i」と「pod」に、製品 SKU 「XJ-7543」は「XJ」と「7543」に分割することができます。 | ユーザーは単語の形成の仕組みを正しく知らない場合があるため、正しい句読点やスペースを入れないことがあります。 | 余分な処理により、誤って一致してしまう可能性があります。 | Solr では、WordDelimiterFilter で単語の分割に関する数多くのオプションを用意しています。 |
| トークンの正規化 | トークンの単一の一般形式を作成します。例えば、アクセント記号などの付加記号が使用される言語では、一般的に、それらの記号を単語から取り除きます。 | ユーザーは多くの場合、正しい形式を知りません。また、キーボードで簡単にそうした記号付きの文字を入力できません。 | 特定のマークアップでそうした用語を明示的に検索した場合に、誤った一致が生じる可能性があります。 |
|
| 句の判別 | 句を別々のトークンとしてマークおよび索引付け/検索します。 | ランキング調整して、多くの場合より一致するようにできます。 | コストが増大する可能性がある余分な処理が必要になります。 | PhraseQuery および SpanNearQuery を使用して句を作成できますが、現在、Lucene には、テキスト内の句を自動的に判別する機能は付属していません。句のようなトークンの作成については、N グラムを参照してください。 |
| N グラム | あるものの列の n 個の項目の部分列。文字単位であったり、トークン単位であったりします。例えば、「Lucene」の文字単位のバイグラムは、「Lu」、「uc」、「ce」、「ne」です。 | ノイズの多いデータや単語の文節処理にホワイトスペースを使用しない中国語などの言語でよく使用されます。トークン・ベースの N グラムは擬似句の作成のために使用できます。また、スペルチェックや言語の判別にも役立ちます。 | 余分な処理ステップがかかります。n の選定方法が分かりません。 |
|
| シノニム拡張 | あるトークに対して、1 つ以上のシノニムをトークン・ストリームに追加します。また、頭字語や短縮語の拡張にも使用します。 | 言語には同じことを述べる方法が複数ありますが、ユーザーは通常、知っている単語のみを入力します。 | 余分な処理が必要になります。多くのシノニムは、元の単語とはまったく同じであるわけではないため、曖昧性の問題が生じることがあります。 |
|
| 固有表現認識などの抽出テクニック | 代名詞 (人名、地名、会社など) およびその他の関心項目 (通貨など) を識別します。 | 句の識別と似ていますが、ランキング調整によって重要性を示すことができます。 | 余分な処理が必要になります。ユーザーが単語または句の代名詞の意味に関心がない場合、誤った一致が生じる可能性があります。 |
Taming Text には、OpenNLP で Lucene および Solr にフックするためのコードが用意されています。これは時期がくれば無料で公開される予定です。 (日本語訳追記)ベイシス・テクノロジーのRosette™固有表現抽出は、統計的手段で固有名詞等を抽出できます。 |
これらのテクニックのいくつかを単一および複数のフィールドで使用するのが、一般的です。例えば、あるフィールドを小文字にして基本形出力し、別のフィールドは小文字に変換するだけで、さらに別のフィールドはトークン分割するだけといったようになります。
より良いクエリーを構築する方法の説明に進む前に、基本形出力はもう少し説明する必要のある重要な解析テクニックであるため、基本形出力について少々詳しく説明します。
一般的な解析テクニックおよびトレードオフで説明したように、基本形出力は、単語を基本形に変換するプロセスです。基本形出力機能は多くの場合、計算言語学者などの対象言語における単語の形成の仕組みを深く理解している人が作成します。ただし、基礎的な基本形出力機能は、言語の実用的な知識があれば、かなり簡単に作成できます。
実際、軽量のものから非常にアグレッシブなものまで、基本形出力にはさまざまなアプローチがあります。軽量基本形出力機能は、非常に明らかな接尾辞のみを取り除きます。例えば、「banks」から「s」を取り除きます。アグレッシブな基本形出力機能は、接頭辞、接中辞、および接尾辞を取り除きます。また、基本形出力の結果では、実際の単語を生成する必要もないことに注意してください。例えば、上述の例では、単語「lazy」は、「lazi」として基本形出力されています。
ほとんどの解析処理と同様に、基本形出力には、検索時にスピードと品質の両面でコストがかかります。スピード面では、一部の基本形出力機能は複雑なルール・セットを使用して正しい基本形を判別するため、大規模コレクションでは大きな計算コストが生じます。品質面では、基本形出力は一般的に再現率を改善しますが、適合率が低下する可能性があります (背景知識については、Kraaij を参照してください)。適合率の低下は、アグレッシブな基本形出力機能を使用している場合により高い頻度で発生します。非常に関連性の低い (そのためユーザーによって関連性がないと判断される) 2 つの単語が同じ用語になってしまうためです。これは、同じ基本形から多くの単語が形成されるアラビア語でよくある現象です (Larkey を参照)。
そのため、質問は「どの基本形出力機能を選択するのか?」というものになります。ほとんどの場合、ニュース、ウェブ、E メール、その他のコミュニケーションなどの非構造化テキストを処理する際には、基本形出力機能を使用します。製品名などについては、基本形出力機能は恐らく意味をなしません。最近のトレンドでは、造語の製品名を使用するため、特に顕著です。基本形出力機能の決定後には、Krovetz Stemmer などの軽量のものから始めることをお勧めします。軽量の基本形出力機能は、複数形の除去などの単純な処理を行います。その後、関連性テスト で再現率が低いと分かった場合に、Lucene に付属の Snowball 基本形出力機能 (作者の名前から「Porter」基本形出力機能とよく呼ばれます) などのよりアグレッシブな基本形出力機能を試します。
最後に、ここで説明した基本形出力やその他の解析テクニックが必要な場合もあれば必要ではない場合もあります。他人の例や推奨に基づいた「デフォルト」ではなく、必ずご使用の アプリケーションのニーズに基づいて、十分な知識を得た上で意思決定してください。ここでも、実験することを恐れないでください。ではそろそろ、より良いクエリーを作成するためのヒントの説明に進みましょう。
ここまで、コンテンツ面に焦点を合わせてきましたが、見つけやすさについて考える際には、クエリーの作成方法について検討することも同じくらい重要です。クエリーの面では、少なくとも 2 つのタイプのクエリーについて説明する必要があります。ユーザーが入力するクエリーとシステムに実行依頼される実際のクエリーです。それというのも、ほとんどのシステムでは通常、システムのデフォルト、ユーザーが選択したオプション、および元のクエリーの構文解析結果に基づいて、ユーザーのクエリーを変更するからです。ユーザー・レベルで検索結果を向上させるには、教育と誘導が重要です。単純な例および価値の高い資料を用意することで、サポートされる構文についてユーザーを教育してください。サジェスチョンなどのツールや入力を処理する方法から推測を行うオプションを用意することで、より良いクエリーを実行依頼するように促してください。
残念なことに、ユーザーの教育と誘導ではこの程度までしかできません。関連性を向上させるには、以下の推奨事項の 1 つ以上を採用することを検討してください。
-
Lucene Query Parser を使用している場合には、ほとんどのクエリーのデフォルトの演算子を「AND」に変更します。これによってあまりにも多くのクエリーの検索結果が 0 件になる場合には、まず AND クエリーを実行してから、OR クエリーで譲歩するようにします。あるいは、用語数が決められた数よりも少ない場合にのみ AND を使用し、それ以外の場合は OR を使用します。
-
スロッピー句検索を試してみてください。(訳注: sloppy は、ぞんざい、いい加減という意味。)Lucene の Query Parser 構文では、これはチルダ演算子(「~」)の使用を意味します。例えば、「"Minnesota Vikings"~10」のように使います。「スロッピー」因子は、項と項の間にあっても構わない余分なトークンの数を示します。トークンが近ければ近いほど、スコアは高くなります。そのため、本当にスロッピーな句のクエリーは、AND クエリーと同様に機能しますが、用語間の距離が近い文書のランクは上がります。
-
Solr の Dismax Query Parser を使用している場合には、句のランキング調整、関数クエリー、およびフィールドのランキング調整に関連した、多くの使用可能なオプションを必ず確認してください。
-
クエリー量が多い (1 秒当たり百以上のクエリー数) 状況にない場合には、自動関連性フィードバックの使用を検討してください。背景知識として、関連性フィードバックは、Lucene の「More Like This」(類似検索) 機能と同様のものであり、関連性の有無についてユーザーからのフィードバックを使用し、ユーザーが選択した文書内の最も重要な用語から新しいクエリーを構築して、その新しいクエリーから検索結果を返します。自動関連性フィードバックは、ユーザーの入力を介在させずに、最初の 5 から 10 の文書 (通常設定可能) の関連性が高いと仮定して、それらの文書の上位用語を使用し、新しいクエリーを構築します。新しいクエリーが実行依頼されて、検索結果がユーザーに返されます。ユーザーは、1 つではなく 2 つのクエリーが実行されたことには気づきません。ほとんどの検索エンジンでは、最初の 5 から 10 の文書の検索結果が優れているため、関連性のフィードバックはほぼ常に効果的です。マイナス面は、1 回の入力ごとに 2 つのクエリーを実行するということと、元の結果セットから上位の文書をロードして処理する必要があることです。ただし、前述のとおり、スループットが絶対的に重要ではない場合は、多くの場合コストをかける価値があります。
-
Lucene の SpanQuery 機能を使用した位置ベースの一致を検討してください。SpanQuery を使用することで、一致を含む文書の特定の部分に焦点を合わせることができます。この機能は、クエリー用語が遠くに離れている大規模文書で特に役立ちます。
-
重要なフィールドまたは用語を判別して、そのフィールドまたは用語をランキング調整してください。
-
解析時に特定の単語がより重要であると判別できる場合には、ペイロード (Term を使用した場合に使用可能なバイト配列) を使ってその用語にマークを付けることができます。その後、クエリー実行時に、BoostingTermQuery を使用して、ペイロードにある用語を含む文書をランキング調整できます。
-
ユーザーがキーワードを検索ボックスに入力したからといって、実際にシステムに対して検索を実行する必要はありません。結果セット全体をキャッシュして、ログ分析や人気度などに基づいて変更しても、問題ありません。当然、共通のクエリーに対して特定の文書が最高の結果であることが分かっている場合は、その文書を最高の結果にします。文書が検索結果で 3 位ではなく 2 位の位置にある理由について考えて時間を無駄にしないでください。そうではなく、あなたまたはチームが上位 10 位に入っているべきであると考えているのにもかかわらず、10 位や 20 位より下位の位置になっている文書について時間を費やしてください。詳細については、私の関連性に関する記事を参照してください。
もちろん、ここまでで説明した解析テクニックの多くは、コンテンツのみに固有のものではありません。一般的に、解析プロセスは、索引付けと検索で同じものである必要があるため、アプリケーションの作成時にはそのことを念頭に置いてください。次に、表示とナビゲーションに関する考え方について簡単に説明してから、結論と関連資料を示して記事を締めくくります。
ここまで、解析からクエリーの構築に至るまで、たくさんのことを説明しました。見つけやすさという難しいジグソーパズルの最後の大きなピースは、ナビゲーションです。ナビゲーションを強化する方法はたくさんありますが、ここでは Solr および Lucene を使用してできることに焦点を絞ります。
近年、多くのオンライン・ストアでファセット処理が注目を集めています。ファセット処理は、結果セット・データから求めた制限された選択肢セットをユーザーに用意するというテクニックです。ユーザーは、この選択肢セットからクエリーを絞り込むことができます。ここで重要なことは、すべての選択肢で有効な検索結果が得られるということです。ファセット処理された表示では多くの場合、各ファセット内の文書数も示されます。例えば、CNet Shopper (Solr ベース) のサイトでは、ファセット処理を広く使用しています。一例として、ファセット処理の例を参照してください。当然、固有表現や句などの解析時に抽出した有益な情報はすべて、優れたファセットに結びつきます。現在、Solr でのファセット処理はデフォルトのままでも使用できますが、Lucene でカスタマイズすることもできます。ファセット処理の詳細については、Yonik Seeley の記事を参照してください。
ファセット処理に加えて、数は大分減りますが、他の集約テクニックもよく使用されます。文書と検索結果のクラスタリングはともに適切な状況では役立ちます。たくさんの関連文書を単一のクラスターにまとめて、代表的な結果を選択できます。Solr では、Carrot2 クラスタリング・プロジェクト (検索結果ベース) のサポートを追加する準備段階の (つまり、コミットされていない) 作業が進行しています。また、Apache Mahout で、多くのクラスタリング・アルゴリズムを利用できます。詳細については、SOLR-769 を参照してください。
その他の有益なナビゲーション・テクニックには、「More Like This」(類似検索)、代替ソート・オプション、フィルタリング・オプション、「もしかして」(サジェスチョン) 機能などがあります。「More Like This」では、ユーザーは一致性の高い文書を選択して、その文書に類似した文書を求めることができます。「もしかして」(サジェスチョン) 機能では、コレクション内で頻度がより高い用語のスペリングのサジェスチョンを提供することで、多くの場合、ユーザーはより良い検索結果を得ることができます。ソートについては、新しい文書順に表示したい場合もあれば、まだ表示していない文書を先に表示したい場合もあるでしょう。同様に、ユーザーがフィルタリング情報 (日付、価格範囲、作者など) を指定することで前もって結果セットを制限できれば、返す結果セットの数を減らすことができるため、閲覧しやすくなります。最後に、ハイライト機能を使用することで、少なくとも、文書内のクエリーに関連した部分にユーザーの目を直接引き付けることができます。
もっと深いレベル、つまり専門家レベルについてはここまであまり触れてきませんでしたが、Lucene の Similarity クラスをカスタム設定でオーバーライドすることもできます。特に、Lucene で全体として検索結果で短い文書または長い文書が優先される傾向が見られた場合に、長さの正規化係数を変更できます。さらに、独自のスコアリング機能を備えた自作の Query クラスを実装することもできます。実際、Lucene のクエリー・クラスの多くはユーザーが作成したものです。コントリビュートすることもぜひ考えてください。自作のクラスを作成する場合には、Lucene のソースを確認して、進め方の例を調べてください。また、適切なメーリング・リストでどんどん質問してください。
最後に、検索ではほとんどのものがそうですが、見つけやすさも、一度完成させれば放置してよいものではありません。検索アプリケーションの定期的なチェックをスケジュールに入れて、期待どおりのパフォーマンスを発揮しているかを確認することをお勧めします。多くの場合、新しい文書が追加されて索引が増大するにつれて、検索結果に影響するコレクション統計が変化して、以前とは異なる結果が生成されるようになるため、アプリケーションをチューニングする必要が生じることがあります。
この記事では、Lucene と Solr を使用してコンテンツの見つけやすさを強化する方法に関する多くのトピックについて触れました。コンテンツ、ユーザー、および解析プロセスをより深く把握するための方法についても述べました。さらに、より良いクエリーを作成するためのヒントおよびテクニックについても触れました。この記事が、まずは検索可能性を高める方法を深く考えて、それから Lucene と Solr でその方法を活用する方法を考えることで、より優れた検索システムの作成方法について理解する一助となれば幸いです。最後に、この記事の末尾に記載したアドレスに、アプリケーションの関連性を向上させた方法についてのコメントを気兼ねなくお送りください。
以下の資料により、見つけやすさおよび Lucene と Solr を活用してアプリケーションを向上させる方法の詳細を学習できます。
-
見つけやすさの Wikipedia の定義を参照してください。
-
見つけやすさの概念の詳細については、Peter Morville による www.findability.org を参照してください。
-
起こり得る関連性の問題の詳細については、私の記事「Debugging Relevance Issues in Search」を参照してください。
-
Lucene および Solr ベースの検索アプリケーションを強化するためのその他のテクニックおよびライブラリーについては、私の著書「Taming Text」(共著者: Tom Morton) を参照してください。
-
Andrzej Bialecki 作の便利な Lucene ユーティリティー Luke を活用してください。
-
ルーシッド・イマジネーションの用語集の用語の定義を参照してください。
-
クラスタリングなどの便利な機械学習ツールについては、Apache Mahout を使用してください。
-
Lucene の基本を学習してください。
-
ルーシッド・イマジネーションの最適化された Krovetz Stemmer を使用してください (ダウンロード)。
-
MIME タイプの識別および抽出については、Apache Tika を使用してください。Tika の使用に関する Sami Siren の記事も参照してください。
-
句の識別や固有表現の認識などの高度な NLP 機能を実行する場合には、OpenNLP を使用してください。
-
膠着語は、小さな単語単位 (形態素) から幅広く単語を形成する言語です。膠着語の検索時には、アグレッシブな基本形出力では、ノイズが多くなることがあります。
-
ファセット処理の詳細については、Yonik Seeley の記事(日本語訳)を参照してください。
-
Solr における実験段階のクラスタリングのサポートについては、SOLR-769 を参照してください。
-
Kraaij et al. Viewing stemming as recall enhancement. Proceedings of the 19th annual international ACM SIGIR … (1996)
-
Larkey et al. Improving stemming for Arabic information retrieval: light stemming and co-occurrence analysis. … on Research and development in information retrieval (2002)
日本語訳著作権 © 2010 Basis Technology Corp. 原文著作権 © 2010 Lucid Imagination. All Right Reserved.
