it-roy-ru.com

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

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

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

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

ОБНОВЛЕНИЕ: хорошо, как я могу подражать этому без миллионов 'неоплачиваемых пользователей'?

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

Вот объяснение прямо из источника (почти)

Поиск 101!

в мин 22:03

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

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

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

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

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

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

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

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

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

РЕДАКТИРОВАТЬ

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

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

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

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

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

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

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

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

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

356
OscarRyz

Я нашел эту статью некоторое время назад: Как написать корректор орфографии , написанный Peter Norvig = (Директор по исследованиям в Google Inc.).

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

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

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

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

Шаг 2. Проверка слов - поиск слов, похожих на проверенный

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

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

102
Davide Gualano

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

54
Szere Dyeri

Хм ... Я думал, что Google использовал их обширный массив данных (Интернет), чтобы сделать некоторые серьезные НЛП (обработка естественного языка).

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

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

10
Claudiu

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

7
Jim Burger

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

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

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

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

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

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

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

6
eulerfx

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

6
Nicolas Dorier

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

Так,

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

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

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

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

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

4
Geee

Вот лучший ответ, который я нашел , Корректор орфографии, реализованный и описанный директором по исследованиям Google Питером Норвигом.

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

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

4
Aziz Alto

Как предположение ... это может

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

Это может быть что-то от ИИ, например, сеть Хопфилда или сеть обратного распространения, или что-то еще, "идентификация отпечатков пальцев", восстановление поврежденных данных или исправление орфографии, как уже упоминал Давиде ...

3
badbadboy

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

Я думаю, что в наше время это называется mashup :-)

2
Tomas Petricek

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

2
seanb

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

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

2
schonarth

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

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

По умолчанию, средства проверки правописания Lucene сортируют предложения сначала по оценке из расчета расстояния строки, а затем по частоте (если имеется) предложения в индексе.

1
Josep Valls

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

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

1
Jimit Patel

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

Алгоритм

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

  • Создайте приоритетную очередь с помощью компаратора.
  • Создайте дерево поиска Ternay и вставьте все английские слова (из пост Norvig ) вместе с их частотами.
  • Начните обходить TST и для каждого слова, встречающегося в TST, вычислите его расстояние Левенштейна (LD) из input_Word
  • Если LD ≤ 3, поместите его в очередь приоритетов.
  • Наконец извлеките 10 слов из очереди приоритетов и отобразите.
1
amarjeetAnand

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

0
Josef Svoboda