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 |
+--------+---------------+-----------+--------------+-----------+