私の問題を説明します:
というデータベース テーブルがありますcountry
。と の 2 つの列がID
ありname
ます。
を検索したい'paris'
が、単語のスペルを間違えた場合: 'pares'
('e'
の代わりに'i'
)、DB から結果が得られません。
検索に役立つ類似の単語をシステムに提案してもらいたい。
そのため、パリ、パレデスなどの類似した単語を含む DB からの提案を行うスクリプトを作成するためのヘルプを探しています。
私の問題を説明します:
というデータベース テーブルがありますcountry
。と の 2 つの列がID
ありname
ます。
を検索したい'paris'
が、単語のスペルを間違えた場合: 'pares'
('e'
の代わりに'i'
)、DB から結果が得られません。
検索に役立つ類似の単語をシステムに提案してもらいたい。
そのため、パリ、パレデスなどの類似した単語を含む DB からの提案を行うスクリプトを作成するためのヘルプを探しています。
PHP では、metaphone
より正確に使用する必要がありますsoundex
。
しかし、問題はデータベースからデータを取得することです。DBについて言及していません。MySQL では、関数を利用できますSOUNDEX
。クエリの where 句を次のように変更するだけです。
...where city = '$input_city'
に
... where soundex(city) = soundex('$input_city')
またはさらに良いことに、SOUNDS LIKE
演算子を次のように使用できます
... where city sounds like '$input_city'
soundexは、その音を表す単語の数値コードを返します。似たような単語は、同じ soundex コードを持ちます。単語とその soundex コードを含む表を作成して、類似した発音の単語を検索することができます。次に、レーベンシュタイン距離を使用してそれらを並べ替えることができます。
より単純なものを探していて、DB クエリのタイプミスを処理したいだけの場合は、次のことができます。
select * from country where city SOUNDS LIKE 'Paris'
それ以外のselect * from country where city='Paris'
基本的に、データベースから結果が得られない場合は、名前の有効な配列に対して類似性をチェックする必要があります。
私の考え:
MySQL を使用している場合は、カンマで区切られた列のリストが指定され、照合する文字列が指定されるMATCH() AGAINST()
ステートメントを使用する必要があります。このステートメントは、一致の関連性 (0 から 1 の間) を返します。これを使用して、行を返すかどうかを決定できます。MATCH()
FULLTEXT
AGAINST()
詳細については、MySQL サイトを参照してください。
編集: 適切な提案は良いアイデアですが、特定のスペルミスは単語の発音を完全に変更するため、その方法を使用すると適切な提案を提供できない場合があります。
PHP の内部メソッドのほとんどは既にカバーされているため、非常に便利な Yahoo Boss Spelling Suggestion Service を参照することもできます -> http://developer.yahoo.com/search/boss/boss_guide/Spelling_Suggest.html