Может кто-нибудь, пожалуйста, дайте мне знать, как мне реализовать функцию "Вы имели в виду" в Lucene.net?
Спасибо!
Может кто-нибудь, пожалуйста, дайте мне знать, как мне реализовать функцию "Вы имели в виду" в Lucene.net?
Спасибо!
Вы должны изучить модуль SpellChecker в каталоге contrib. Это порт Java lucene SpellChecker, поэтому его документация должно быть полезно.
(Из 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);
AFAIK Lucene поддерживает поиск по близости, что означает, что если вы используете что-то вроде:
поле: stirng ~ 0,5
(это знак тильды)
будет соответствовать строке. float - это то, как "толерантен" поиск, где 1.0 - точное совпадение, а 0.0 - все (вроде).
Однако разные парсеры будут реализовывать это по-другому.
Поиск по близости намного медленнее, чем нечеткий поиск (stri *), поэтому используйте его с осторожностью. В вашем случае можно предположить, что если вы не найдете совпадений в обычном поиске, попробуйте поиск по близости, чтобы увидеть, что вы найдете, и представите "как вы имели в виду" на основе результата каким-то образом.
Может быть полезно кэшировать такие виды поиска для очень распространенных ошибок, по соображениям производительности.
Google "Вы имели в виду?" (вероятно, они скрытные, конечно) реализованы путем консультаций с их журналом запросов. Посмотрите, были ли люди, которые искали запрос, который вы обрабатывали, искали что-то очень похожее вскоре; если это так, это означает, что они допустили ошибку и поняли, что они должны искать.
Поскольку у вас, вероятно, нет огромного журнала запросов, вы можете приблизиться к нему. Возьмите запрос, разделите термины, посмотрите, есть ли какие-либо схожие термины в базе данных (на расстоянии редактирования, что угодно); замените свои термины теми близкими условиями и повторите запрос. Если вы получаете больше хитов, это, вероятно, лучший запрос. Предложите это пользователю. (И поскольку у вас уже есть хиты, и большинство людей смотрят только на 2 лучших результата, покажите им их.)
Взгляните на проект кода google под названием semanticvectors. Там приличная дискуссия о списках рассылки Lucene для выполнения функций, таких как то, что вы использовали после ее использования, однако она написана в java.
Вам, вероятно, придется разбирать и использовать некоторые алгоритмы обучения компьютера в ваших журналах поиска, чтобы создать такую функцию!