gpt4 book ai didi

python - 不考虑 difflib.SequenceMatcher isjunk 参数?

转载 作者:行者123 更新时间:2023-11-28 19:12:42 25 4
gpt4 key购买 nike

在 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 过滤元素.因此,只要匹配 block 中的匹配数产生相同的值(有和没有 isjunk),比率度量就会相同。

由于性能原因,我假设序列未被 isjunk 过滤。

def ratio(self):   
"""Return a measure of the sequences' similarity (float in [0,1]).

Where T is the total number of elements in both sequences, and
M is the number of matches, this is 2.0*M / T.
"""

matches = sum(triple[-1] for triple in self.get_matching_blocks())
return _calculate_ratio(matches, len(self.a) + len(self.b))

self.aself.b 是传递给 SequenceMatcher 对象的字符串(序列)(在您的示例中为“AA”和“A A”)。 isjunk 函数 lambda x: x in ' ' 仅用于确定匹配 block 。您的示例非常简单,因此两个调用的结果比率和匹配 block 是相同的。

difflib.SequenceMatcher(None, "AA", "A A").get_matching_blocks()
[Match(a=0, b=0, size=1), Match(a=1, b=2, size=1), Match(a=2, b=3, size=0)]

difflib.SequenceMatcher(lambda x: x == ' ', "AA", "A A").get_matching_blocks()
[Match(a=0, b=0, size=1), Match(a=1, b=2, size=1), Match(a=2, b=3, size=0)]

相同的匹配 block ,比例为:M = 2, T = 6 => ratio = 2.0 * 2/6

现在考虑以下示例:

difflib.SequenceMatcher(None, "AA ", "A A").get_matching_blocks()
[Match(a=1, b=0, size=2), Match(a=3, b=3, size=0)]

difflib.SequenceMatcher(lambda x: x == ' ', "AA ", "A A").get_matching_blocks()
[Match(a=0, b=0, size=1), Match(a=1, b=2, size=1), Match(a=3, b=3, size=0)]

现在匹配 block 不同了,但是比例还是一样的,因为匹配的个数还是相等的:

isjunk 为 None 时:M = 2, T = 6 => ratio = 2.0 * 2/6

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

最后,不同数量的匹配:

difflib.SequenceMatcher(None, "AA ", "A A ").get_matching_blocks()
[Match(a=1, b=0, size=2), Match(a=3, b=4, size=0)]

difflib.SequenceMatcher(lambda x: x == ' ', "AA ", "A A ").get_matching_blocks()
[Match(a=0, b=0, size=1), Match(a=1, b=2, size=2), Match(a=3, b=4, size=0)]

匹配次数不同

isjunk 为 None 时:M = 2, T = 7 => ratio = 2.0 * 2/7

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

关于python - 不考虑 difflib.SequenceMatcher isjunk 参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38129357/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com