Фильтрация слов с числами и получение 2-граммов и 1-граммов с помощью Lucene

Я пытаюсь использовать Lucene (5.5.0) для токенизации строк (без индексации). Мне необходимо:

  1. Полностью удалите слова, содержащие числа, поэтому, например, такие слова, как log4j, должны быть удалены из строки
  2. Я хотел бы разбить свою строку на термины, состоящие из одного слова, а также на термины по 2 грамма, поэтому, например: «завяжите желтую ленту» следует обозначить следующим образом: «галстук», «желтый», «лента», » желтая лента ». Обратите внимание, что "желтый галстук" не является термином, поскольку в середине есть стоп-слово.

Можно ли это сделать с Lucene? Если да, то как?

Что я сделал до сих пор:

  • Что касается удаления слов, содержащих числа, я столкнулся с WordDelimetedFilter, который не годится, поскольку в документации он показывает, что он разбивает слово SD500 на «SD» и «500», в то время как я хочу удалить его полностью. Я также нашел NumericPayloadTokenFilter, который выглядит многообещающим (судя по названию), но у меня возникли некоторые проблемы с пониманием того, как с ним работать.
  • Что касается 2Grams и 1Grams, я нашел несколько примеров того, как это сделать здесь, здесь и в Документация по NGramTokenizer, но все они, похоже, работают с символами а не на словах, которые мне нужны

заранее спасибо


person Gideon    schedule 23.02.2016    source источник


Ответы (1)


По требованию 1: я не знаю ничего, что делает это из коробки. NumericPayloadTokenFilter определенно не то, что вам нужно. Для этого вам, вероятно, потребуется создать свой собственный фильтр токенов.

По требованию 2: NGrams, на языке Lucene, обычно основаны на символах. Вам нужен ShingleFilter, который объединяет токены. Он создаст черепицу на стоп-словах, например: tie _ и _ yellow, где _ - общий маркер-заполнитель.

person femtoRgon    schedule 23.02.2016
comment
Написать фильтр было довольно легко, просмотрев несколько примеров фильтров. Спасибо за Ваш ответ - person Gideon; 01.03.2016