1

人の名前の検索を作成する必要があります。ここで素晴らしいコンテンツを既に見ましたが、別のものが必要です。

これが私の要件です。

音声検索を使用しようとしましたが、インデックスを作成する必要がある人の名前が英語以外の名前です。Apache Solr / Lucene によって実装された音声アルゴリズムは、ポルトガル語の単語 (私の文化) には有効ではないと思います。

その後、ngrams を使用して検索することにしました。うまくいくようですが、ユーザーが入力したものがSolrインデックスにどれだけ近いかを比較する必要があります。すべてのドキュメントに単語が存在する回数を使用するため、スコアを使用できませんでした。したがって、比較の結果として、どういうわけか数値 (たとえば、パーセンテージ) を与える必要があります。つまり、ユーザーが入力したものが、solr で持っている本名にどれだけ近いかを示す必要があります。

Ps: この結果をアプリケーションで使用して、ユーザーが入力したものを使用するか、Solr に存在するものを続行します。

サンプル:

ID    NAME
1     James Bond
2     James Bond Junior
3     Tony Mellord

Jhames Bond を使用すると、Ngrams を使用して 1 と 2 の両方が一致します。

PS: シナリオを明確にするために、英語の名前を使用しました。

答えを出す方法はありますか: ユーザーが入力したものは、使用スコアなしでインデックスに登録したものとどのくらい似ていますか? まあ言ってみれば:

Jhames Bond looks like James Bond in 97% (for example)
Jhames Bond looks like James Bond Junior in 87%
4

1 に答える 1

2

クエリの方法に満足していて、パーセンテージを知りたい場合は、後処理ステップとして、レーベンシュタイン距離を使用して、クエリ値とインデックスから返された値を比較できます。

Apache Commons には、レーベンシュタイン距離アルゴリズムの実装があります。StringUtils.getLevenshteinDistance

可能な最大距離は、比較される最長の文字列の長さになるため、パーセンテージを取得するには次のようになります。

1-(StringUtils.getLevenshteinDistance(str1, str2) / Math.max(str1.length(), str2.length()));

Jaro-Winkler Distance ( StringUtils.getJaroWinklerDistance) も使用するのに適したアルゴリズムであり、パーセンテージで表示できるように既に正規化されているため、少し単純です。また、あなたが提供した例の値に近づいているようです。

于 2014-04-02T15:52:59.803 に答える