web-dev-qa-db-ja.com

2つの文字列間の類似度メトリックを探す

Pythonで文字列が他の文字列と似ている確率をどうやって取得するのですか?

私は0.9(90%を意味する)などの10進数値を取得したいのです。できれば標準のPythonとライブラリで。

例えば.

similar("Apple","Appel") #would have a high prob.

similar("Apple","Mango") #would have a lower prob.
219
tenstar

があります。

from difflib import SequenceMatcher

def similar(a, b):
    return SequenceMatcher(None, a, b).ratio()

それを使う:

>>> similar("Apple","Appel")
0.8
>>> similar("Apple","Mango")
0.0
454
Inbar Rose

多分あなたは文字列間の距離を記述するアルゴリズムを探していると思います。あなたが参照するかもしれないいくつかはここにあります:

  1. ハミング距離
  2. レーベンシュタイン距離
  3. ダメロー - レーベンシュタイン距離
  4. ジャロ - ウィンクラー距離
60
hbprotoss

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
24
BLT

次のような関数を作ることができます。

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))
9

パッケージ 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
4
damio