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