В этой теме мне было дано решение: использовать CachingTokenFilter Lucene в качестве отправной точки:
Это решение действительно было правильным путем.
РЕДАКТИРОВАТЬ: я исправил мертвую ссылку. Вот расшифровка стенограммы темы.
МОЙ ВОПРОС:
Я пытаюсь реализовать «фильтр стоп-фраз» с новым TokenStream
API.
Я хотел бы иметь возможность заглянуть в N токенов вперед, посмотреть, если текущий
токен + N последующих токенов соответствуют «стоп-фразе» (множество стоп-фраз
сохраняются в HashSet), затем отбрасывают все эти токены, когда они соответствуют
остановите фразу или оставьте их всех, если они не совпадают.
Для этой цели я хотел бы использовать captureState (), а затем restoreState ().
чтобы вернуться к начальной точке потока.
Я пробовал много комбинаций этих API. Моя последняя попытка в коде
ниже, который не работает.
static private HashSet<String> m_stop_phrases = new HashSet<String>();
static private int m_max_stop_phrase_length = 0;
...
public final boolean incrementToken() throws IOException {
if (!input.incrementToken())
return false;
Stack<State> stateStack = new Stack<State>();
StringBuilder match_string_builder = new StringBuilder();
int skippedPositions = 0;
boolean is_next_token = true;
while (is_next_token && match_string_builder.length() < m_max_stop_phrase_length) {
if (match_string_builder.length() > 0)
match_string_builder.append(" ");
match_string_builder.append(termAtt.term());
skippedPositions += posIncrAtt.getPositionIncrement();
stateStack.push(captureState());
is_next_token = input.incrementToken();
if (m_stop_phrases.contains(match_string_builder.toString())) {
// Stop phrase is found: skip the number of tokens
// without restoring the state
posIncrAtt.setPositionIncrement(posIncrAtt.getPositionIncrement() + skippedPositions);
return is_next_token;
}
}
// No stop phrase found: restore the stream
while (!stateStack.empty())
restoreState(stateStack.pop());
return true;
}
Какое правильное направление я должен изучить, чтобы осуществить свой «стоп»
фразы "фильтр?
ПРАВИЛЬНЫЙ ОТВЕТ:
restoreState восстанавливает только содержимое токена, а не весь поток. Так
вы не можете откатить поток токенов (и это было невозможно с
старый API). Цикл while в конце вашего кода не работает как вы
ожидание из-за этого. Вы можете использовать CachingTokenFilter, который можно сбросить
и потребляется снова, как источник для дальнейшей работы.