Расстояние Левенштейна с шифрованием символов?

Я ищу метрику сравнения строк в стиле Левенштейна, которая также будет работать, когда символы в строке перемешаны. Кто-нибудь знает такой показатель? Также было бы здорово, если бы существовал Python-модуль, который мог бы рассчитывать такую ​​метрику. Спасибо!


person Andrew    schedule 04.11.2012    source источник
comment
Как скремблированные-подобные трансверсии пар символов или полностью перемешанные? Если последнее, вам нужно жаккардовое или косинусное сходство   -  person David Robinson    schedule 04.11.2012
comment
@DavidRobinson есть какая-нибудь метрика сходства для преобразования пар символов?   -  person Alok Nayak    schedule 16.05.2015


Ответы (3)


Вы можете попробовать библиотеку difflib или внешнюю библиотеку под названием pylevenshtein.

person Ashwini Chaudhary    schedule 04.11.2012

Подсчитайте количество символов каждого типа (используя HashMap или эквивалент), затем вычтите полученные значения и возьмите абсолютное значение каждого вычитания. Сложите все это вместе, а затем разделите на 2 (потому что вы удвоили каждую разницу).

Пример:

banana
batman

a - 3 , 2 -> |1| -> 1
b - 1 , 1 -> |0| -> 0
m - 0 , 1 -> |-1| -> 1
n - 2 , 1 -> |1| -> 1
t - 0 , 1 -> |-1| -> 1

Следовательно, у вас есть 1+1+1+1 = 4 -> 4/2 = 2

Проверьте: в banana замените одну n на t и одну a на m (2 изменения), и у вас есть буквы в batman

Если строки имеют разную длину, рассчитайте разницу в длине строки, вычтите это число из вашего счетчика разностей (см. выше). Затем разделите на 2 и прибавьте это число обратно.

Пример:

nab
banana

total difference count: 3
3 - 3 = 0 -> 0 / 2 = 0 -> 0 + 3 = 3

Также я бы вообще не использовал Левенштейна здесь, потому что большая часть трудностей с этой проблемой связана с позиционированием, которое вас не волнует.

person durron597    schedule 04.11.2012

Решение для динамического программирования расстояния Левенштейна можно просто отредактировать, чтобы поймать попарное скремблирование, например, для дели, дели и придать этому меньший вес по сравнению с соответствующими заменами, добавлениями или удалениями.

Изменить: этот алгоритм уже существует и называется Расстояние Дамерау-Левенштейна . Поиск по этому алгоритму даст вам пакет Python, который вы можете использовать напрямую.

person Alok Nayak    schedule 16.05.2015