gpt4 book ai didi

lucene - Lucene 对文本进行分词的过程

转载 作者:行者123 更新时间:2023-12-03 23:08:51 37 4
gpt4 key购买 nike

这可以被视为一般 Java 问题,但为了更好地理解,我使用 Lucene 作为示例。

您可以在 Lucene 中使用不同的分词器来分词文本。有主要的抽象 Tokenizer 类,然后是许多扩展它的不同类。 TokenFilter 也是如此。

现在,似乎每次要索引文档时,都会创建一个新的 Tokenizer。问题是,既然 Tokeinzer 只是一个实用类,为什么不让它静态化呢?例如,将所有字母转换为小写的 Tokenizer 可以有一个静态方法,该方法只对它获得的每个输入执行此操作。为我们要索引的每段文本创建一个新对象有什么意义?

有一件事值得一提——Tokeinzer 有一个私有(private)字段,其中包含它接收到的要标记化的输入。我只是不明白为什么我们需要以这种方式存储它,因为对象在标记化过程结束并返回新的标记化文本后立即被销毁。我唯一能想到的可能是多线程访问?

谢谢!

最佳答案

Now, it seems that each time you want to index a document, a new Tokenizer is created

这不是真的,Analyzer.reusableTokenStream 方法被调用,它重新使用不仅仅是 Tokenizer,还有整个链(TokenFilters 等)。参见 http://lucene.apache.org/java/3_0_0/api/core/org/apache/lucene/analysis/Analyzer.html#reusableTokenStream(java.lang.String , java.io.Reader)

One thing to mention - Tokeinzer has a private field that contains the input it receives to tokenize. I just don't see why we need to store it this way because the object is destroyed right after the tokenization process is over and the new tokenized text is returned. The only thing I can think of is multi-threaded access maybe?

如前所述,整个分词器和分词过滤器链在文档中重复使用。因此它们的所有属性都被重用,但同样重要的是要注意属性是跨链共享的(例如,所有 Tokenizers 和 TokenFilters 的属性引用都指向相同的实例)。这就是为什么在标记器中调用 clearAttributes() 以重置所有属性至关重要。

例如,Whitespace 分词器在其构造函数中添加了对 TermAttribute 的引用,并由 LowerCaseFilter 包装,后者也在其构造函数中添加了对 TermAttribute 的引用。这两个 TermAttributes 都指向相同的底层 char[]。处理新文档时,将调用 Analyzer.reusableTokenStream,它返回与上一个文档中使用的相同的 TokenStream 链(在本例中为用 LowerCaseFilter 包装的 Whitespace)。调用 reset(Reader) 方法,将分词器的输入重置为新的文档内容。最后,在整个流上调用 reset(),这会重置前一个文档的所有内部状态,并处理内容,直到 incrementToken() 返回 false。

关于lucene - Lucene 对文本进行分词的过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4684960/

37 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com