我試圖寫Lucene的過濾器,類似於StopWordsFilter(從而實現TokenFilter),但我需要刪除短語(令牌序列)的替代詞。Lucene的停止短語過濾
「停止短語」被表示自己作爲標記序列:標點符號不考慮。
我想我需要做某種令牌流中的令牌的緩衝,當一個完整的短語匹配時,我放棄緩衝區中的所有令牌。
什麼是最好的辦法,以實現「停止短語」給出的單詞流像Lucene的的TokenStream過濾器?
我試圖寫Lucene的過濾器,類似於StopWordsFilter(從而實現TokenFilter),但我需要刪除短語(令牌序列)的替代詞。Lucene的停止短語過濾
「停止短語」被表示自己作爲標記序列:標點符號不考慮。
我想我需要做某種令牌流中的令牌的緩衝,當一個完整的短語匹配時,我放棄緩衝區中的所有令牌。
什麼是最好的辦法,以實現「停止短語」給出的單詞流像Lucene的的TokenStream過濾器?
In this thread我得到了一個解決方案:使用Lucene的CachingTokenFilter爲出發點:
這種解決方案實際上是走正道。
編輯:我修復了死鏈接。這是線程的記錄。
我的問題:
我試圖實施「停止短語過濾器」的新的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,將其重置爲 並再次使用,作爲進一步工作的來源。
你真的有寫自己的分析,我想,既然話的一些序列是否是一個「短語」是依賴於線索,如標點符號,那不是符號化後可用。
其實標點符號可以被丟棄:我需要匹配其自身可以描述爲字令牌 – 2009-10-07 15:54:39
請編輯您的問題,使這個明確的短語。 – 2009-10-07 15:59:42
這就是連接答案不好的原因。 Link現在已經死了。 – Mysterion 2015-01-25 22:37:45
@Mysterion修復了死鏈接並報告了線索內容的抄本,以避免將來出現鏈接問題。 – 2015-01-27 08:18:37