如何从Lucene TokenStream获取令牌?
我正在尝试使用Apache Lucene进行标记,而我对从TokenStream
获取标记的过程感到困惑。
最糟糕的部分是我正在查看解决我的问题的JavaDoc中的注释。
http://lucene.apache.org/java/3_0_1/api/core/org/apache/lucene/analysis/TokenStream.html#incrementToken%28%29
不知何故,一个AttributeSource
应该被使用,而不是Token
。 我完全不知所措
任何人都可以解释如何从TokenStream获取类似令牌的信息?
是的,这是一个有点复杂(相比,好的方式),但这应该做到这一点:
TokenStream tokenStream = analyzer.tokenStream(fieldName, reader); OffsetAttribute offsetAttribute = tokenStream.getAttribute(OffsetAttribute.class); TermAttribute termAttribute = tokenStream.getAttribute(TermAttribute.class); while (tokenStream.incrementToken()) { int startOffset = offsetAttribute.startOffset(); int endOffset = offsetAttribute.endOffset(); String term = termAttribute.term(); }
编辑: 新的方式
根据Donotello的说法, TermAttribute
已被弃用,以支持CharTermAttribute
。 根据jpountz(和Lucene的文档), addAttribute
比getAttribute
更可取。
TokenStream tokenStream = analyzer.tokenStream(fieldName, reader); OffsetAttribute offsetAttribute = tokenStream.addAttribute(OffsetAttribute.class); CharTermAttribute charTermAttribute = tokenStream.addAttribute(CharTermAttribute.class); tokenStream.reset(); while (tokenStream.incrementToken()) { int startOffset = offsetAttribute.startOffset(); int endOffset = offsetAttribute.endOffset(); String term = charTermAttribute.toString(); }
这是应该的(亚当答案的干净版本):
TokenStream stream = analyzer.tokenStream(null, new StringReader(text)); CharTermAttribute cattr = stream.addAttribute(CharTermAttribute.class); stream.reset(); while (stream.incrementToken()) { System.out.println(cattr.toString()); } stream.end(); stream.close();
OP问题有两个变化:
- 什么是“从TokenStream获取令牌的过程”?
- “任何人都可以解释如何从TokenStream获取类似令牌的信息吗?
最近版本的Token
的Lucene文档说(强调增加):
注意:从2.9开始, 不再需要使用令牌,新的TokenStream API可以用作实现所有Attributes的便捷类,这对于轻松地从旧TokenStream API切换到新TokenStream API特别有用。
而TokenStream
说它的API:
已经从基于Token的模型转移到基于Attribute的模型…存储Token信息的首选方法是使用AttributeImpls。
这个问题的其他答案覆盖了上面的#2:如何使用属性以“新build”的方式从TokenStream
获取Token-like信息。 通过阅读文档,Lucene开发人员build议,这种改变的部分原因是为了减less一次创build的单个对象的数量。
但正如有些人在回答中指出的那样,他们并没有直接回答#1:如果你真的想/需要这种types,你怎么得到一个Token
?
通过使TokenStream
成为AttributeSource
的相同的API更改, Token
现在实现了Attribute
并且可以与TokenStream.addAttribute一起使用,就像其他答案显示的CharTermAttribute
和OffsetAttribute
。 所以他们真的回答了原来问题的这一部分,他们根本没有显示出来。
重要的是,尽pipe这种方法允许您在循环时访问Token
,但不pipestream中有多less个逻辑令牌,仍然只有一个对象。 每次调用incrementToken()
都会改变从addAttribute
返回的Token
的状态; 所以如果你的目标是build立一个不同的Token
对象的集合在循环之外使用,那么你将需要做额外的工作来创build一个新的 Token
对象作为(深?)副本。