Підхід для створення пропозицій, який я успішно використовував, але ніколи не бачив описаного ніде, - це попередньо обчислити пропозиції (під час створення словника) за допомогою "поганих" хеш-функцій.
Ідея полягає в тому, щоб переглянути типи орфографічних помилок, які люди роблять, і створити хеш-функції, які призначали б неправильне написання того ж відра, що і його правильне написання.
Наприклад, поширеною помилкою є використання неправильного голосного, як-от визначення, а не визначеного . Таким чином, ви проектуєте хеш-функцію, яка розглядає всі голосні як одну і ту ж букву. Простий спосіб зробити це спочатку "нормалізувати" вхідне слово, а потім поставити нормалізований результат за допомогою звичайної хеш-функції. У цьому прикладі нормалізуюча функція може скинути всі голосні, так і definite
стає dfnt
. Потім "нормалізоване" слово хеширується з типовою хеш-функцією.
Вставте всі свої словникові слова в допоміжний індекс (хеш-таблицю) за допомогою цієї спеціальної хеш-функції. Відра в цій таблиці матимуть тривалі списки зіткнень, оскільки хеш-функція "погана", але ці списки зіткнення по суті є попередньо розрахованими пропозиціями.
Тепер, коли ви знайдете неправильно написане слово, ви шукаєте списки зіткнення для відра, на яке вводиться неправильне написання, в допоміжні індекси. Ta da: У вас є список пропозицій! Все, що вам потрібно зробити - це класифікувати слова на ньому.
На практиці вам знадобиться кілька допоміжних індексів з іншими хеш-функціями для обробки інших типів помилок, наприклад, перекладених літер, одинарних / подвійних літер і навіть спрощеного Soundex-подібного для лову фонетичних помилок. На практиці я виявив спрощену вимову, щоб пройти довгий шлях, і по суті застарів деякі з тих, які призначені для пошуку тривіальних помилок.
Отже, тепер ви шукаєте неправильні написання у кожному з допоміжних індексів і з'єднуєте списки зіткнень перед ранжуванням.
Пам'ятайте, що списки зіткнення містять лише слова, які є у словнику. За допомогою підходів, які намагаються створити альтернативні написання (як у статті про Пітера Норвіга), ви можете отримати (десятки) тисяч кандидатів, яких спочатку вам доведеться відфільтрувати до словника. При попередньо обчисленому підході ви отримаєте, можливо, кілька сотень кандидатів, і ви знаєте, що всі вони написані правильно, тому ви можете пропустити прямо до рейтингу.
Оновлення : з тих пір я знайшов опис алгоритму, подібний до цього, FAROO Розподілений пошук . Це все ще обмежений пошук за редагуванням, але це дуже швидко, тому що крок перед розрахунком працює як моя ідея "погані хеш-функції". FAROO просто використовує обмежену концепцію поганої хеш-функції.