15

私はクイズシステムを作成しています。クイズ作成者が質問バンクに質問を挿入するとき、重複した/非常に類似した質問がないかDBをチェックします。

MySQLのMATCH()... AGAINST()をテストすると、100%類似した文字列に対してテストした場合、得られる最高の関連性は30以上です。

では、関連性は正確には何ですか?マニュアルを引用するには:

関連性の値は、負でない浮動小数点数です。関連性がゼロの場合、類似性がないことを意味します。関連性は、行の単語数、その行の一意の単語数、コレクション内の単語の総数、および特定の単語を含むドキュメント(行)の数に基づいて計算されます。

私の問題は、文字列が重複している場合に関連性の値をテストする方法です。100%重複している場合は、QuestionBankに挿入されないようにします。しかし、それが非常に似ている場合は、クイズメーカーに確認、挿入するかどうかを尋ねます。では、どうすればよいですか?100%同一の文字列の30+はパーセンテージではないので、私は切り株です。

前もって感謝します。

4

3 に答える 3

8

テキスト検索システムの基本的なデータ構造は逆索引です。これは基本的に、ドキュメント コレクションで見つかった単語のリストであり、単語が出現するドキュメントのリストも含まれます。また、単語の出現回数など、各ドキュメントの出現に関するメタデータを含めることもできます。

単語を含むドキュメントは、検索語を照合することで照会できます。関連性を判断するために、コサイン ランキングと呼ばれるヒューリスティックがヒットに対して計算されます。これは、n 個の検索語のそれぞれに対して 1 つのコンポーネントを持つ n 次元ベクトルを構築することによって機能します。必要に応じて、検索語に重みを付けることもできます。このベクトルは、検索語に対応する n 次元空間の点を示します。

各ドキュメントの重み付けされた出現に基づく同様のベクトルは、ベクトルの各軸が各検索語の軸に対応する逆インデックスから構築できます。これらのベクトルの内積を計算すると、それらの間の角度の余弦が得られます。1.0 は cos (0) に相当し、ベクトルが原点から共通の線を占めると仮定します。ベクトルが近づくほど、角度が小さくなり、コサインが 1.0 に近づきます。

検索結果をコサインで並べ替える (またはmgのように優先度キューに入れる) と、最も関連性の高いものが得られます。より巧妙な関連性アルゴリズムは、検索用語の重みをいじる傾向があり、関連性の高い用語を優先して内積を歪めます。

少し掘り下げたい場合は、 BellMoffetによるManaging Gigabytesで、テキスト検索システムの内部アーキテクチャについて説明しています。

于 2008-10-26T14:31:16.510 に答える
5

andygeers は正しい方向に進んでいます。これらの数値は、相互の関係以外に経験的な意味を持たず、「完全一致」かどうかを判断するために単独で使用することはできません。それを自分で決める必要があります。全文検索のランキングの制限はさておき、何を「完全一致」と見なすかという未解決の問題もあります。(実際のテキストのみ、または soundex の一致はカウントされますか? 同義語 (例: "couch" と "sofa") は一致と見なされますか、それとも異なるものと見なされますか? スペルミスを補正する試みを行う必要がありますか? など)。

そのようなチェックを実行する必要がある場合は、全文検索で返された最高ランクのエントリのみを取得し、指定されたストップワードを削除し、空白を正規化し、小文字に変換し、比較を行い、遭遇するまでそのままにしておきますそれをさらに洗練することを求めたケース。余分な作業はそれほど多くありません。アプリケーションで使用している言語を指定すれば、数十行のコードで正規化関数を記述できる人をこのあたりで見つけることができるでしょう。

于 2008-10-26T15:47:28.447 に答える
2

使用しているMySQL関数の詳細はわかりませんが、これらの数値に絶対的な意味はないのではないかと思います.同じ関数によって生成された他の値と比較するように設計されているだけです. 絶対一致を確認するには、テキスト自体を選択して手動で比較できます。

于 2008-10-26T13:11:58.590 に答える