Алгоритм Левенштейна: как мне соответствовать этим требованиям к редактированию текста? - PullRequest
3 голосов
/ 27 января 2009

Я использую алгоритм Левенштейна для удовлетворения этих требований:

При нахождении слова из N символов в моей словарной базе данных есть следующие слова для исправления:

Каждое словарное слово из N символов, которое имеет 1 символ разницы с найденным словом. Пример: найденное слово: bearn, словарное слово: bears

Каждое словарное слово из N + 1 символов, которое имеет N символов, равных найденному слову. Пример: найдено слово: медведь, словарь слово: медведи

Каждое словарное слово из N-1 символов, которое имеет N-1 символов, равных найденному слову. Пример: найденное слово: bears, словарное слово: bear

Я использую эту реализацию алгоритма Левенштейна в C ++, чтобы найти, когда слово имеет число Левенштейна 1 (что является числом Левенштейна для всех трех случаев), но тогда как мне выбрать слово для предложения? Я читал про Бойера-Мура-Хорспула и Кнута-Морриса-Пратта, но я не уверен, насколько они могут быть полезны.

#include <string>
#include <vector>
#include <algorithm>

using namespace std;

int levenshtein(const string &s1, const string &s2)
{
   string::size_type N1 = s1.length();
   string::size_type N2 = s2.length();
   string::size_type i, j;
   vector<int> T(N2+1);

   for ( i = 0; i <= N2; i++ )
      T[i] = i;

   for ( i = 0; i < N1; i++ ) {
      T[0] = i+1;
      int corner = i;
      for ( j = 0; j < N2; j++ ) {
         int upper = T[j+1];
         if ( s1[i] == s2[j] )
            T[j+1] = corner;
         else
            T[j+1] = min(T[j], min(upper, corner)) + 1;
         corner = upper;
      }
   }
   return T[N2];
}

Ответы [ 4 ]

6 голосов
/ 27 января 2009

Вы также можете добавить отличную статью Norvig об исправлении орфографии к своему чтению.

Прошло много времени с тех пор, как я прочитал это, но я помню, что оно очень похоже на то, о чем вы пишете.

2 голосов
/ 27 января 2009

Как я уже говорил в другом месте, Бойер-Мур на самом деле не подходит для этого. Поскольку вы хотите искать несколько строк одновременно, алгоритм Ву и Мэнбера должен вам больше понравиться.

Я опубликовал подтверждение концепции C ++ в ответ на другой вопрос . Обратите внимание на предостережения, упомянутые там.

0 голосов
/ 27 января 2009

Если я вас правильно понимаю, то нет правильного ответа на ваш вопрос. Вы определяете до трех предложений для данного слова, используя Левенштейна, - вы должны придумать правило, чтобы решить, какое из них использовать, а какие отфильтровать. Или, может быть, вы должны использовать их все?

Для интереса вас может заинтересовать расширение Дамерау до Левенштейна, где также считается, что два поменявшихся персонажа дают 1, а не 2, что и возвращает Ваниль Левенштейн.

0 голосов
/ 27 января 2009

Зачем ограничивать предложение одним словом, почему бы не включить набор слов? Если вы ограничены одним словом, вы можете упорядочить свои результаты по предварительно рассчитанной частоте использования или как-то еще. Эта частота может обновляться в зависимости от того, что пользователи выбирают из предложения.

Кроме того, в случае, если в исходном слове нет орфографической ошибки, вы можете расставить приоритеты в N + 1, что будет больше похоже на автозаполнение. Во всяком случае, я не думаю, что есть один правильный способ сделать это, может быть, если ваши требования более конкретны, было бы легче сузить.

Кроме того, вам не нужно знать Python для понимания алгоритмов, описанных в статье Норвиг.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...