【问题标题】:How to use SequenceMatcher to find similarity between two strings?如何使用 SequenceMatcher 查找两个字符串之间的相似性?
【发布时间】:2011-01-26 07:10:28
【问题描述】:
import difflib

a='abcd'
b='ab123'
seq=difflib.SequenceMatcher(a=a.lower(),b=b.lower())
seq=difflib.SequenceMatcher(a,b)
d=seq.ratio()*100
print d

我使用了上面的代码,但得到的输出是 0.0。我怎样才能得到一个有效的答案?

【问题讨论】:

标签: python difflib


【解决方案1】:

您忘记了 SequenceMatcher 的第一个参数。

>>> import difflib
>>> 
>>> a='abcd'
>>> b='ab123'
>>> seq=difflib.SequenceMatcher(None, a,b)
>>> d=seq.ratio()*100
>>> print d
44.4444444444

http://docs.python.org/library/difflib.html

【讨论】:

  • 嘿,不错的答案,有什么办法可以得到匹配的数量吗?
  • get_matching_blocks()
  • 是的,我得到了所有的字符串,但即使你将 autojunk 设置为 false,它也无法找到所有常见的字符串
  • get_matching_blocks() 字面上将返回匹配块的列表。因此,通过在该列表上执行 len() ,您可以获得匹配数。这不是你想要的吗?这是你要求的。
  • 是的,但是对于更长的字符串,算法会失败
【解决方案2】:

来自文档:

SequenceMatcher 类有这个构造函数:

class difflib.SequenceMatcher(isjunk=None, a='', b='', autojunk=True)

你的代码中的问题是通过这样做

seq=difflib.SequenceMatcher(a,b)

您将a 作为isjunk 的值和b 作为a 的值传递,而为b 保留默认的'' 值。这导致比率为0.0

克服这个问题的一种方法(Lennart 已经提到)是显式传递 None 作为额外的第一个参数,以便为所有关键字参数分配正确的值。

但是我刚刚发现并想提另一个解决方案,它不涉及 isjunk 参数,而是使用 set_seqs() 方法来指定不同的序列。

>>> import difflib
>>> a = 'abcd'
>>> b = 'ab123'
>>> seq = difflib.SequenceMatcher()
>>> seq.set_seqs(a.lower(), b.lower())
>>> d = seq.ratio()*100
>>> print d
44.44444444444444

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-01-26
    • 2021-10-12
    • 2019-04-18
    • 1970-01-01
    • 2015-12-05
    相关资源
    最近更新 更多