Pythonで文字列が他の文字列と似ている確率をどうやって取得するのですか?
私は0.9(90%を意味する)などの10進数値を取得したいのです。できれば標準のPythonとライブラリで。
例えば.
similar("Apple","Appel") #would have a high prob.
similar("Apple","Mango") #would have a lower prob.
があります。
from difflib import SequenceMatcher
def similar(a, b):
return SequenceMatcher(None, a, b).ratio()
それを使う:
>>> similar("Apple","Appel")
0.8
>>> similar("Apple","Mango")
0.0
多分あなたは文字列間の距離を記述するアルゴリズムを探していると思います。あなたが参照するかもしれないいくつかはここにあります:
Fuzzy Wuzzy
は、Levenshtein距離をpythonで実装した パッケージ です。いくつかのヘルパー関数を使用して、2つの異なる文字列を同一と見なすことができます。例えば:
>>> fuzz.ratio("fuzzy wuzzy was a bear", "wuzzy fuzzy was a bear")
91
>>> fuzz.token_sort_ratio("fuzzy wuzzy was a bear", "wuzzy fuzzy was a bear")
100
次のような関数を作ることができます。
def similar(w1, w2):
w1 = w1 + ' ' * (len(w2) - len(w1))
w2 = w2 + ' ' * (len(w1) - len(w2))
return sum(1 if i == j else 0 for i, j in Zip(w1, w2)) / float(len(w1))
パッケージ distance にレーベンシュタイン距離が含まれます。
import distance
distance.levenshtein("lenvestein", "levenshtein")
# 3
組み込みのSequenceMatcher
は大きな入力ではとても遅くなります、これは diff-match-patch でどのようにできるかです:
from diff_match_patch import diff_match_patch
def compute_similarity_and_diff(text1, text2):
dmp = diff_match_patch()
dmp.Diff_Timeout = 0.0
diff = dmp.diff_main(text1, text2, False)
# similarity
common_text = sum([len(txt) for op, txt in diff if op == 0])
text_length = max(len(text1), len(text2))
sim = common_text / text_length
return sim, diff