TokenStream是Lunce核心類之一,它用於產生和轉換token流(token可以理解為一個單詞,如‘hello’,或一個詞組,如‘中國’)。它有兩個重要的派生類Tokenzier和TokenFilter,前者用於從輸入流中產生token流;后者用於對token流轉換,如大小寫轉換,丟棄某些token,添加一個token的同義詞到流中,去除token的詞根,如going->go。TokenStream具有自組合性,即多個TokenStream可以組合在一起工作,但是通常只有一個Tokenizer,例如WhitespaceTokenizer和LengthFilter組合在一起,前者用於根據空格來產生token流,后者用於過濾掉不滿足長度要求的token。
TokenStream使用步驟
- 首先實例化一個TokenStream
- 如果消費者是一個TokenStream,需要調用addAttribute()或addAttributeImpl()注冊消費者將要產生的token屬性。反之,如果消費者不是一個TokenStream,則跳過該步
- 調用reset()
- 調用incrementToken()驅動token流,當該方法返回false時表示已經到達流尾
- 調用getAttribute()獲取您感興趣的token屬性,該方法接受一個類類型參數,該參數指定了感興趣的屬性的類
- 調用end()結束token流,token流結束之后可以再次調用reset()重用
- 調用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是否是合格品,次品丟掉,合格品進入下一步打印到屏幕。