2009-10-07 52 views
2

我試圖寫Lucene的過濾器,類似於StopWordsFilter(從而實現TokenFilter),但我需要刪除短語(令牌序列)的替代詞。Lucene的停止短語過濾

「停止短語」被表示自己作爲標記序列:標點符號不考慮。

我想我需要做某種令牌流中的令牌的緩衝,當一個完整的短語匹配時,我放棄緩衝區中的所有令牌。

什麼是最好的辦法,以實現「停止短語」給出的單詞流像Lucene的的TokenStream過濾器?

回答

1

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,將其重置爲 並再次使用,作爲進一步工作的來源。

+0

這就是連接答案不好的原因。 Link現在已經死了。 – Mysterion 2015-01-25 22:37:45

+0

@Mysterion修復了死鏈接並報告了線索內容的抄本,以避免將來出現鏈接問題。 – 2015-01-27 08:18:37

0

你真的有寫自己的分析,我想,既然話的一些序列是否是一個「短語」是依賴於線索,如標點符號,那不是符號化後可用。

+0

其實標點符號可以被丟棄:我需要匹配其自身可以描述爲字令牌 – 2009-10-07 15:54:39

+0

請編輯您的問題,使這個明確的短語。 – 2009-10-07 15:59:42