TokenStream


TokenStream是Lunce核心類之一,它用於產生和轉換token流(token可以理解為一個單詞,如‘hello’,或一個詞組,如‘中國’)。它有兩個重要的派生類Tokenzier和TokenFilter,前者用於從輸入流中產生token流;后者用於對token流轉換,如大小寫轉換,丟棄某些token,添加一個token的同義詞到流中,去除token的詞根,如going->go。TokenStream具有自組合性,即多個TokenStream可以組合在一起工作,但是通常只有一個Tokenizer,例如WhitespaceTokenizer和LengthFilter組合在一起,前者用於根據空格來產生token流,后者用於過濾掉不滿足長度要求的token。

 

TokenStream使用步驟

  1. 首先實例化一個TokenStream
  2. 如果消費者是一個TokenStream,需要調用addAttribute()或addAttributeImpl()注冊消費者將要產生的token屬性。反之,如果消費者不是一個TokenStream,則跳過該步
  3. 調用reset()
  4. 調用incrementToken()驅動token流,當該方法返回false時表示已經到達流尾
  5. 調用getAttribute()獲取您感興趣的token屬性,該方法接受一個類類型參數,該參數指定了感興趣的屬性的類
  6. 調用end()結束token流,token流結束之后可以再次調用reset()重用
  7. 調用close()關閉token流,token流關閉之后不能再調用reset()重用

 

案例1:WhitespaceTokenzier的測試

@Test
public void tokenizer() throws IOException {
    WhitespaceTokenizer tokenizer = new WhitespaceTokenizer(new StringReader("hello world"));
    tokenizer.reset();
    while(tokenizer.incrementToken()){
        CharTermAttribute charTermAttribute = tokenizer.getAttribute(CharTermAttribute.class);
        System.out.println(charTermAttribute.toString());
    }
    tokenizer.end();
    tokenizer.close();
}

輸出結果:

hello

world

 

案例2:LengthFilter的測試

@Test
public void filter() throws IOException {
    WhitespaceTokenizer tokenizer = new WhitespaceTokenizer(new StringReader("Bob is a dog"));
    LengthFilter filter = new LengthFilter(tokenizer, 3, 10);
    filter.reset();
    while (filter.incrementToken()) {
        CharTermAttribute charTermAttribute = tokenizer.getAttribute(CharTermAttribute.class);
        System.out.println(charTermAttribute.toString());
    }
    tokenizer.end();
    tokenizer.close();
}

輸出結果:

Bob

dog

 

案例2中首先數據喂入WhitespaceTokenizer,但是這時候的流就是一灘死水,並未流動,當while引擎啟動時開始流動,首先經過WhitespaceTokenizer被轉換成token,然后token經過LengthFilter決定這個token是否是合格品,次品丟掉,合格品進入下一步打印到屏幕。

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM