我有一个SequenceMatcher
函数来查找最接近的匹配:
代码:
def seq_match(text, values, min_match=10):
highest = (None, 0)
for v in values:
sm = SequenceMatcher(a=text, b=v, autojunk=False)
ratio = int(sm.quick_ratio() * 100)
print(f'{text} : {v} : {ratio}')
if ratio > min_match and ratio > highest[1]:
highest = v, ratio
return highest
我还有一个数据集:
# (text, value1, value2, value3...): expected_output
test_map = {
# 1
('super delicious cat food', 'decent', 'delicious', 'super delicious'): 'super delicious',
# 2
('salmon: does not contain real salmon', 'chicken', 'salmon', 'arctic salmon'): 'arctic salmon',
}
当#1
数据被正确匹配时,#2
匹配假定较长的字符串artic salmon
比仅salmon
更匹配。
换句话说,我期望salmon
能更好地匹配相等或更大的mathan artic salmon
。你知道吗
以下是所有匹配结果:
# correct
super delicious cat food : decent : 33
super delicious cat food : delicious : 54
super delicious cat food : super delicious : 76
salmon: does not contain real salmon : chicken : 18
salmon: does not contain real salmon : salmon : 28
# incorrect
salmon: does not contain real salmon : arctic salmon : 48
# expected
salmon: does not contain real salmon : arctic salmon : 28 or less
我能强迫SequenceMatcher
在这里表现得更理智些吗?我怎样才能得到我想要的结果?为什么arctic
甚至会产生分数?你知道吗
我试过关闭自动垃圾,但似乎没有效果。你知道吗
如果你看
SequenceMatcher
here的文档您将看到其算法的以下描述:
根据这一定义,
arctic salmon
将获得比salmon
更高的相似性分数是有意义的。为了更好地理解为什么要查看以下代码:
输出:
如您所见,
arctic salmon
有10个匹配项,而salmon
中只有6个匹配项,这使您的匹配率为2 * 10 / 49 = 0.40816326530612246
。有关
ratio()
计算的完整解释,请参见上面的链接。你知道吗相关问题 更多 >
编程相关推荐