2016-06-30 2 views
3

В библиотеке python difflib, является ли поведение класса SequenceMatcher неожиданным, или я неправильно понимаю, что такое предполагаемое поведение?difflib.SequenceMatcher isjunk аргумент не рассматривается?

Почему аргумент 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.

ответ

0

Это происходит потому, что функция 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" и "А" в вашем примере). Функция isjunklambda 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

 Смежные вопросы

  • Нет связанных вопросов^_^