Python difflib.SequenceMatcher是否未考虑垃圾参数?

Python difflib.SequenceMatcher是否未考虑垃圾参数?,python,difflib,sequencematcher,Python,Difflib,Sequencematcher,在python difflib库中,SequenceMatcher类的行为是否出人意料,或者我是否误读了假定的行为 为什么在这种情况下,isjunk论点似乎没有任何区别 difflib.SequenceMatcher(None, "AA", "A A").ratio() return 0.8 difflib.SequenceMatcher(lambda x: x in ' ', "AA", "A A").ratio() returns 0.8 我的理解是,如果省略空格,则比率应为1。这是因为

在python difflib库中,SequenceMatcher类的行为是否出人意料,或者我是否误读了假定的行为

为什么在这种情况下,isjunk论点似乎没有任何区别

difflib.SequenceMatcher(None, "AA", "A A").ratio() return 0.8

difflib.SequenceMatcher(lambda x: x in ' ', "AA", "A A").ratio() returns 0.8

我的理解是,如果省略空格,则比率应为1。

这是因为
ratio
函数在计算比率时使用总序列长度,但它不会使用
isjunk
过滤元素。因此,只要匹配块中的匹配数产生相同的值(有和没有
isjunk
),比率度量值就会相同

我假设由于性能原因,
isjunk
不会过滤序列

def比率(自身):
“”“返回序列相似性的度量值(在[0,1]中浮动)。”。
其中T是两个序列中的元素总数,并且
M是匹配数,这是2.0*M/T。
"""
matches=sum(self.get_matching_blocks()中三元组的三元组[-1])
返回计算比率(匹配项,len(self.a)+len(self.b))
self.a
self.b
是传递给SequenceMatcher对象的字符串(序列)(在示例中为“AA”和“AA”)。“中的
isjunk
函数
lambda x:x仅用于确定匹配块。您的示例非常简单,因此两个调用的结果比率和匹配块是相同的

difflib.SequenceMatcher(None,“AA”,“AA”).get_matching_blocks()
[匹配(a=0,b=0,大小=1),匹配(a=1,b=2,大小=1),匹配(a=2,b=3,大小=0)]
difflib.SequenceMatcher(lambda x:x='',“AA”,“AA”).get_matching_blocks()
[匹配(a=0,b=0,大小=1),匹配(a=1,b=2,大小=1),匹配(a=2,b=3,大小=0)]
相同的匹配块,比率为:
M=2,T=6=>ratio=2.0*2/6

<强>现在考虑下面的例子< /强>:

difflib.SequenceMatcher(None,“AA”,“AA”).get_matching_blocks()
[匹配(a=1,b=0,大小=2),匹配(a=3,b=3,大小=0)]
difflib.SequenceMatcher(lambda x:x='',“AA”,“AA”).get_matching_blocks()
[匹配(a=0,b=0,大小=1),匹配(a=1,b=2,大小=1),匹配(a=3,b=3,大小=0)]
现在,匹配块不同,但比率将相同,因为匹配的数量仍然相等:

isjunk
为无时:
M=2,T=6=>比率=2.0*2/6

isjunk
lambda x:x='
M=1+1,T=6=>比率=2.0*2/6

最后,不同数量的匹配:

difflib.SequenceMatcher(None,“AA”,“AA”).get_matching_blocks()
[匹配(a=1,b=0,大小=2),匹配(a=3,b=4,大小=0)]
difflib.SequenceMatcher(lambda x:x='',“AA”,“AA”).get_matching_blocks()
[匹配(a=0,b=0,大小=1),匹配(a=1,b=2,大小=2),匹配(a=3,b=4,大小=0)]
匹配的数量是不同的

isjunk
为无时:
M=2,T=7=>比率=2.0*2/7


isjunk
lambda x:x='
M=1+2,T=6=>比值=2.0*3/7
时,可以在对字符串排序之前删除字符串中的字符

def withoutJunk(input, chars):
    return input.translate(str.maketrans('', '', chars))

a = withoutJunk('AA', ' ')
b = withoutJunk('A A', ' ')
difflib.SequenceMatcher(None, a, b).ratio()
# -> 1.0

如果isjunk不能以这种方式工作,那么如何匹配并忽略一些简单的字符行,比如问题中的示例中的字符行?更具体地说,在计算相似性比率时,是否有内置函数/方法可以忽略某些字符?