"Ты имел ввиду?" особенность в Lucene.net - PullRequest
28 голосов
/ 08 декабря 2008

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

Спасибо!

Ответы [ 4 ]

35 голосов
/ 29 января 2009

Вы должны заглянуть в модуль SpellChecker в каталоге contrib. Это порт модуля Java * Lucne SpellChecker , поэтому его документация должна быть полезной.

(из документов:)

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

  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);
6 голосов
/ 08 декабря 2008

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

поле: stirng ~ 0,5

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

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

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

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

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

1 голос
/ 29 января 2009

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

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

0 голосов
/ 02 апреля 2009

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...