我有一个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_outputtest_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 : 33super delicious cat food : delicious : 54super delicious cat food : super delicious : 76salmon: does not contain real salmon : chicken : 18salmon: does not contain real salmon : salmon : 28# incorrectsalmon: does not contain real salmon : arctic salmon : 48 # expectedsalmon: does not contain real salmon : arctic salmon : 28 or less我可以SequenceMatcher在这里强迫行为更理智吗?我怎样才能得到我想要的结果?为什么arctic还要产生分数?我试过关闭自动垃圾邮件,但它似乎没有影响。
1 回答
FFIVE
TA贡献1797条经验 获得超6个赞
如果你看这里的文档SequenceMatcher
您将看到其算法的以下描述:
The idea is to find the longest contiguous matching subsequence that contains
no “junk” elements
根据这个定义,arctic salmon获得更高的相似度分数是有道理的salmon。
为了更好地理解为什么看下面的代码:
a = 'salmon: does not contain real salmon'
b = 'arctic salmon'
sm = SequenceMatcher(a, b, autojunk=False)
sm.get_matching_blocks()
输出:
[Match(a=1, b=0, size=1),
Match(a=15, b=3, size=1),
Match(a=17, b=5, size=1),
Match(a=29, b=6, size=7),
Match(a=36, b=13, size=0)]
如您所见,有 10 个匹配项可供arctic salmon比较,而salmon其中只有 6个匹配项的比率为2 * 10 / 49 = 0.40816326530612246.
有关ratio()上面链接中计算战利品的完整说明。
添加回答
举报
0/150
提交
取消