首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SequenceMatcher -偏好有序匹配

SequenceMatcher -偏好有序匹配
EN

Stack Overflow用户
提问于 2018-11-14 08:00:46
回答 1查看 230关注 0票数 0

我有一个SequenceMatcher函数来查找最近的匹配,给定如下:

  • 字符串
  • 字符串列表

代码:

代码语言:javascript
复制
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

我还有一个数据集:

代码语言:javascript
复制
# (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 salmonsalmon更匹配。换句话说,我希望salmonartic salmon更好地匹配相等或更大的值。

以下是所有匹配结果:

代码语言:javascript
复制
# 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会产生分数?

我试过关掉自动的垃圾,但它似乎没有影响。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-11-14 10:07:29

如果你看看SequenceMatcher 这里的医生

您将看到对其算法的以下描述:

代码语言:javascript
复制
The idea is to find the longest contiguous matching subsequence that contains   
no “junk” elements  

根据这一定义,arctic salmon将获得比salmon更高的相似性分数,这是有意义的。

要更好地理解为什么看下面的代码:

代码语言:javascript
复制
a = 'salmon: does not contain real salmon'
b = 'arctic salmon'
sm = SequenceMatcher(a, b, autojunk=False)  
sm.get_matching_blocks()

产出:

代码语言:javascript
复制
[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()计算的完整解释,请参阅上面的链接。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53295448

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档