Мое требование - получить оценку соответствия при поиске по нечеткой фразе. Пример
1) Входные данные - Привет, Сэм, как дела? Спасибо, Смит.
- Проиндексированный документ - Сэм Смит (в документах всегда указываются имена лиц / организаций, а входными данными будут данные в виде произвольного текста)
В приведенном выше случае и Сэм, и Смит нашли в моих входных данных, но контекстуально оба являются разными людьми. Если бы мои входные данные были бы «Привет, Сэм, Смит», тогда я должен был бы получить соответствующий результат с более высоким баллом (также я ожидаю, что балл ОК для «Привет, Сэм Джон Смит» и так далее).
Я использую Lucene здесь для первичной фильтрации, а позже буду обрабатывать согласованные документы с входными данными и определять оценку соответствия (используя levenshtein), и это также должно работать для нечетких.
Точный подход,
1) Индексируйте документы как триграммы
2) Поиск входных данных с произвольным текстом с помощью индексов Tri-Gram
3) Соберите все совпадающие документы (пока еще будет много зашумленных данных)
4) Постобработка каждого совпадающего документа и определение положения каждого совпадающего триграммного токена во входных данных произвольного текста и вычисление баллов Левенштейна между возможным токеном (-ами) положения и всем документом.
например - Привет, Сэм, как твои дела? Спасибо, Смит.
Здесь моим совпадением документа будет «Сэм Смит», я хочу посмотреть на каждую три грамма индекса и совпадение его положения во входных данных произвольного текста, например
1) токен «sam» соответствует слову «Sam» 2-й позиции во входных данных
2) токен smi соответствует 8-му слову Smith во входных данных
Позже я напишу логику для вычисления оценки Левенштейна для токена 2, 8 с фактическим согласованным документом (это было бы очень мало, учитывая близость между позициями 2 и 8), но если позиция токенов была 2,3 (или 2,4), я дал бы хороший результат.
Хотел бы получить отзывы экспертов об этом подходе или другие предложения, спасибо.