Вопрос о расстоянии Левенштейна - PullRequest
0 голосов
/ 13 мая 2009

1) Почему мы добавляем 1 в эти строки?

    d[i-1, j] + 1, // deletion 
    d[i, j-1] + 1, // insertion 

Линия

if s[i] = t[j] then cost := 0

        else cost := 1 

следует учитывать удаленные / младшие слова или я что-то упустил?

2) Кроме того, комментарии указывают на удаление и вставку. Прав ли я, полагая, что он проверяет наличие удаленных символов в обоих словах (целые числа j / i представляют длину слов), поскольку более низкое значение будет представлять удаленные символы.

Используемый здесь код (потому что это псевдокод, и у меня нет проблем с языком, этот поток не относится ни к одной языковой категории):

http://www.iterasi.net/openviewer.aspx?sqrlitid=z0cloj7xhk-ce0f72v4cjq

Ответы [ 2 ]

2 голосов
/ 13 мая 2009

Вы читали http://www.merriampark.com/ld.htm?

Вы рассчитываете стоимость преобразования - количество вставок и удалений - необходимое для преобразования одной строки в другую.

Эта «стоимость» преобразования указывает расстояние между двумя строками.

А как насчет бирж? Это алгоритм Дамерау – Левенштейна , который отличается. Включение обменов не сильно улучшает ситуацию.

Суть в том, чтобы создать матрицу между двумя словами и вычислить - столбец за столбцом - «расстояние» от каждой буквы каждого слова до каждой буквы другого слова. Нижний правый угол этой матрицы - это общее расстояние с учетом всех букв.

Вопрос 1)

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

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

Единственный раз, когда это обычно неправильно, это слова с трехбуквенной последовательностью. Редко на английском.

Сравнение строк и столбцов имеет стоимость 0 или 1.

Минимальная сумма «история плюс одно изменение» и фактическая стоимость изменения являются применимой стоимостью.

Вопрос 2)

Переменные i и j не являются длинами чего-либо. Они позиции в матрице сравнения. «Вставка» и «удаление» - это действие, необходимое для преобразования одного слова в другое. Количество действий вставки / удаления - это расстояние между словами.

1 голос
/ 13 мая 2009

1) Эти строки вычисляют расстояние в случае удаления, в случае вставки и значение, в котором используется «стоимость» в случае замены ...

удаление и вставка фактически учитываются как "1" в расчете расстояния, следовательно, + 1.

Мы можем полагать, что произошла замена, только если символы отличаются, следовательно, "cost = 0", если оба символа равны ...

Тогда новым расстоянием будет минимальное расстояние между этими 3 гипотезами, поэтому вы не всегда добавляете 1 ...

2) если я вычислю расстояние между "FooBar" и "FoBaWhothing", у меня будет несколько символов, даже если вторая строка длиннее первой ...

Конечно, если вторая строка короче второй (FooBar -> FoBa), я найду несколько удалений, но не могу заранее знать, где они находятся ...

...