Анализатор StringToken, который выдает стиль поиска Google “Вы имели в виду:” Предложения

StackOverflow https://stackoverflow.com/questions/135777

  •  02-07-2019
  •  | 
  •  

Вопрос

Ищу способ, чтобы:

Возьмите разделенные пробелами токены в строке;верните предложенное слово


т. е.:
Поиск в Google может занять "фонетический перевод текста",
и поверх страницы результатов он показывает "Ты имел в виду:переводчик фонетических слов"

Было бы предпочтительнее решение на любом из языков C * или Java.


Существуют ли какие-либо существующие Открытые библиотеки, которые выполняют такую функциональность?

Или есть способ использовать Google API для запроса предложенного слова?

Это было полезно?

Решение

В своей статье Как написать Корректор орфографии, Питер Норвиг рассказывает о том, как можно было бы реализовать проверку орфографии, подобную Google.Статья содержит 20-строчную реализацию на Python, а также ссылки на несколько переопределений на C, C++, C# и Java.Вот выдержка:

Полные сведения из индустриально-сила заклинаний корректор как в Google, это было бы скорее запутанно , чем поучительно, но я подумал, что по пути домой на самолете, менее чем за страницу кода, я мог бы написать игрушку корректор правописания, который достигает 80 или точность 90% при скорости обработки не менее 10 слов в секунду.

Используя код Норвига и этот текст в качестве тренировочного набора я получаю следующие результаты:

>>> import spellch
>>> [spellch.correct(w) for w in 'fonetic wrd nterpreterr'.split()]
['phonetic', 'word', 'interpreters']

Другие советы

Вы можете воспользоваться веб-сервисом yahoo здесь:http://developer .yahoo.com/search/web/V1/spellingSuggestion.html

Однако это всего лишь веб-сервис...(т.е.нет API для других языков и т.д.), Но он выводит JSON или XML, так что...довольно легко адаптируется к любому языку...

Вы также можете использовать Google API для проверки орфографии.Существует реализация ASP здесь (Впрочем, это не моя заслуга).

Во-первых:

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

startup()
{
   set the spelling engines word suggestion limit to 1
}

option 1()
{
   int currentPosition = engine.NextWord(start the search at word 0, querystring);

   if(currentPosition == -1)
      return empty string; // Query is a-ok.

   while(currentPosition != -1)
   {
       queryString = engine.ReplaceWord(engine.CurrentWord, queryString, the suggestion with index 0);
       currentPosition = engine.NextWord(currentPosition, querystring);
   }

   return queryString;
}

Поскольку никто еще не упоминал об этом, я приведу еще одну фразу для поиска:"изменить расстояние" (например, текст ссылки).Это можно использовать для поиска ближайших совпадений, предполагая, что это опечатки, в которых буквы перенесены, пропущены или добавлены.

Но обычно это также сопровождается какой-то информацией о релевантности;либо по простой популярности (предполагать, что наиболее часто используемое достаточно близкое совпадение, скорее всего, является правильным словом), либо по контекстуальной вероятности (слова, которые следуют за предшествующим правильным словом или идут перед ним).Это влияет на поиск информации;один из способов начать - посмотреть на биграммы и триграммы (последовательности слов, рассматриваемых вместе).У Google есть очень обширные наборы данных для этого в свободном доступе.

Однако для простого начального решения пара словарей с сопоставителями на основе Левенштейна работает на удивление хорошо.

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

Вот пример из Вики, где 2 - расстояние.

String[] l=spellChecker.suggestSimilar("sevanty", 2);
//l[0] = "seventy"

Тот Самый API-интерфейсы поиска Google SOAP сделай это.

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

void match(trie t, char* w, string s, int budget){
  if (budget < 0) return;
  if (*w=='\0') print s;
  foreach (char c, subtrie t1 in t){
    /* try matching or replacing c */
    match(t1, w+1, s+c, (*w==c ? budget : budget-1));
    /* try deleting c */
    match(t1, w, s, budget-1);
  }
  /* try inserting *w */
  match(t, w+1, s + *w, budget-1);
}

Идея заключается в том, что сначала вы вызываете его с нулевым бюджетом и смотрите, печатает ли он что-нибудь.Затем попробуйте использовать бюджет, равный 1, и так далее, пока не будет напечатано несколько совпадений.Чем больше бюджет, тем больше времени это займет.Возможно, вы захотите увеличить бюджет только до 2 долларов.

Добавлено:Нетрудно расширить это для обработки распространенных префиксов и суффиксов.Например, английские префиксы, такие как "un", "anti" и "dis", могут быть в словаре, а затем могут быть связаны обратно с верхней частью словаря.Для таких суффиксов, как "ism", "'s" и "ed", может существовать отдельное дерево, содержащее только суффиксы, и большинство слов могут ссылаться на это дерево суффиксов.Тогда он может обрабатывать странные слова, такие как "антинационализация".

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top