Как Google "Вы имели в виду?" Алгоритм работает?

Я разрабатываю внутренний веб-сайт для инструмента управления портфелем. Существует много текстовых данных, названий компаний и т.д. На меня действительно впечатлили способность поисковых систем очень быстро реагировать на запросы с помощью "Вы имели в виду: xxxx".

Мне нужно уметь разумно выполнять пользовательский запрос и отвечать не только на сырые результаты поиска, но и на "Вы имели в виду?". ответ, когда есть весьма вероятный альтернативный ответ и т.д.

[Я развиваюсь в ASP.NET (VB - не держите его против меня!)]

UPDATE: Хорошо, как я могу имитировать это без миллионов "неоплаченных пользователей"?

  • Создавать опечатки для каждого "известного" или "правильного" термина и выполнять поиск?
  • Какой-то другой более элегантный метод?

Ответ 1

Здесь объяснение непосредственно из источника (почти)

Поиск 101!

при мин. 22:03

Стоит посмотреть!

В основном и в соответствии с Дугласом Меррилом, бывшим техническим директором Google, он выглядит следующим образом:

1) Вы пишете слово с ошибкой в ​​Google

2) Вы не можете найти то, что хотите (не нажимайте на какие-либо результаты)

3) Вы понимаете, что вы ошибочно написали слово, чтобы переписать слово в окне поиска.

4) Вы находите то, что хотите (вы щелкаете по первым ссылкам)

Этот шаблон умножается миллионы раз, показывает, какие наиболее распространенные орфографические ошибки и каковы наиболее "общие" исправления.

Таким образом, Google может почти мгновенно предлагать исправление заклинаний на каждом языке.

Кроме того, это означает, что в ночное время каждый начинает писать ночь, поскольку "нигде" Google предложит это слово вместо этого.

ИЗМЕНИТЬ

@ThomasRutter: Дуглас описывает это как "статистическое обучение машин".

Они знают, кто исправляет запрос, потому что они знают, какой запрос приходит от пользователя (используя файлы cookie)

Если пользователи выполняют запрос, и только 10% пользователей нажимают на результат, а 90% возвращаются и набирают другой запрос (с исправленным словом), и на этот раз 90% нажимают на результат, тогда они знают они нашли исправление.

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

Кроме того, теперь они включают контекст в проверку орфографии, поэтому они могут даже предлагать разные слова в зависимости от контекста.

Смотрите демонстрацию google wave (@44m 06s), которая показывает, как контекст учитывается, чтобы автоматически исправлять орфографию.

Здесь объясняется, как работает обработка естественного языка.

И, наконец, вот потрясающая демонстрация того, что можно сделать, добавив автоматический автоматический машинный перевод (@1h 12m 47s) в микс.

<суб > Я добавил якоря минут и секунд для видео, чтобы перейти непосредственно к контенту, если они не работают, попробуйте перезагрузить страницу или прокрутить ее вручную. Суб >

Ответ 2

Я нашел эту статью некоторое время назад: http://www.norvig.com/spell-correct.html.

Интересно прочитать о теме "исправления правописания". Примеры в Python, но это понятно и просто для понимания, и я думаю, что алгоритм может быть легко переведен на другие языки.

Ниже следует краткое описание алгоритма. Алгоритм состоит из двух этапов, подготовки и проверки слов.

Шаг 1: Подготовка - настройка базы данных слов

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

Шаг 2. Проверка слов - поиск слов, похожих на один из отмеченных

Аналогично, расстояние редактирования мало (обычно 0-1 или 0-2). Расстояние редактирования - это минимальное количество вставок/удалений/изменений/свопов, необходимых для преобразования одного слова в другое.

Выберите самое популярное слово из предыдущего шага и предложите его как исправление (если оно не само слово).

Ответ 3

Для теории алгоритма "вы имели в виду" вы можете обратиться к главе 3 "Введение в информационный поиск". Он доступен online бесплатно. Раздел 3.3 (стр. 52) точно отвечает на ваш вопрос. А для конкретного ответа на ваше обновление вам нужен только словарь слов и ничего другого (включая миллионы пользователей).

Ответ 4

Хм... Я думал, что Google использовал свой обширный корпус данных (интернет), чтобы сделать серьезную NLP (Natural Language Processing).

Например, у них так много данных из всего Интернета, что они могут подсчитать количество раз, когда происходит последовательность из трех слов (называемая триграммой). Поэтому, если они видят предложение типа: "pink frugr concert", они могут видеть, что у него мало хитов, а затем найдите наиболее вероятный "розовый концерт" в их корпусе.

Они, по-видимому, просто делают вариацию того, что говорил Давиде Гуалано, но так определенно прочитали эту ссылку. Разумеется, Google использует все веб-страницы, которые он знает как корпус, что делает его алгоритм особенно эффективным.

Ответ 5

Я предполагаю, что они используют комбинацию алгоритма Levenshtein distance и массы данных, которые они собирают в отношении выполняемых поисков. Они могли бы выполнить набор поисков, которые имеют самое короткое расстояние Левенштейна от введенной строки поиска, а затем выбрать тот, у кого больше всего результатов.

Ответ 6

Обычно корректор орфографии производства использует несколько методологий для предоставления предложения о правописании. Некоторые из них:

  • Определите способ определения необходимости коррекции орфографии. Они могут включать в себя недостаточные результаты, результаты, которые не являются конкретными или точными (в зависимости от определенной меры) и т.д. Затем:

  • Используйте большой текст или словарь, где все или большинство из них, как известно, правильно написаны. Их легко найти в Интернете, в таких местах, как LingPipe. Затем, чтобы определить лучшее предложение, вы ищете слово, которое является самым близким, основанным на нескольких мерах. Наиболее интуитивно понятными являются похожие персонажи. То, что было продемонстрировано в результате исследований и экспериментов, состоит в том, что два или три символа соответствия последовательности работают лучше. (битрамы и триграммы). Для дальнейшего улучшения результатов взвешивайте более высокий балл в матче в начале или в конце слова. По соображениям производительности индексируйте все эти слова в виде триграмм или биграмм, так что, когда вы выполняете поиск, вы конвертируете в n-грамм и просматриваете через хэш-таблицу или trie.

  • Используйте эвристику, связанную с потенциальными ошибками клавиатуры, основанными на местоположении символов. Так что "hwllo" должно быть "привет", потому что "w" близко к "e".

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

  • В каждом случае вы должны выбрать лучшую коррекцию из списка. Это может быть метрика расстояния, такая как levenshtein, метрика клавиатуры и т.д.

  • Для многословной фразы только одно слово может быть написано с ошибкой, и в этом случае вы можете использовать оставшиеся слова в качестве контекста при определении наилучшего соответствия.

Ответ 7

Используйте расстояние Левенштейна, затем создайте метрическое дерево (или тонкое дерево) для индексации слов. Затем запустите запрос 1-ближайшего соседа, и вы получили результат.

Ответ 8

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

Итак,

  • Вам нужен словарь (английский или на основе ваших данных)

  • Создайте слово trellis и вычислите вероятности для переходов, используя ваш словарь.

  • Добавьте декодер, чтобы рассчитать минимальное расстояние ошибки, используя вашу решетку. Конечно, вы должны позаботиться о вставках и удалениях при расчете расстояний. Интересно, что клавиатура QWERTY максимизирует расстояние, если вы нажимаете клавиши близко друг к другу (cae превратит автомобиль, cay превратит кошку).

  • Верните слово с минимальным расстоянием.

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

Ответ 9

Вот лучший ответ, который я нашел, корректор орфографии, реализованный и описанный Google Director Research Peter Norvig.

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

Идея этого алгоритма основана на статистическом обучении машин.

Ответ 10

Как можно предположить... это могло бы 1) поиск слов 2) если он не найден, используйте некоторый алгоритм, чтобы попытаться "угадать" слово. Может быть что-то от ИИ, например, от сети Хопфилда или обратно, или что-то еще "идентифицирует отпечатки пальцев", восстанавливает сломанные данные или исправления орфографии, как уже упоминал Давиде...

Ответ 11

относительно вашего вопроса, как имитировать поведение, не имея тонны данных - почему бы не использовать тонны данных, собираемых Google? Загрузите результаты sarch для google слово с ошибкой и выполните поиск в разделе "Вы имели в виду:" в HTML.

Я предполагаю, что теперь называется mashup: -)

Ответ 12

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

Ответ 13

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

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

Ответ 14

Вы хотите сказать проверку орфографии? Если это проверка орфографии, а не целая фраза, тогда у меня есть ссылка на проверку орфографии, где алгоритм разработан на питоне. Проверьте эту ссылку

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

Ответ 15

Самый простой способ понять это - динамическое программирование Google.

Это алгоритм, который был заимствован из Информационного Извлечения и широко используется в современной биоинформатике, чтобы увидеть, насколько сходны две последовательности генов.

Оптимальное решение использует динамическое программирование и рекурсию.

Это очень решенная проблема с множеством решений. Просто откройте Google, пока не найдете какой-либо открытый исходный код.

Ответ 16

Существует определенная структура данных - тройное дерево поиска, которое, естественно, поддерживает частичные совпадения и ближние соседи.

Ответ 17

Это старый вопрос, и я удивлен, что никто не предлагал OP с помощью Apache Solr.

Apache Solr - это полнотекстовая поисковая система, которая помимо многих других функций также обеспечивает проверку орфографии или запросов. Из документа :

По умолчанию контрольные элементы Lucene Spell сортируют предложения сначала оценка от строкового расчета расстояния и вторая частота (если доступно) предложения в индексе.

Ответ 18

Помимо приведенных выше ответов, если вы хотите быстро реализовать что-то самостоятельно, вот предложение -

Алгоритм

Вы можете найти реализацию и подробную документацию по этому алгоритму на мой проект GitHub.

  • Создайте очередь приоритетов с помощью компаратора.
  • Создайте дерево поиска по трещине и вставьте все английские слова (от сообщение Norvig) вместе со своими частотами.
  • Начните перемещение TST и для каждого слова, встречающегося в TST, вычислите его расстояние Левенштейна (LD) от input_word
  • Если LD & le; 3 затем поместите его в очередь приоритетов.
  • В конце выведите 10 слов из очереди приоритетов и отображения.