NLTK редактировать расстояние меньше, чем ожидалось для кортежа - PullRequest
0 голосов
/ 25 августа 2018

При расчете расстояния редактирования nltk, похоже, не учитывает изменения правильно.Например,

edit_distance(('paravati', 'selke', 'vital'), ('paravati', 'selke', 'vital'), transpositions=True)

Возвращает 0, поскольку совпадение строк.

edit_distance(('paravati', 'selke', 'vital'), ('selke', 'paravati', 'vital'), transpositions=True)

Возвращает 1, поскольку транспонирование включено.Еще 2

edit_distance(('paravati', 'selke', 'vital'), ('belke', 'paravati', 'vital'), transpositions=True)

Возвращает 2, потому что 1 балл за транспозиции и 1 за подстановку.

edit_distance(('paravati', 'selke', 'vital'), ('belke', 'zaravati', 'vital'), transpositions=True)

Но когда я изменяю написание второго слова (с p на z), явсе равно получите значение 2. Ожидаемое значение больше 2, потому что теперь изменилось 2 слова.


Другими словами, расстояние этих 2 слов равно 5 и расстояние кортежа, котороесодержит точно те же слова, что и 3. Это не кажется правильным.

from nltk.metrics import edit_distance

edit_distance('vital', 'vataldedd', transpositions=True)

edit_distance(('paravati', 'selke', 'vital'), ('selke', 'zaravatiasdf', 'vataldedd'), transpositions=True)

Ожидаемое расстояние для этого сравнения кортежей 5 или больше.


Обновление:

Я сравнил все строки по отдельности и взял итоговое значение, которое возвращает 10. Как и ожидалось.

s1, s2 = ('paravati', 'selke', 'vital'), ('selke', 'zaravatiasdf', 'vataldedd')

final=list()
for i in s1:
    mylist=list()
    for k in s2:
        mylist.append(edit_distance(i, k, transpositions=True))
    final.append(min(mylist))

sum(final)

Это правильный подход или я что-то упустил?

Ответы [ 2 ]

0 голосов
/ 26 августа 2018

Th edit_distance() функция ожидает строки в качестве ввода.Просто объедините подстроки в каждом кортеже в одну строку.

>>> from nltk.metrics import edit_distance

>>> x, y = ('paravati', 'selke', 'vital'), ('belke', 'zaravati', 'vital')
>>> x, y = " ".join(x), " ".join(y)

>>> x
'paravati selke vital'
>>> y
'belke zaravati vital'

>>> edit_distance(x, y)
13

>>> edit_distance(x, y, transpositions=True)
13
0 голосов
/ 25 августа 2018

Функция edit_distance не поддерживает вычисления кортежей, ожидаемый ввод - пара строк. Из документации:

:param s1, s2: The strings to be analysed
:param transpositions: Whether to allow transposition edits
:type s1: str
:type s2: str

Проблема в том, что функция не проверяет, имеют ли значения тип str, поэтому вы можете передать любой объект, поддерживающий индексацию, например tuple или list. Когда вы передаете пару кортежей в edit_distance, функция рассматривает каждый элемент кортежа как базовый элемент. Вот причина звонка:

d = edit_distance(('paravati', 'selke', 'vital'), ('belke', 'zaravati', 'vital'), transpositions=True)

возвращает 2, потому что есть два разных элемента ('paravati', 'zaravati') и ('selke', 'belke'). Чтобы вычислить общее расстояние редактирования между наборами строк, вы должны обернуть ваш код в функцию, например:

def total_edit_distance(s1, s2):
    final = list()
    for i in s1:
        mylist = list()
        for k in s2:
            mylist.append(edit_distance(i, k, transpositions=True))
        final.append(min(mylist))
    return sum(final)
...