【问题标题】:Speeding up OpenNLP's POSTagging when using it for several texts将 OpenNLP POS 标记用于多个文本时加速
【发布时间】:2010-12-06 16:14:41
【问题描述】:

我目前正在开发一个关键词提取工具,它应该为网站上的文本或文档提供标签建议。因为我正在遵循本文提出的方法: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 resp.) 并在每次需要时使用 Java 的内置机制反序列化它。不幸的是,这不起作用——它引发了一个异常。 (我确实序列化了 WEKA 工具包中的分类器,该工具包最后对我的候选者进行分类,以便不必每次都构建(或训练)分类器。因此,我认为这也可能适用于 POSTaggeME。不幸的是,这是不是这样。)

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

tokenizer = WhitespaceTokenizer.INSTANCE;

但是对于可靠的 POSTagger,我没有看到此选项。

【问题讨论】:

  • 当你说你试图序列化对象时,你的意思是把它序列化到磁盘吗?在我看来,没有任何理由认为这比再次加载模型(从磁盘)更快。我认为这个问题的答案在于将模型保存在内存中,但我对您正在部署的环境了解不够。
  • 是的,我打算将其序列化到磁盘。我的动机是我认为这类似于序列化 WEKA 分类器。但我现在意识到事实并非如此:在分类器的情况下,实际使用的内存大小相当小(而创建它的过程很耗时)——在 POSTagger 的情况下,无法减小模型。所以也许我可以使用单例将所有内容加载到内存中一次。但在这种情况下,如果许多处理程序尝试同时访问它,我可能会遇到问题。
  • 是的,dmcer 回答中的方法可能就是您想要的。不过,我认为您不必担心同步问题,因为模型只会被读取,而不会被写入。

标签: java performance serialization nlp opennlp


【解决方案1】:

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

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

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

【讨论】:

  • 谢谢!我将使用此代码。此外,我将研究是否可以使用 n-gram 提取方法来选择候选者,例如由毛伊岛索引器 (code.google.com/p/maui-indexer)。对于使用的内存,这应该更经济。
猜你喜欢
  • 1970-01-01
  • 2013-12-18
  • 1970-01-01
  • 1970-01-01
  • 2014-03-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-07
相关资源
最近更新 更多