Я написал a TokenFilter
, который добавляет токены в поток.
1. Тесты показывают, что это работает, но я не совсем понимаю, почему.
Если бы кто-то мог пролить свет на семантику, я был бы благодарен. В частности, при (*)
, восстанавливая состояние, не означает ли это, что мы либо перезаписываем текущий токен, либо токен, созданный до захвата состояния?
Это примерно то, что я сделал
private final LinkedList<String> extraTokens = new LinkedList<String>();
private final CharTermAttribute termAtt = addAttribute(CharTermAttribute.class);
private State savedState;
@Override
public boolean incrementToken() throws IOException {
if (!extraTokens.isEmpty()) {
// Do we not loose/overwrite the current termAtt token here? (*)
restoreState(savedState);
termAtt.setEmpty().append(extraTokens.remove());
return true;
}
if (input.incrementToken()) {
if (/* condition */) {
extraTokens.add("fo");
savedState = captureState();
}
return true;
}
return false;
}
Означает ли это, что для входного потока пронумерованной токенированной строки "a b c"
(a) -> (b) -> (c) -> ...
где bb
- новый синоним b
, что граф будет построен таким образом, когда используется restoreState
?
(a)
/ \
(b) (bb)
\ /
(c)
|
...
2. Атрибуты
Учитывая текст foo bar baz
с fo
, являющийся основой foo
и qux
, являющимся синонимом bar baz
, я построил правильную таблицу атрибутов?
+--------+---------------+-----------+--------------+-----------+
| Term | startOffset | endOffset | posIncrement | posLenght |
+--------+---------------+-----------+--------------+-----------+
| foo | 0 | 3 | 1 | 1 |
| fo | 0 | 3 | 0 | 1 |
| qux | 4 | 11 | 0 | 2 |
| bar | 4 | 7 | 1 | 1 |
| baz | 8 | 11 | 1 | 1 |
+--------+---------------+-----------+--------------+-----------+