Ответ 1

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

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

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

Soundex - по моему опыту - это дерьмо.

Фактически эффективное хранение и поиск большого словаря слов с орфографической ошибкой и вторичное извлечение снова нетривиальны, лучше всего использовать существующие полнотекстовые индексирующие и поисковые механизмы (т.е. не вашу базу данных), из которых Lucene в настоящее время является одним из лучших и случайно портирован на многие платформы.

Ответ 2

Google Д-р Norvig изложил, как это работает; он даже дает реализацию Python в 20-ми строках:

http://googlesystem.blogspot.com/2007/04/simplified-version-of-googles-spell.html

http://www.norvig.com/spell-correct.html

Д-р Norvig также обсуждает "вы имели в виду" в этот отличный разговор. Д-р Norvig возглавляет исследование в Google - когда его спрашивают, как "вы имели в виду", он отвечает, авторитарный.

Итак, его проверка орфографии, предположительно, с помощью динамического словаря, построенного из других поисков или даже фактических интернет-фраз и т.д. Но это все еще проверка орфографии.

SOUNDEX и другие догадки не заглядывают, люди!

Ответ 3

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

Ответ 4

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

Как упоминалось в предыдущем сообщении, Google (и Microsoft и Yahoo!) не используют какой-либо предопределенный словарь и не используют полчища лингвистов, которые размышляют над возможными ошибками запросов. Это было бы невозможно из-за масштаба проблемы, но также и потому, что не ясно, что люди действительно могут правильно идентифицировать, когда и если запрос опечатан.

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

Этот простой алгоритм отлично подходит для многих типов запросов. Если вы хотите перейти на следующий уровень, я предлагаю вам прочитать статью Microsoft Research по этому вопросу. Вы можете найти здесь

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

Ответ 5

Я бы предложил посмотреть SOUNDEX, чтобы найти похожие слова в вашей базе данных.

Вы также можете получить доступ к собственному словарю Google с помощью запроса на правописание Google API.

Ответ 7

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

Ответ 9

Я думаю, это зависит от того, насколько велик ваш сайт. В нашей локальной интранете, которая используется примерно 500 сотрудниками, я просто просматриваю поисковые фразы, которые возвращают нулевые результаты и вводят эту поисковую фразу с новой предлагаемой фразой поиска в таблицу SQL.

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

Вы также можете посмотреть мой ответ на аналогичный вопрос:

Ответ 10

Если у вас есть отраслевые переводы, вам, вероятно, понадобится тезаурус. Например, я работал в ювелирной промышленности, и в наших описаниях было сокращенно, например, kt - karat, rd - round, cwt - carat weight... Endeca (поисковая система на этой работе) имеет тезаурус, который будет переводиться с обычного орфографических ошибок, но для этого требуется ручное вмешательство.

Ответ 12

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

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

Ответ 13

Soundex и "Porter stemming" (soundex тривиально, не уверен в том, что происходит с портером).

Ответ 14

Там что-то называется aspell, которое могло бы помочь: http://blog.evanweaver.com/files/doc/fauna/raspell/classes/Aspell.html

Там есть рубиновый камень, но я не знаю, как с ним поговорить с python http://blog.evanweaver.com/files/doc/fauna/raspell/files/README.html

Здесь цитата из реализации ruby ​​

Использование

Aspell позволяет вам проверять слова и предлагать исправления. Например:

  string = "my haert wil go on"

  string.gsub(/[\w\']+/) do |word|
    if !speller.check(word)
      # word is wrong
      puts "Possible correction for #{word}:"
      puts speller.suggest(word).first
    end
  end

Выводится:

Возможная коррекция для haert: сердце Возможная коррекция для wil: Будет ли

Ответ 15

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

Ответ 16

U может использовать ngram для сравнения: http://en.wikipedia.org/wiki/N-gram

Использование модуля python ngram: http://packages.python.org/ngram/index.html

import ngram

G2 = ngram.NGram([  "iis7 configure ftp 7.5",
                    "ubunto configre 8.5",
                    "mac configure ftp"])

print "String", "\t", "Similarity"
for i in G2.search("iis7 configurftp 7.5", threshold=0.1):
    print i[1], "\t", i[0]

U получаем:

>>> 
String  Similarity
0.76    "iis7 configure ftp 7.5"    
0.24    "mac configure ftp"
0.19    "ubunto configre 8.5"