Як Google "Ви мали на увазі?" Алгоритм роботи?


436

Я розробляв внутрішній веб-сайт для інструменту управління портфелем. Дуже багато текстових даних, назв компаній тощо. Я був дуже вражений можливістю пошукових систем дуже швидко відповідати на запити "Чи мав ви на увазі: xxxx".

Мені потрібно вміти інтелектуально приймати запит користувача та відповідати не лише непростими результатами пошуку, але й запитом "Ви мали на увазі?" відповідь, коли існує велика ймовірність альтернативної відповіді тощо

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

ОНОВЛЕННЯ: Гаразд, як це можна імітувати без мільйонів "неоплачених користувачів"?

  • Створити друкарські помилки для кожного "відомого" чи "правильного" терміна та виконувати пошук?
  • Якийсь інший більш елегантний метод?

1
Ось версія VB.NET коректора правопису Norvig. Ви можете вважати це корисним, якщо це не пізно!
Ральф Віггум


Я набираю клавіатуру, що не має qwerty (Colemak), і ця функція не наполовину розумніша. Він, безумовно, вчиться на записаних парах виправлення помилок і, таким чином, налаштовується на qwerty. Як правило, звичайні перевіряючі орфограми спрацьовують на моїй клавіатурі - відстань редагування рядків інваріантна.
Полковник Паніка

Відповіді:


366

Ось пояснення безпосередньо з джерела (майже)

Шукати 101!

за хв 22:03

Вартий перегляду!

В основному і за словами Дугласа Меррілла, колишнього центрального директора Google, це так:

1) Ви пишете (неправильно написане) слово в google

2) Ви не знаходите того, що хотіли (не натискайте жодних результатів)

3) Ви розумієте, що ви неправильно написали слово, тому переписали це слово у вікно пошуку.

4) Ви знаходите те, що хочете (натискаєте в перших посиланнях)

Ця закономірність, помножена на мільйони разів, показує, що є найпоширенішими помилками та які найпоширеніші виправлення.

Таким чином Google може практично миттєво запропонувати виправлення орфографії на будь-якій мові.

Також це означає, що якщо протягом ночі всі почнуть писати ніч, оскільки "nigth" google запропонував би це слово замість цього.

EDIT

@ThomasRutter: Дуглас описує це як "статистичне машинне навчання".

Вони знають, хто виправляє запит, тому що вони знають, який запит надходить від користувача (використовуючи файли cookie)

Якщо користувачі виконують запит, і лише 10% користувачів натискають на результат, а 90% повертається назад і вводить інший запит (з виправленим словом), і цього разу 90% натискає на результат, то вони знають, що знайшли виправлення.

Вони також можуть знати, чи це "пов'язані" запити двох різних, оскільки вони мають інформацію про всі посилання, які вони показують.

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

Дивіться цю демонстрацію хвилі Google (@ 44m 06s), яка показує, як контекст враховується для автоматичного виправлення написання.

Тут пояснено, як працює ця обробка природних мов.

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

До відео додані якорі хвилин і секунд, щоб перейти безпосередньо до вмісту, якщо вони не працюють, спробуйте перезавантажити сторінку або прокрутити вручну до позначки.


Як працює алгоритм? Як Google переходить від "Ми отримуємо мільярди пошукових запитів з різними термінами, і це ті пошуки", щоб "цей термін повинен бути поширеною помилкою цього терміна"? Вони вирішили цю проблему, але мене цікавить, як. Як вони вважають, що два пошукові запити у одного користувача, і яке слово є «виправленням» іншого, і як вони об'єднати це протягом мільярдів пошукових запитів?
thomasrutter

51
Якщо всі почали неправильно писати "ніч" ... Я вважаю, що вони вже натрапили на це, коли люди шукали "Flickr".
Макс Лібберт

42
проблема з тим, що хтось щось неправильно написав, вже трапилася в набагато більш серйозному сенсі: Спробуйте ввести "fuscia" в Google. Google каже: "Ви мали на увазі фушію?" Правильний написання насправді - це "фуксія", але ніхто не може його з певних причин правильно прописати. Проблема ще гірша на Dictionary.com; якщо ви введете "fuschia" для їх пошуку, то це дає "Немає результатів для fuschia. Ви мали на увазі" fuschia "?" (тобто ти мав на увазі те, що ти щойно набрав?)
Дейзі Софія Холман

8
Я не вірю, що вони використовують лише помилкові дані - певна відстань Левенштейна чи подібне відбувається - пошук "Плака" (та одне чи більше інших слів), і він завжди виправляється на "чорний", що є дуже малоймовірним неправильним написанням / typo
plusplus

4
@Jakub Я думаю, що вони вирішили проблему, оскільки я зробив цей коментар 4+ років тому. Дійсно, Google також виправив проблему. Пошук фуксії автоматично включає результати для фуксії.
Дейзі Софія Холман

104

Я знайшов цю статтю деякий час тому: Як написати орфографічний коректор , написаний Пітер Норвіг (директор з досліджень Google Inc.).

Це цікаве прочитання на тему "виправлення орфографії". Приклади є в Python, але це зрозуміло і просто, і я думаю, що алгоритм можна легко перекласти на інші мови.

Нижче наведено короткий опис алгоритму. Алгоритм складається з двох етапів, підготовки та перевірки слова.

Крок 1: Підготовка - налаштування бази даних слів

Найкраще, якщо ви можете використовувати фактичні слова пошуку та їх виникнення. Якщо у вас немає, натомість може бути використаний великий набір тексту. Порахуйте кількість (популярність) кожного слова.

Крок 2. Перевірка слів - пошук слів, подібних до перевірених

Аналогічно означає, що відстань редагування є низькою (зазвичай 0-1 або 0-2). Відстань редагування - це мінімальна кількість вставок / видалень / змін / змін, необхідних для перетворення одного слова на інше.

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


6
@Davide: "" "приклади є в python, але це зрозуміло і просто" "": я не розумію вашого використання ", але" ... я б сказав, враховуючи стиль написання Python + Norvig, "чіткий і просто зрозуміти "- очікуваний результат.
Джон Махін

20
"Але" було там, тому що Гаррі у своєму запитанні сказав, що він розробник VB.NET, тому я припустив, що він не впевнений у мові python.
Девіде Гуалано

56

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


10

Хм ... Я думав, що Google використовував їхній величезний корпус даних (в Інтернеті), щоб зробити серйозну NLP (Natural Language Processing).

Наприклад, у них стільки даних з усього Інтернету, що вони можуть підрахувати кількість разів, коли трапляється трислівна послідовність (відома як триграма ). Тож якщо вони побачать речення на кшталт: "рожевий концерт фруг", вони могли б побачити, що в ньому є кілька хітів, то знайдуть найімовірніший "рожевий * концерт" у своєму корпусі.

Вони, мабуть, просто змінюють те, що говорив Девіде Гуалано, хоча, безумовно, прочитайте це посилання. Google, звичайно, використовує всі веб-сторінки, які він знає, як корпус, так що робить його алгоритм особливо ефективним.


7

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


6
Скажімо, у вас зберігається загальна кількість мільярдів веб-сторінок. Немає простого способу індексувати відстань Левенштейна для швидкого пошуку близьких матчів, не обчислюючи відстань Левенштейна в кілька мільярдів разів за кожне запитуване слово. Отже, відстань Левенштейна не дуже корисна в цій ситуації, принаймні, не на першому етапі, коли Google потрібно звузити від мільярдів існуючих слів до тих самих слів, які можуть бути неправильними написаннями поточного слова. Він, безумовно, може застосувати Левенштейна як наступний крок після того, як він вже отримав ймовірні відповідники.
thomasrutter

6

Зазвичай коректор правопису виробництва використовує декілька методологій для надання орфографічних пропозицій. Деякі з них:

  • Визначте спосіб визначити, чи потрібна корекція орфографії. Сюди можуть бути недостатні результати, результати яких недостатньо конкретні або точні (за певною мірою) тощо. Потім:

  • Використовуйте великий текст або словник, де всі, або більшість, як відомо, правильно написані. Їх легко знайти в Інтернеті, в таких місцях, як LingPipe . Потім, щоб визначити найкращу пропозицію, ви шукаєте слово, яке є найбільш відповідним на основі декількох заходів. Найінтуїтивнішим є подібні персонажі. Дослідження та експерименти показали, що послідовність двох чи трьох символів працює краще. (біграми та триграми). Щоб додатково покращити результати, зважте більшу кількість балів на матчі на початку чи в кінці слова. З міркувань продуктивності індексуйте всі ці слова як триграми або біграми, так що, виконуючи пошук, ви перетворюєтесь на n-грам і шукаєте за допомогою хештелю чи трие.

  • Використовуйте евристику, пов’язану з потенційними помилками клавіатури на основі розташування символів. Так що "hwllo" має бути "привіт", оскільки "w" близький до "e".

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

  • У кожному випадку ви повинні вибрати найкращу корекцію зі списку. Це може бути метрика відстані, наприклад, левенштейн, метрика клавіатури тощо.

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



4

Google, мабуть, пропонує запити з найкращими результатами, а не з тими, які написані правильно. Але в цьому випадку, ймовірно, коректор правопису був би більш здійсненним. Звичайно, ви можете зберігати якесь значення для кожного запиту, виходячи з певної метрики того, наскільки хороші результати він повертає.

Тому,

  1. Вам потрібен словник (англійською або на основі ваших даних)

  2. Створіть трелінг слів та обчисліть ймовірності переходів за допомогою свого словника.

  3. Додайте декодер, щоб обчислити мінімальну відстань помилок, використовуючи шпалери. Звичайно, ви повинні подбати про вставки та видалення під час обчислення відстаней. Приємно те, що клавіатура QWERTY максимально збільшує відстань, якщо ви натискаєте клавіші близько одна до одної.

  4. Поверніть слово, яке має мінімальну відстань.

  5. Потім ви можете порівняти це зі своєю базою запитів і перевірити, чи є кращі результати для інших близьких збігів.


4

Ось найкраща відповідь, яку я знайшов , коректор правопису, реалізований та описаний директором з досліджень Google Пітером Норвігом.

Якщо ви хочете прочитати більше про теорію, що стоїть за цим, ви можете прочитати його розділ книги .

Ідея цього алгоритму базується на статистичному машинному навчанні.


3

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


3

Як здогадка ... це могло

  1. пошук слів
  2. якщо його не знайти, скористайтеся деяким алгоритмом, щоб спробувати «відгадати» слово.

Може бути щось із AI, наприклад, мережа Hopfield або зворотної мережі поширення, або щось інше, "ідентифікація відбитків пальців", відновлення зламаних даних або виправлення правопису, як уже говорив Давіде ...


2

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

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


1
Ніхто не сумнівався в тому, що Google має всі необхідні дані для цього, але в цьому питанні було задано детальну інформацію про те, як Google придумав алгоритм зробити це з такою кількістю даних за розумну кількість часу. У них з’являться газильйони пошукових запитів на день - як вони легко ідентифікують, чи є пошуковий термін «виправленням орфографії» іншого, недавнього? Які чинники змушують Google вирішити, що один термін є неправильним написанням іншого? Це деталі щодо впровадження, які могли б зацікавити.
thomasrutter

2

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

Я думаю, це сьогодні називається машхупом :-)


скільки часу, поки Google не зупинить вашого бота від вискоблювання? - чи не побачив Google навіть у ці дні?
Ендрю Гаррі

Я не думаю, що вони помітять, якщо запити / сек не надто високі.
Маурісіо Шеффер

2

Окрім наведених вище відповідей, якщо ви хочете щось реалізувати самостійно швидко, ось вам -

Алгоритм

Ви можете знайти реалізацію та детальну документацію цього алгоритму на GitHub .

  • Створіть пріоритетну чергу за допомогою порівняльника.
  • Створіть пошукове дерево Терна і вставте всі англійські слова (з посту Норвіга ) разом з їх частотами.
  • Почніть проїжджати TST і для кожного слова, що зустрічається в TST, обчисліть відстань Левенштейна ( LD ) від input_word
  • Якщо LD ≤ 3, то поставте його в чергу пріоритетів.
  • На Останньому витягніть 10 слів із черги пріоритетів та відображення.

1

Ви маєте на увазі сказати перевірку орфографії? Якщо це перевірка орфографії, а не ціла фраза, я отримав посилання про перевірку орфографії, де алгоритм розроблений в python. Перевірте це посилання

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


1

Це старе запитання, і я здивований, що ніхто не запропонував ОП використовувати Apache Solr.

Apache Solr - це повнотекстова пошукова система, яка, крім багатьох інших функцій, також забезпечує перевірку орфографії та пропозиції запитів. З документації :

За замовчуванням перевірки правопису «Люцена» сортують пропозиції спочатку за оцінкою з обчислення рядкової відстані та другою за частотою (якщо є) пропозиції в індексі.


0

Існує специфічна структура даних - потрійне дерево пошуку, яка, природно, підтримує часткові збіги та відповідність ближнього сусіда.


-1

Найпростіший спосіб зрозуміти це динамічне програмування Google.

Це алгоритм, запозичений з інформаційного пошуку, який активно використовується в сучасній біоінформатиці, щоб побачити, наскільки схожі дві послідовності генів.

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

Це дуже вирішена проблема з великою кількістю рішень. Просто обведіть Google, поки не знайдете код з відкритим вихідним кодом.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.