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是否是合格品,次品丢掉,合格品进入下一步打印到屏幕。