"Вы имели в виду?" особенность в Lucene.net

Может кто-нибудь дайте мне знать, как мне реализовать функцию "Вы имели в виду" в Lucene.net?

Спасибо!

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
28
0
15 314
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

AFAIK Lucene поддерживает поиск по близости, что означает, что если вы используете что-то вроде:

поле: перемешивание ~ 0,5

(это знак тильды)

будет соответствовать "строке". float показывает, насколько «терпимым» будет поиск, где 1.0 - точное совпадение, а 0.0 - соответствие всему (вроде).

Однако разные парсеры реализуют это по-разному.

Поиск по близости работает намного медленнее, чем нечеткий поиск (stri *), поэтому используйте его с осторожностью. В вашем случае можно было бы предположить, что, если вы не найдете совпадений при обычном поиске, вы попробуете поиск по близости, чтобы увидеть, что вы найдете, и представите «вы имели в виду» как-то на основе результата.

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

Google "Вы имели в виду?" (возможно; они, конечно, секретные) реализованы путем просмотра их журнала запросов. Посмотрите, не ищут ли вскоре люди, которые искали запрос, который вы обрабатываете, что-то очень похожее; если да, это означает, что они совершили ошибку и поняли, что им следует искать.

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

Есть простое объяснение того, что здесь означает «Возможно, вы имели в виду» norvig.com/spell-correct.html, это очень интересное чтение.

Matt Warren 07.10.2010 01:58
Ответ принят как подходящий

Вам следует заглянуть в модуль Программа проверки орфографии в каталоге contrib. Это порт модуля Программа проверки орфографии Java lucene, поэтому его документация должен быть вам полезен.

(Из javadocs :)

Пример использования:

  import org.apache.lucene.search.spell.SpellChecker;

  SpellChecker spellchecker = new SpellChecker(spellIndexDirectory);
  // To index a field of a user index:
  spellchecker.indexDictionary(new LuceneDictionary(my_lucene_reader, a_field));
  // To index a file containing words:
  spellchecker.indexDictionary(new PlainTextDictionary(new File("myfile.txt")));
  String[] suggestions = spellchecker.suggestSimilar("misspelt", 5);

это правильный ответ, следует принять! именно то, что я искал;)

Andrew Bullock 25.09.2009 02:15

Модуль SpellChecker перемещен: svn.apache.org/repos/asf/lucene/lucene.net/trunk/C%23/contri‌ b /…

Domenic 15.04.2010 20:26

Взгляните на проект кода Google, называемый семантическими векторами. В списках рассылки Lucene ведется приличное количество дискуссий о выполнении таких функций, как то, что вы используете после этого, однако он написан на java.

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

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