2011-06-26 5 views
0

データベーステーブルには約1000件のレコードがあります。記事のタイトルを格納するために使用されるtitleという列があります。レコードを挿入する前に、そのテーブルに似たタイトルの記事がすでに存在するかどうかを確認する必要があります。もしそうなら、私はスキップします。英語の文章とデータベースに格納された英語文のあいまい一致

この種のファジーマッチングを実行する最も速い方法は何ですか?文中のすべての単語が英語の辞​​書にあると仮定します。文#1の中の単語の70%が文#2で見つけられる場合、それらは一致とみなされます。理想的には、アルゴリズムは、各センテンスの値を事前計算して、その値をデータベースに格納できるようにすることができます。

答えて

1

1000レコードの場合、ダムのことをして、すべてのレコードを繰り返し処理するだけで済みます(文字列が長すぎず、あまりにも多くのクエリでヒットしないと仮定します)。すべてのタイトルをデータベースから取り出し、指定された文字列との距離で並べ替えます(たとえば、このメトリックにはLevenshtein distanceを使用できます)。

おおよその文字列マッチングを行うには、すべての文字列のnグラムを事前計算してデータベースに保存することが理想的です(一部のシステムでは、この機能をネイティブにサポートしています)。これは間違いなく賢明な、より良いパフォーマンスを拡張しますが、それはより多くの仕事を意味するかもしれません:

http://en.wikipedia.org/wiki/N-gram

1

あなたがトークンのフォワード/リバースインデックス上に読むことができます - より高速な検索結果を取得するための値格納。私は個人的に、トークン(キー)の値(ここではタイトル)のハッシュマップを格納するリバースインデックスを優先します。

新しい記事を書くたびに、新しいスタックオーバーフローの質問のように、タイトルのトークンが検索されて、利用可能なすべてのタイトルに対応します。

検索結果を最適化する、つまり検索結果のファジー論理を取得するには、検索対象のトークンの最大出現数でタイトルを並べ替えることができます。たとえば、t1、t2、t3がトークンの「何が」「愛」であり、タイトルが「この愛は何ですか?すべてのトークンマッピングに存在していれば、最上位に配置されます。

これ以上で遊ぶことができます。私はこのアプローチがもっとシンプルで魅力的であることを願っています。

関連する問題