ищете библиотеку python, которая может выполнять levenshtein / other edit distance на уровне word

#python #levenshtein-distance

#python #levenshtein-distance

Вопрос:

Я видел кучу похожих вопросов на SO / в другом месте, но ни один из ответов не вполне удовлетворяет мои потребности, поэтому я не думаю, что это дублирование.

Кроме того, я полностью знаю, как это реализовать самостоятельно, но я стараюсь не изобретать колесо заново.

Кто-нибудь знает какие-либо пакеты python, которые могут выполнять levenshtein / other edit-distance, сравнивая 2 списка слов (я нашел несколько), но также позволяют указывать ваши собственные затраты на вставку, удаление, замену и транспозиции?

в принципе, я хочу, чтобы вычисленные расстояния были количеством правок слов в предложениях, а не количеством символов, на которые отличаются предложения.

Я пытаюсь заменить пользовательский модуль расширения python, который на самом деле написан на C, используя C API python2. Я мог бы переписать либо на чистом python, либо на cython, но я бы предпочел просто добавить зависимость к проекту. Единственная проблема заключается в том, что этот код позволяет указывать ваши собственные затраты для различных опций, и я пока не нашел пакет, который позволяет это.

Комментарии:

1. Я не вижу разницы, если строки отличаются на n символов, тогда вам нужно изменить / добавить / удалить n символов, чтобы перейти от stringA к stringB. Не могли бы вы указать на подобный случай? Что вы хотите, чего вы не получаете из editops библиотеки python-Levenshtein ?

2. @Nerdrigo я хочу, чтобы стоимость основывалась на операциях на уровне word, а не на символах. в принципе, я хочу, чтобы стоимость не зависела от длины слов. в принципе, я хочу, чтобы lev («начальная горизонтальная скорость», «горизонтальная скорость») был равен 1, а не 8

Ответ №1:

NLTK имеет функцию с именем edit_distance. Он вычисляет расстояние Левенштейна между двумя строками. Но она также хорошо работает со списками строк:

 import nltk

s1 = 'WAKA WAKA QB WTF BBBQ WAKA LOREM IPSUM WAKA'.split()
s2 = 'WAKA OMFG QB WTF WAKA WAKA LOREM IPSUM WAKA'.split()
print(s1)
print(s2)
print(nltk.edit_distance(s1, s2))
  
 ['WAKA', 'WAKA', 'QB', 'WTF', 'BBBQ', 'WAKA', 'LOREM', 'IPSUM', 'WAKA']
['WAKA', 'OMFG', 'QB', 'WTF', 'WAKA', 'WAKA', 'LOREM', 'IPSUM', 'WAKA']

2
  

Комментарии:

1. спасибо. Я нашел несколько пакетов, хотя и не этот, которые могут работать с последовательностью слов, а не только с последовательностью символов, таких как this, но пока ни один из них не позволяет передавать пользовательские затраты для различных операций в качестве параметров.

Ответ №2:

Вот одна библиотека, которая, как говорят, быстрая, и вычисляет различные типы word distance, включая Levenshtein:

https://pypi.org/project/python-Levenshtein/

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