Создание анализатора Lucene

Я хочу сделать базовый стемминг иврита.

Все примеры настраиваемых анализаторов, которые я мог найти, всегда объединяют другие анализаторы и фильтры, но никогда не выполняют никакой обработки на уровне строк.

Что мне нужно сделать, например, если я хочу создать анализатор, который для каждого термина в потоке, который он получает, испускает один или два термина по следующим правилам: если входящий термин начинается с чего-то другого, кроме "a", он должен передаваться как есть. если входящий член начинается с «а», то следует выделить два члена: исходный член и второй без ведущего «а» и с меньшим усилением.

Таким образом, если в документе указано «help away», он вернет «help», «away» и «way ^ 0.8».

Какие методы анализатора я должен переопределить, чтобы это сделать? (Было бы очень полезно указать на пример схожего характера).

Спасибо


person epeleg    schedule 15.01.2012    source источник


Ответы (1)


Вот один пример: http://www.java2s.com/Open-Source/Java-Document/Search-Engine/lucene/org/apache/lucene/wordnet/SynonymTokenFilter.java.htm

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

Если этот пример не работает, просто попробуйте найти тот, который объясняет, как вы могли бы реализовать фильтр синонимов с Lucene, он почти идентичен вашей проблеме. В книге Lucene в действии есть хороший пример этого, код доступен здесь: http://www.manning.com/hatcher3/LIAsourcecode.zip, класс SynonymFilter.

person milan    schedule 16.01.2012
comment
это выглядит очень многообещающим. Я, вероятно, потрачу день или два, чтобы убедиться, что я правильно понял это, прежде чем закрывать этот вопрос, но это действительно похоже на действительно хорошую основу. (Мне просто нужно будет заполнить стек своими собственными необходимыми значениями). Есть идеи, могу ли я сделать их менее значительными? - person epeleg; 16.01.2012
comment
да, поиграйте с кодом. Если у вас есть книга, lucene в действии, она подробно объясняется там с примерами кода (вы можете получить образцы кода из книги, кстати, просто погуглите). - person milan; 16.01.2012
comment
чтобы сделать их менее значимыми, если они попадают в одно и то же поле, я думаю, вам придется использовать механизм полезной нагрузки и реализовать свой собственный счетчик. - person milan; 16.01.2012
comment
"i guess you'd have to use the payload mechanism, and implement your own scorer" не могли бы вы предоставить дополнительную информацию по этому поводу? - person epeleg; 16.01.2012
comment
почему бы вам не опубликовать это как еще один вопрос, это может быть полезно для других - person milan; 16.01.2012
comment
+1 и готово. здесь: stackoverflow.com/questions / 8880396 / - person epeleg; 16.01.2012