Как получить токен от Lucene TokenStream?
Я пытаюсь использовать Apache Lucene для токенизации, и я озадачен процессом получения токенов от A TokenStream.
худшая часть заключается в том, что я смотрю на комментарии в JavaDocs, которые касаются моего вопроса.
- то, что является AttributeSource предполагается использовать, а не Tokens. Я в полном недоумении.
может ли кто-нибудь объяснить, как получить токен-подобную информацию из TokenStream?
4 ответа:
Да, это немного запутанно (по сравнению с хорошим способом), но это должно сделать это:
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(); }Edit: The новая путь
по данным 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?"
последние версии Lucene документация для
Tokenговорят (Курсив мой):Примечание: начиная с 2.9 ... это не надо чтобы использовать токен больше, с новым TokenStream API его можно использовать как класс удобства, который реализует все атрибуты, что особенно полезно для легкого переключения со старого на новый API TokenStream.
и
TokenStreamговорит его API:... перешел от использования маркеров к использованию атрибутов ... предпочтительным способом хранения информации о токене является использование AttributeImpls.
другие ответы на этот вопрос охватывают # 2 выше: как получить token-like сведениями из
TokenStreamв" новом " рекомендуемом способе с использованием атрибутов. Читая документацию, разработчики Lucene предполагают, что это изменение было сделано, в частности, чтобы уменьшить количество отдельных объектов, создаваемых одновременно.но, как некоторые люди указали в комментариях к этим ответам, они прямо не отвечают #1: Как вы получаете
TokenЕсли вы действительно хотите/нужно типа?с тем же изменением API, что делает
TokenStreamanAttributeSource,Tokenтеперь реализуетAttributeи может использоваться с TokenStream.addAttribute как и другие ответы показывают наCharTermAttributeиOffsetAttribute. Поэтому они действительно ответили на эту часть первоначального вопроса, они просто не показали этого.важно, что этот подход позволит вам получить доступ к
Tokenпока вы выполняете цикл, это все еще только один объект, независимо от того, сколько логических токенов находится в потоке. Каждый звонок кincrementToken()изменить состояниеTokenвернулся изaddAttribute; так что если ваша цель состоит в том, чтобы построить коллекцию различныхTokenобъекты, которые будут использоваться вне цикла, то вам потребуется сделать дополнительную работу, чтобы сделать новаяTokenобъект как (глубоко?) копия.
для последней версии lucene 7.3.1
// Test the tokenizer Analyzer testAnalyzer = new CJKAnalyzer(); String testText = "Test Tokenizer"; TokenStream ts = testAnalyzer.tokenStream("context", new StringReader(testText)); OffsetAttribute offsetAtt = ts.addAttribute(OffsetAttribute.class); try { ts.reset(); // Resets this stream to the beginning. (Required) while (ts.incrementToken()) { // Use AttributeSource.reflectAsString(boolean) // for token stream debugging. System.out.println("token: " + ts.reflectAsString(true)); System.out.println("token start offset: " + offsetAtt.startOffset()); System.out.println(" token end offset: " + offsetAtt.endOffset()); } ts.end(); // Perform end-of-stream operations, e.g. set the final offset. } finally { ts.close(); // Release resources associated with this stream. }Ссылка: https://lucene.apache.org/core/7_3_1/core/org/apache/lucene/analysis/package-summary.html