gpt4 book ai didi

java - 将其用于多个文本时加速 OpenNLP POS 标记

转载 作者:行者123 更新时间:2023-11-30 11:56:33 24 4
gpt4 key购买 nike

我目前正在开发一个关键词提取工具,它应该为网站上的文本或文档提供标签建议。因为我遵循本文提出的方法:A New Approach to Keyphrase Extraction Using Neural Networks我在第一步中使用 OpenNLP 工具包的 POSTagger,即候选选择。

一般来说,关键短语提取效果很好。我的问题是,每次我想使用 POSTagger 时,我都必须从相应的文件中执行这种昂贵的模型加载:

posTagger = new POSTaggerME(new POSModel(new FileInputStream(new File(modelDir + "/en-pos-maxent.bin"))));
tokenizer = new TokenizerME(new TokenizerModel(new FileInputStream(new File(modelDir + "/en-token.bin"))));
// ...
String[] tokens = tokenizer.tokenize(text);
String[] tags = posTagger.tag(tokens);

这是因为这段代码不在网络服务器本身的范围内,而是在一个“处理程序”中,其生命周期仅包括处理一个特定请求。我的问题是:我怎样才能实现只加载一次文件?(我不想花 10 秒等待模型加载并在之后仅使用 200 毫秒。)

我的第一个想法是序列化 POSTaggerME(分别为 TokenizerME)并在每次需要时使用 Java 的内置机制反序列化它。不幸的是,这不起作用——它引发了一个异常。 (我确实从 WEKA 工具包中序列化分类器,它在最后对我的候选人进行分类,以便不必每次都构建(或训练)分类器。因此我认为这也可能适用于 POSTaggeME。不幸的是,这是不是这样的。)

在 Tokenizer 的情况下,我可以引用一个简单的 WhitespaceTokenizer,这是一个较差的解决方案,但一点也不差:

tokenizer = WhitespaceTokenizer.INSTANCE;

但是对于可靠的 POSTagger,我看不到这个选项。

最佳答案

只需将您的标记化/POS 标记管道包装在 singleton

如果底层 OpenNLP 代码不是线程安全的,将调用放在同步块(synchronized block)中,例如:

// the singletons tokenization/POS-tagging pipeline 
String[] tokens;
synchronized(tokenizer) {
tokens = tokenizer.tokenize(text);
}
String[] tags;
synchronized(posTagger) {
tags = posTagger.tag(tokens);
}

关于java - 将其用于多个文本时加速 OpenNLP POS 标记,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4368463/

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