0

私はビジネスで最も近い単語に対してLevenshteinアルゴリズムを使っていくつかの文字列マッチングを試みています。 (パイソンしかし、言語では大きな違いをすることはありません)複数の単語にまたがる最小レーベンシュタイン距離

クエリの例は、「BNA」 緯度経度&

検索=となり、私が探していた結果近くにあります。

パブは、右の私の希望は、それは私が

二つの異なる方法を試してみました(BNA == BNAとして)最初

を示していることだろうBNAを検索することにより、BNA醸造(株)と呼ばれる緯度と経度であります地理的な距離に基づいてランク付けずに

m = min([editdistance.eval(search, place_split) for place_split in place.name.split(' ') 
        if place_split not in string.punctuation]) 

戻り、タウンセンターでのみ距離レーベンシュタイン

  • コーヒー&ブックス
  • の話 'n' のコーヒー
  • ラガディアン&アンディの

とアカウントの距離を考慮して、

  • シェイパーヘアーサロン&スパ
  • アモラデイスパ
  • をレーベンシュタインために、二次
  • 純粋な審美性とマイクロ顔料着色

そして

m = editdistance.eval(search, place.name) 

最初のものは、距離

  • レーベンシュタイン、地理的な距離に基づいてランク付けすることなく返しKFC
  • MOO
  • & W

と服用しながらアカウント地理的な距離に、

  • & W
  • & W
  • KFC

をレーベンシュタインする二次ですから、どちらの方法は、BNA醸造(株)の近くには何も戻ってきていることがわかります 検索用語がデータベースの場所名の1つと正確に一致したときに、それを返すためにはどのようなロジックを使用する必要がありますか?

答えて

1

Levenshtein distanceは、ある文字列を別の文字列に変換するのに必要な置換、追加および削除の回数をカウントすることを思い出してください。このため、類似した長さの文字列を比較するときには、多くの場合、最小化されます(大量の置換が必要な場合でも、文字を追加または削除する必要はありません)。 2番目の例では、最高の出力がすべて検索文字列(len("bna") == len("A&W"))と同じ長さであることがわかります。

検索文字列が常に1つの単語になる場合、文字列内の各単語の距離を計算するという考え方は、各単語が検索文字列と似ている可能性が高いため、良い方法です。しかし、現在、あなたは大文字と小文字を区別して比較しています。つまり、私があなたが望まないと思っているeditdistance.eval('bna', 'BNA') == 3を意味します。

試してみてください。あなたは大文字小文字を区別しない検索を与える必要があります

m = min([editdistance.eval(search.lower(), place_split.lower()) for place_split in place.name.split(' ') if place_split not in string.punctuation]) 

+0

これは私が逃したものです!結果は現在:BNA Brew CO。、Bia Boro Kelowna、Boa Thongタイ料理レストラン。 ありがとう!私は間違って、大文字と小文字を区別しないと思っていたと思う(editdistanceは低くなるだろう)。これは、私が速く汚れたlevenshteinを書いたときのやり方だからだ。 –

関連する問題