Это происходит потому, что функция ratio
использует длину тотальных последовательностей при расчете коэффициента, но не фильтрует элементы с использованием 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.a
и self.b
являются строки (последовательности) передается объекту SequenceMatcher ("AA" и "А" в вашем примере). Функция isjunk
lambda x: x in ' '
используется только для определения соответствующих блоков. Ваш пример довольно прост, поэтому результирующее соотношение и соответствующие блоки одинаковы для обоих вызовов.
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)]
Те же совпадающих блоков, отношение: 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)]
Теперь соответствующие блоки различны, но отношение будет так как количество совпадений по-прежнему равно:
Когда isjunk
пока None: M = 2, T = 6 => ratio = 2.0 * 2/6
Когда isjunk
являетсяlambda x: x == ' '
: M = 1 + 1, 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=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 => ratio = 2.0 * 3/7