Как я могу получить доступ и обновить токен непосредственно в классе TokenFilter в Apache Lucene? - PullRequest
0 голосов
/ 24 декабря 2018

Я пишу плагин дляasticsearch, который будет выполнять анализ естественного языка на основе интеграции с существующим анализатором (я полагаю, что детали на данный момент не имеют значения).

У меня много проблем с пониманием или поиском информации о том, как должен работать люцен.Я видел, что есть такие атрибуты, как CharTermAttribute, которые каким-то образом хранятся в карте Class -> Attribute.Я не понимаю, как это должно работать.Как я могу напрямую получить доступ к текущему токену?

И как мне его обновить?Какие атрибуты должны быть обновлены?

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

Может ли кто-нибудь, по крайней мере, указать мне правильное направление?

(Точнее, я пишу подкласс класса TokenFilter)

1 Ответ

0 голосов
/ 02 января 2019

Если вы хотите создать подкласс TokenFilter, вам нужно взглянуть на него:

Первое представление об архитектуре TokenFilter - это абстрактный класс;подклассы должны переопределять incrementToken().Также в нем есть несколько методов - end(), close(), reset().Очень важно вызывать супер методы, если вы переопределяете его.

Однако большинство вещей происходит в incrementToken().Общая архитектура такова, что в вашем incrementToken вам нужно вызвать входящий вам TokenStream вход - чтобы получить следующий токен (давайте представим, что ваш родитель TokenStream равен WhitespaceTokenizer), а затем обновил атрибуты токена, такони будут доступны позже.

Существует около 10 атрибутов токена, которые уже существуют, и, скорее всего, вам просто нужно их использовать.Позвольте мне назвать несколько важных: CharTermAttribute (содержит текст токена), PositionIncrementAttribute (установить расстояние от предыдущего термина, по умолчанию 1), PositionLengthAttribute (большинство анализаторов игнорируют его, но это можетбыть полезным в обработке NLP, чтобы фактически иметь TokenStreams в качестве графиков), и некоторые другие.Полный список, как обычно, можно найти в исходном коде Lucene .

Обычно после вызова incrementToken() вы получаете текст токена из предыдущего TokenStream и выполняете некоторые манипуляциис этим.

Я мог бы представить, что некоторый код, связанный с анализом НЛП, мог бы выглядеть так:

if (!input.incrementToken()) {
    return false; // no more tokens left
} else {
    final CharTermAttribute attribute = input.getAttribute(CharTermAttribute.class); //getting token text from the previous TokenStream
    final String result = doNLP(attribute.toString()); // invoking your NLP analysis on token text
    termAtt.copyBuffer(result , 0, suffix.length()); // storing output result of your NLP analysis in the CharTermAttribute  that you have in your TokenStream, so later indexing pipeline could use it
}

Конечно, вам нужно инициализировать этот termAtt в вашем классе примерно так:CharTermAttribute termAtt = addAttribute(CharTermAttribute.class);

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