令牌排序比率如何工作?

how token sort ratio works?

谁能解释一下 Python 中库 fuzzywuzzy 的这个函数是如何工作的?我知道 Levenshtein 距离是如何工作的,但我不明白比率是如何计算的。

b = fuzz.token_sort_ratio('controlled', 'comparative')

结果是38

编辑距离

您可能已经知道 Levenshtein 距离是将一个序列转换为另一个序列的最小插入/删除/替换量。它可以归一化为 dist / max_dist,其中 max_dist 是给定两个序列长度的可能的最大距离。在 Levenshtein 距离的情况下,这导致归一化 dist / max(len(s1), len(s2))。此外,可以通过反转以下计算归一化相似度:1 - normalized distance.

>>> from rapidfuzz.distance import Levenshtein
>>> Levenshtein.distance('controlled', 'comparative')
8
>>> Levenshtein.similarity('controlled', 'comparative')
3
>>> Levenshtein.normalized_distance('controlled', 'comparative')
0.7272727272727273
>>> Levenshtein.normalized_similarity('controlled', 'comparative')
0.2727272727272727

插入距离

Indel 距离是将一个序列转换为另一个序列的最小插入/删除量。所以它的行为类似于 Levenshtein 距离,但不允许替换。由于任何替换都可以用插入 + 删除替换,因此可以计算例如通过将 Levenshtein 距离中的替换成本修改为 2。可以使用与 Levenshtein 距离类似的方式对 Indel 距离进行归一化,但使用不同的 max_distdist / (len(s1) + len(s2)).

>>> from rapidfuzz.distance import Indel
>>> Indel.distance('controlled', 'comparative')
13
>>> Indel.similarity('controlled', 'comparative')
8
>>> Indel.normalized_distance('controlled', 'comparative')
0.6190476190476191
>>> Indel.normalized_similarity('controlled', 'comparative')
0.38095238095238093

比率

fuzzywuzzy/thefuzz/rapidfuzz中的ratio是归一化的indel相似度缩放到100。

>>> from rapidfuzz.distance import Indel
>>> from rapidfuzz import fuzz
>>> Indel.normalized_similarity('controlled', 'comparative') * 100
38.095238095238095
>>> fuzz.ratio('controlled', 'comparative')
38.095238095238095

fuzzywuzzy/thefuzz 的唯一区别是结果四舍五入:

>>> from fuzzywuzzy import fuzz
>>> fuzz.ratio('controlled', 'comparative')
38

token_sort_ratio

token_sort_ratioratio 的变体,它在比较两个序列中的单词之前对它们进行排序:

s1 = " ".join(sorted(s1.split()))
s2 = " ".join(sorted(s2.split()))
fuzz.ratio(s1, s2)

在您的示例中,token_sort_ratio 将具有与 ratio 相同的结果,因为两个序列都已排序。