我在fuzzywuzzy得到了一个没有期望的好结果。如果中间有一个额外的词,由于levenshtein的差异,分数会更低。
示例:
from fuzzywuzzy import fuzz
score = fuzz.ratio('DANIEL CARTWRIGHT', 'DANIEL WILLIAM CARTWRIGHT')
print(score)
score = fuzz.ratio('DANIEL CARTWRIGHT', 'DAVID CARTWRIGHT')
print(score)
score = fuzz.partial_ratio('DANIEL CARTWRIGHT', 'DANIEL WILLIAM CARTWRIGHT')
print(score)
score = fuzz.partial_ratio('DANIEL CARTWRIGHT', 'DAVID CARTWRIGHT')
print(score)结果: 81 85 71 81
我正在寻找第一双(丹尼尔对丹尼尔威廉)比第二对(丹尼尔对大卫)更好的匹配。
这里有比fuzzywuzzy更好的方法吗?
发布于 2018-08-01 00:16:28
对于您的示例,可以使用token_set_ratio。代码doc表示,它采用令牌与剩余令牌的交集的比率。
from fuzzywuzzy import fuzz
score = fuzz.token_set_ratio('DANIEL CARTWRIGHT', 'DANIEL WILLIAM CARTWRIGHT')
print(score)
score = fuzz.token_set_ratio('DANIEL CARTWRIGHT', 'DAVID CARTWRIGHT')
print(score)结果:
100
85发布于 2021-05-30 02:17:42
在使用FuzzyWuzzy将一个名称列表与另一个名称列表进行比较以识别列表之间的匹配时,我遇到了类似的挑战。FuzzyWuzzy token_set_ratio的得分手不适合我,因为用你的例子,把“丹尼尔·卡特赖特”和“丹尼尔·威廉·卡特赖特”和“丹尼尔·威廉·卡特赖特”(3字中的2对3字的身份匹配)进行比较,都能获得100%的分数。对我来说,三个字的匹配比三个中的两个要高。
最后我用了一种类似于文字的方法。下面的代码中的算法将多个单词名称转换为不同的单词列表(令牌),并对一个列表中的单词与另一个列表中的单词进行匹配计数,并将计数规范化为每个列表中的单词数。因为True =1和False = 0,所以通过测试元素是否在list中的sum()可以很好地工作于count the elements of one list in another list。
所有单词的身份匹配得分为1 (100%)。比较的评分结果如下:
https://stackoverflow.com/questions/51623595
复制相似问题