Как я могу приблизить "Вы имели в виду?"без использования гугла? - PullRequest
23 голосов
/ 10 марта 2011

Мне известны дубликаты этого вопроса:

Эти вопросы интересуют, как на самом деле работает алгоритм.Мой вопрос больше похож на: давайте предположим, что Google не существует или, возможно, эта функция не существует, и у нас нет ввода пользователя.Как можно реализовать приблизительную версию этого алгоритма?

Почему это интересно?

Хорошо.Попробуйте набрать " qualfy " в Google, и он скажет вам:

Вы имели в виду: квалифицировать

Достаточно справедливо.Для этого он использует статистическое машинное обучение на данных, собранных миллиардами пользователей.Но теперь попробуйте ввести это: " Trytoreconnectyou " в Google, и он скажет вам:

Возможно, вы имели в виду: Попробуйте восстановить вас

Теперь это более интересная часть.Как Google определяет это?Есть словарь под рукой и угадать наиболее вероятные слова снова с помощью пользовательского ввода?И как это различает слово с ошибкой и предложение?

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

Ответы [ 7 ]

9 голосов
/ 10 марта 2011

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

Второй случай должен быть немного более простым.Вы найдете все действительные слова, которые начинаются со строки («T» недопустимо, «Tr» недопустимо, «Try» - это слово, «Tryt» не является словом и т. Д.), И для каждого действительного слова вы повторяетеалгоритм для оставшейся строки.Это должно быть довольно быстро, если ваш словарь проиндексирован.Если вы найдете результат, в котором вы сможете разложить длинную строку на набор допустимых слов без оставшихся символов, это то, что вы рекомендуете.Конечно, если вы Google, вы, вероятно, модифицируете алгоритм для поиска подстрок, которые достаточно близки к опечаткам реальных слов, и у вас есть логика для обработки случаев, когда строка может быть прочитана несколькими способами с достаточно свободной проверкой орфографии (возможно, с использованиемколичество результатов, чтобы разорвать связь).

7 голосов
/ 12 марта 2011

Изо рта лошади: Как написать корректор орфографии

Интересно то, что вам не нужно куча журналов запросов, чтобы приблизитьсяалгоритм.Вы можете использовать корпус в основном правильного текста (например, кучу книг из Project Gutenberg).

3 голосов
/ 11 марта 2011

Я думаю, что это можно сделать, используя spellchecker вместе с N-grams.

Для Trytoreconnectyou мы сначала проверяем все 1 грамм (все слова из словаря) и находим наиболее близкое совпадение, которое довольно ужасно.Таким образом, мы пробуем 2 грамма (которые можно построить, удаляя пробелы из фраз длины 2), а затем 3 грамма и так далее.Когда мы пробуем 4 грамма, мы обнаруживаем, что есть фраза, которая находится на расстоянии 0 от нашего поискового запроса.Поскольку мы не можем добиться большего успеха, мы возвращаем этот ответ в качестве предложения.

Я знаю, что это очень неэффективно, но пост Питера Норвига здесь ясно указывает на то, что Google использует корректоры заклинаний для создания своих предложений.Поскольку Google обладает огромными возможностями паралеллизации, они могут выполнить эту задачу очень быстро.

2 голосов
/ 15 марта 2011

Наборы данных / инструменты, которые могут быть полезны:

Вы можете использовать WordNet в качестве простого словаря терминов, и вы можете увеличить его с помощью частых терминов, извлеченных из корпуса.

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

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

При любом запросе вы можете использовать приблизительный поиск ближайшего соседа по LSH, описанный Charikar , чтобы найти ближайшего соседа из вашего набора возможных совпадений.

Примечание: ссылки удалены, поскольку я новый пользователь - извините.

2 голосов
/ 11 марта 2011

Впечатляет, как его работу вы можете найти здесь http://alias -i.com / lingpipe-3.9.3 / demos / tutorial / querySpellChecker / read-me.html .

В нескольких словах это компромисс между модификацией запроса (на уровне символа или слова) для увеличения охвата в поисковых документах.Например, «aple» приводит к 2 миллионам документов, но «apple» приводит к 60 миллионам, а модификация - это только один символ, поэтому очевидно, что вы имеете в виду яблоко.

1 голос
/ 12 марта 2011

@ Legend - рассмотрите возможность использования одного из вариантов алгоритма Soundex .У него есть некоторые известные недостатки, но он работает прилично хорошо в большинстве приложений, которым нужно аппроксимировать слова с ошибками.


Редактировать (2011-03-16):

Я вдруг вспомнил другую Soundex-подобный алгоритм, с которым я столкнулся пару лет назад.В этой статье доктора Добба Лоуренс Филипс обсуждает усовершенствования своего алгоритма Metaphone, названного Double Metaphone.

Вы можете найти реализацию этого алгоритма на Python здесь , ибольше реализаций на том же сайте здесь .

Опять же, эти алгоритмы не будут такими же, как те, что использует Google, но для слов на английском языке они должны быть очень близки к вам.Вы также можете проверить страницу википедии для Фонетические алгоритмы для списка других подобных алгоритмов.

0 голосов
/ 10 марта 2011
...