我有一个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比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会产生分数?
我试过关掉自动的垃圾,但它似乎没有影响。
发布于 2018-11-14 10:07:29
如果你看看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)] 如您所见,arctic salmon有10个匹配项,而salmon只有6个匹配项,这给出了2 * 10 / 49 = 0.40816326530612246的速率。
有关ratio()计算的完整解释,请参阅上面的链接。
https://stackoverflow.com/questions/53295448
复制相似问题