データベースのファジー検索の概念


13

私はこれについて考え、たとえばユーザーがスペルミスを入力した場合など、データベースをファジー検索する方法に関する解決策を考え出そうとしています。この背後にあるロジックに大きな問題はありますか?それは機能し、以前に行われましたか?

検索するテーブル:

**tblArticles**
Body - Soundex_Body - CharacterCoded_Body

したがって、物理的な表示のために生のテキスト本文を保存します。他の2列は、次の方法で事前計算される検索に使用されます。

Soundex

本文は言葉に分割され、soundexバージョンに変換されます。IE、結果の本文は次のようになります。

H252 B54 C23 E33... etc

したがって、誰かが「恐竜」と入力すると、記事本文には「恐竜」と表示され、これらは両方ともB26と評価されます。次に、検索語のsoundex値に対してLIKEを実行します。

文字コード

IEで文字を素数にマップする文字マッピングを考えると:

h = 2
e = 3
l = 5
o = 7
p = 11
c = 13

help = 2*3*5*11     =   330
hello = 2*3*5*5*7   =   1050
hell = 2*3*5*5      =   150
hlep = 2*5*3*11     =   330
cello = 13*3*5*5*7  =   6825

ユーザーが「hello」と入力するつもりだったが、たとえば「hlelo」のように2つ以上の文字を切り替えた場合、同じ数字に評価されます。生の本文を単語に分割し、すべての単語を素数でエンコードしてデータベースに保存すると、次のようなフィールドが得られます。

330 6825 330 1050... etc

次に、この値を検索して、ミスタイプと一致させることができます。

利点

  • 誤字防止
  • 音声の間違ったつづりに対する保護
  • 英語を母国語としない人に優しい
  • すべての言語で動作します(soundexが動作する場所)

コメントと考え?多層検索の一種。もちろん、戻り値に重みを付けてさらに改善することもできます(つまり、テキスト本文の文字どおりの一致はもっと価値があります)が、これはスペルミスや英語を母国語としない人が検索を行う場合に適したソリューションですか?


これがTrigram Searchとどのように比較されるかを見るのは面白いでしょう。
リッチ

私は...ワードプレスのためにこのようなものを持ってみたい
キットメンケ

ハッシュ関数に素数を使用すると、同一のメソッドを含まない単語の衝突が発生しなくなりますか?少数の高価値の文字を持つ短い単語と同じ値にハッシュされた多数の低価値の文字を持つ長い単語を持つことが可能であるように思われるが、私はあまり多くの数論を知らないそれは...おそらく、実績のある一つの方法または別だ
glenatron

1
@Glen Afaikは素数を一緒に乗算すると常に一意の数値を生成します。ただし、アナグラムは衝突しますが、どれだけの問題があるかはわかりません。それが基本的にアナグラムをすばやく見つけることがポイントです。
トム

@Glen:一意性については、一意の因数分解定理を参照してください。
スティーブンエバーズ

回答:


2

他にも多くの検索アルゴリズムがあります。Smith-Watermanは人間のテキストにとっては優れたものの1つですが、BLASTは(これまでのところ)DNAシーケンスの検索に最適です。のhlep代わりになどのさまざまなスペルミスのテキストが表示された場合help最小編集距離を探しています

SQL Server 2005(およびそれ以降)のCLRでこれらの機能の多くを実装するライブラリについては、ソースフォージプロジェクトSimMetricsを参照してくださいSimMetricsに関するブログ投稿http://staffwww.dcs.shef.ac.uk/people/S.Chapman/simmetrics.html

Soundexが開発されたのは、地域の音声のバリエーションの主な違いが母音のみであるためです。これが母音を放り出す理由です。転置された文字に対処するのは得意ではありません。


2

Apache Solrは、同義語とスペルの修正をサポートしています-ただし、まだ少し荒いですが。

ファジー検索は、Ngramを使用して実装できます。

ポーターステマー:http : //tartarus.org/~martin/PorterStemmer/

http://wordnet.princeton.edu/などの言語データベース

...しかし、XapianやSolrなどのプロジェクトがこれの多くを処理します。

独自の単語検索用語解析/検索エンジンを構築する場合は、生成したトークンまたは用語を、言語検索を実行するように設計された既存のデータベースに配置することをお勧めします。


1

ある文字列を別の文字列に変換するために必要な変更の数をチェックし、2つがどの程度一致したかについて0〜1の数値を返すアドレスについて、しばらく前にそのようなことをしました。

N / North、St / Street、EastMain / MainEastなどのアイテムに高い値を返すため、うまく機能しました。このアイデアは、このCodeProjectリンクから生まれました。


オープンソースに一致するアドレス用に書いたコードはありますか?
Thismatters

@Thismattersコードにアクセスすることはできませんが、回答のリンクからそのコードのロジックが提供されるはずです。基本的にはちょうどそれが他のものに1つの文字列を作るために取るだろうどのように多くの変化を見てみたい、そして少数の変更が近い彼らは
レイチェル

0

名前、人、または場所を照合する場合、同義語リストの方がはるかに効果的です。

Soundexは「Dick == Richard」「Kit == Christopher」または「Ms。== Mrs。」とは一致しません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.