Как реализовать «Возможно, вы имели в виду»?

Possible Duplicate:
How does the Google “Did you mean?” Algorithm work?

Предположим, на вашем сайте уже есть поисковая система. Как вы можете реализовать «Возможно, вы имели в виду: <spell_checked_word>», как это делает Google в некоторых поисковые запросы?

@pek: У меня была такая же мысль некоторое время назад ... Вы думали об использовании HTML-скруббера и использовании Google в качестве источника исправлений?

Ande Turner 03.11.2008 12:53

См. stackoverflow.com/questions/3763640/…

John 23.09.2010 14:56
Тонкая настройка GPT-3 с помощью Anaconda
Тонкая настройка GPT-3 с помощью Anaconda
Зарегистрируйте аккаунт Open ai, а затем получите ключ API ниже.
114
2
27 601
17
Перейти к ответу Данный вопрос помечен как решенный

Ответы 17

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

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

+1 за ссылку на Google API, которая кажется именно тем, что искал спрашивающий, даже если выбранный ответ более подробный и отвечает на «почему» и «как» реализации Google.

dimo414 15.06.2009 11:59

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

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

одна из плохих вещей soundex - это то, что он слишком ориентирован на английский

Javier 22.10.2008 17:19

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

Keith 22.10.2008 19:40

Soundex и "Портер стемминг" (soundex тривиален, не уверен насчет портера).

Информацию (включая реализации на 19 различных языках кодирования) по стеммингу Porter можно найти на tartarus.org/~martin/PorterStemmer/index.html

msanders 03.11.2008 14:24

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

Наиболее распространенный расчет расстояния редактирования. Распространенный способ сделать это - алгоритм Вагнера-Фишера.

Giuliano 14.04.2012 06:50
Ответ принят как подходящий

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

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

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

Soundex - по моему опыту - хрень.

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

http://en.wikipedia.org/wiki/N-gram#Google_use_of_N-gram

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

Michael Paulukonis 09.04.2012 23:34

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

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

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

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

Вы можете посмотреть статью Питера Норвига "Как написать корректор орфографии".

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

Это действительно так. Это помогает им легко учить новые слова - им помогают миллионы.

A. Rex 16.01.2009 10:32

Да, это действительно правильный ответ. Согласно книге «In the Plex», Google ищет случаи, когда кто-то что-то ищет, получает результаты, а затем сразу же немного корректирует свои условия поиска.

Joel Spolsky 21.06.2011 07:21

Доктор Норвиг из Google обрисовал в общих чертах, как это работает; он даже дает реализацию Python из 20 строк:

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

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

Доктор Норвиг также обсуждает «вы имели в виду» в этот отличный разговор. Доктор Норвиг - руководитель исследования в Google - когда его спросили, как реализовано "вы имели в виду", он ответил: авторитетный.

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

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

Доктор Норвиг привел игрушечный пример этой концепции; он не совсем точен, чтобы указать «вы имели в виду» для Интернета. Например: «барак» не производит внушения; «Барак Обама» имеет (поскольку они знают, что «Барак» часто встречается с Обамой, и могут сделать вывод о вероятном исправлении

SquareCog 17.01.2009 01:27

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

jshen 17.07.2009 21:52

Это определенно нечто большее, чем просто проверка орфографии. Во-первых, я видел случаи, когда ни то, что я напечатал, ни предложенная замена не были «словарными словами».

Ryan Lundy 31.03.2010 00:57

@Kyralessa: как вы думаете, их словарь - это статические слова на каком-то языке или динамические, основанные на словах в Интернете и общих поисковых запросах? Не правда ли, это еще не проверка по словарю. В конце концов, доктор Новиг является руководителем отдела исследований в Google. Когда его спрашивают, как реализовано выражение «вы имели в виду», он отвечает авторитетно.

Will 31.03.2010 10:52

Есть кое-что под названием aspell, которое может помочь: http://blog.evanweaver.com/files/doc/fauna/raspell/classes/Aspell.html

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

Вот цитата из реализации Ruby

Usage

Aspell lets you check words and suggest corrections. For example:

  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: Будем

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

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

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

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

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

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

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]

Вы получаете:

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

Почему бы не использовать Google, вы имели в виду в своем коде? Как посмотреть здесь http://narenonit.blogspot.com/2012/08/trick-for-using-googles-did-you-mean.html

Страница больше не найдена ...: '(

Lauro Wolff Valente Sobrinho 01.11.2016 14:35

Другие вопросы по теме