我写了一个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 |
+--------+---------------+-----------+--------------+-----------+