Python SequenceMatcher.ratio如何在difflib中工作

Python SequenceMatcher.ratio如何在difflib中工作,python,string,string-matching,similarity,Python,String,String Matching,Similarity,我在试用python的difflib模块时遇到了SequenceMatcher。因此,我尝试了以下示例,但无法理解发生了什么 >>> SequenceMatcher(None,"abc","a").ratio() 0.5 >>> SequenceMatcher(None,"aabc","a").ratio() 0.4 >>> SequenceMatcher(None,"aabc","aa").ratio() 0.6666666666666

我在试用python的difflib模块时遇到了
SequenceMatcher
。因此,我尝试了以下示例,但无法理解发生了什么

>>> SequenceMatcher(None,"abc","a").ratio()
0.5

>>> SequenceMatcher(None,"aabc","a").ratio()
0.4

>>> SequenceMatcher(None,"aabc","aa").ratio()
0.6666666666666666
现在,根据

以范围内的浮点形式返回序列相似性的度量值 [0, 1]. 其中,
T
是两个序列中的元素总数,并且
M
是匹配数,这是
2.0*M/T

因此,对于我的案例:

  • T=4
    M=1
    so比率
    2*1/4=0.5
  • T=5
    M=2
    so比率
    2*2/5=0.8
  • T=6
    M=1
    so比率
    2*1/6.0=0.33
  • 根据我的理解,
    T=len(aabc)+len(a)
    M=2
    ,因为
    a
    aabc
    中出现两次

    那么,我哪里做错了?我错过了什么


    是SequenceMatcher.ratio()的源代码。

    第一个案例是正确的。在第二种情况下,只有来自
    aabc
    的一个
    a
    匹配,因此M=1。在第三个示例中,两个
    a
    s匹配,因此M=2


    [p.S.:您指的是古老的Python 2.4源代码。当前源代码位于。]

    但是为什么
    aabc
    中只有一个
    a
    匹配。我认为它应该与
    a的
    匹配。在第三个示例中,两个
    a的
    匹配,但
    aa
    单独匹配到
    aa
    ,或者它首先匹配到
    a
    ,然后是下一个
    a
    ,使其为M=2。我仍然不清楚。@Noob:因为在第二种情况下,第二个字符串中只有on
    a
    要匹配,而在第三个字符串中有两个,所以只有
    bc
    部分不匹配。尝试将
    a
    aa
    匹配。Matches实际上代表字符匹配。因此字符串“a”只能进行一次匹配,因为它只有一个字符可以创建匹配。“aa”有两个字符,因此提供了两个匹配项。嘿,有没有办法获取匹配项的数量?太晚了,但仍然可以:您可以执行
    T=len(a)+len(b)
    M=T*ratio()/2