Лемматизация запросов Solr/Lucene с контекстом

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

Например, фраза pila vodu во время индекса анализируется иначе, чем во время запроса. Использует неоднозначное слово pilaчто может означать pila (видел, например, бензопила) или pít (прошедшее время от глагола "пить").

pila vodu ->

  • Время индекса: pít voda
  • Время запроса: pila voda

.. так что слово pila не найден и не выделен во фрагменте документа.

Это поведение задокументировано в Solr Wiki (цитируется ниже), и я могу подтвердить это путем отладки моего кода (в лемматизатор передаются только изолированные строки "pila" и "vodu").

... Lucene QueryParser токенизируется на пустое пространство перед тем, как передать текст анализатору, поэтому, если человек ищет слова sea biscit анализатору будут даны слова "море" и "бисквит" по отдельности,...

Итак, мой вопрос:

Можно ли как-то изменить, настроить или адаптировать синтаксический анализатор запросов, чтобы лемматизатор видел всю строку запроса или хотя бы некоторый контекст отдельных слов? Я хотел бы иметь решение также для различных синтаксических анализаторов запросов, таких как dismax или edismax.

Я знаю, что нет такой проблемы с запросами фразы, как "pila vodu" (цитаты), но тогда я потерял бы документы без точной фразы (например, документы с "pila víno" или даже "pila dobrou vodu").


Изменить - попытаться объяснить / ответить на следующий вопрос (спасибо @femtoRgon):

Если эти два термина не являются фразой и поэтому не обязательно объединяются, то зачем их анализировать в контексте друг с другом?

Наверняка было бы лучше проанализировать только термины, собранные вместе. Например, во время индексации лемматизатор обнаруживает предложения во входном тексте и анализирует вместе только слова из одного предложения. Но как добиться аналогичной вещи во время запроса? Является ли реализация моего собственного парсера запросов единственным вариантом? Мне очень нравится pf2 а также pf3 варианты edismax парсер, я должен был бы реализовать их снова в случае моего собственного парсера?

Идея, лежащая в основе, на самом деле немного глубже, потому что лемматизатор устраняет неоднозначность смысла слова даже для слов, имеющих одинаковую лексическую основу. Например слово bow имеет около 7 различных чувств на английском языке (см. в Википедии), и лемматизатор различает такие чувства. Поэтому я хотел бы использовать этот потенциал, чтобы сделать поиск более точным - возвращать только документы, содержащие слово bow в конкретном смысле, требуемом запросом. Таким образом, мой вопрос может быть расширен на: Как получить правильный <lemma;sense>пара для запроса? Лемматизатор очень часто может назначить правильный смысл, если слово представлено в его общем контексте, но у него нет шансов, когда нет контекста.

1 ответ

Наконец, я реализовал свой собственный анализатор запросов.

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

Решение:

Сначала я анализирую всю строку запроса вместе. Это дает мне список "токенов".

Есть небольшое противоречие со стоп-словами - получить токены для стоп-слов не так просто, так как анализатор их опускает, но их можно обнаружить по PositionIncrementAttribute,

Из "токенов" я строю запрос так же, как edismax делать (например, создавать все запросы на 2-токеновые и / или 3-токеновые фразы, объединенные в DisjunctionMaxQuery экземпляры).

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