Python difflib.SequenceMatcher是否未考虑垃圾参数?
在python difflib库中,SequenceMatcher类的行为是否出人意料,或者我是否误读了假定的行为 为什么在这种情况下,isjunk论点似乎没有任何区别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。这是因为
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不能以这种方式工作,那么如何匹配并忽略一些简单的字符行,比如问题中的示例中的字符行?更具体地说,在计算相似性比率时,是否有内置函数/方法可以忽略某些字符?