4

私は次のような機能を望んでいます:

def findSimilar(string, options):
    ....
    return aString

WhereaStringは渡された文字列に似ていますが、 に存在しoptionsます。この関数を使用して、作業中のおもちゃのアプリケーションからのユーザー入力を正規化しています。レーベンシュタイン距離の使用について読みましたが、Python 標準ライブラリに簡単な解決策があることを期待しているので、ここで質問することにしました。

4

5 に答える 5

9

を使用します。difflib.get_close_matches

get_close_matches(単語, 可能性[, n][, カットオフ])

最適な「十分な」一致のリストを返します。word は近似一致が望まれるシーケンス (通常は文字列) であり、possibility は単語と照合するシーケンスのリスト (通常は文字列のリスト) です。

于 2013-04-18T19:44:41.920 に答える
4

レーベンシュタイン距離を計算します。

http://en.wikipedia.org/wiki/Levenshtein_distance

品質についてはわかりませんが、すでにPythonの実装があります...

于 2013-04-18T18:03:28.150 に答える
4

この投稿をご覧になってもいいと思います。ファジー文字列コンパレータが必要です。

https://stackoverflow.com/questions/682367/good-python-modules-for-fuzzy-string-comparison

于 2013-04-18T18:03:53.967 に答える
1

I would suggest using from fuzzywuzzy Seat Geek. They have a fantastic function called process that does exactly what you are looking for from their website, but adapted to your question:

    string = "new york jets"
    options = ["Atlanta Falcons", "New York Jets", "New York Giants", "Dallas Cowboys"]
    process.extract(string, options, limit=2)
[('New York Jets', 100), ('New York Giants', 78)]
于 2017-03-26T14:14:14.567 に答える
0

質問の説明から、文字列の類似性は必要ありません。入力文字列がリストにあるかどうかを知るだけで済みます。そのためには、代わりにセットを使用し、次のように文字列がセット内にあるかどうかをテストします。

def isStringAcceptable(string, set):
    return string in set

ユーザーが間違った文字列を入力することを許容したい場合は、許容するエラーの種類を決定する必要があります。レビンシュタイン距離のようなものを使用すると、必要なものに対して非常にやり過ぎになる可能性があり、面白い結果が得られる可能性があります。大文字と小文字を確認するだけの場合は、呼び出しstring.lower()て、セット内のすべての文字列が小文字であることを確認してください。おそらく、文字列の類似性メトリックのような手の込んだものは必要ありません。

于 2013-04-18T19:37:21.973 に答える