OpenNLP vs Stanford CoreNLP

2022-09-03 14:02:04

我一直在对这两个软件包进行一些比较,但不确定该朝哪个方向发展。我简要地寻找的是:

  1. 命名实体识别(人员、地点、组织等)。
  2. 性别认同。
  3. 一个体面的训练 API。

据我所知,OpenNLP和Stanford CoreNLP公开了非常相似的功能。然而,Stanford CoreNLP看起来有更多的活动,而OpenNLP在过去六个月里只有几次提交。

根据我所看到的,OpenNLP似乎更容易训练新模型,并且可能仅仅因为这个原因而更具吸引力。但是,我的问题是,其他人会从什么开始作为将NLP功能添加到Java应用程序的基础?我最担心的是OpenNLP是“刚刚成熟”还是半废弃的。


答案 1

完全公开地说,我是CoreNLP的贡献者,所以这是一个有偏见的答案。但是,在我看来,关于你的三个标准:

  1. 命名实体识别:我认为CoreNLP显然在这里获胜,无论是在准确性还是易用性方面。首先,OpenNLP的每个NER标签都有一个模型,而CoreNLP用一个注释器检测所有标签。此外,使用SUTime的时间分辨率在CoreNLP中是一个不错的好处。准确性方面,我的轶事经验是CoreNLP在通用文本上做得更好。

  2. 性别认同。我认为这两个工具在这方面都记录得有点差。OpenNLP似乎有一个性别模型类;CoreNLP有一个性别注释器。

  3. 训练 API。我怀疑OpenNLP训练API对于非现成的训练来说更容易使用。但是,如果您只想从CoNLL文件训练模型,那么两者都应该很简单。使用CoreNLP的训练速度往往比我尝试过的其他工具更快,但我还没有正式对其进行基准测试,因此请谨慎对待。


答案 2

这里有点晚了,但我最近看到OpenNLP只是基于斯坦福大学获得GPL许可的事实 - 如果这对你的项目没问题,那么斯坦福大学通常被称为NLP的基准/最先进的。

也就是说,预训练模型的性能将取决于您的目标文本,因为它非常特定于域。如果您的目标文本与训练模型所针对的数据相似,那么您应该获得不错的结果,但如果不是,那么您将必须自己训练模型,这将取决于训练数据。

OpenNlp的一个优点是它非常可扩展,并且编写是为了便于与其他库一起使用,并且具有用于集成的良好API - 训练非常简单(一旦你有了训练数据)与OpenNLP(我在这里写了它 - 使用一个非常糟糕的生成数据集,我能够获得识别食物的结果), 而且它非常可配置 - 您可以非常轻松地配置有关训练的所有参数,并且可以使用一系列算法(感知器,最大熵,并且在快照版本中,它们添加了朴素贝叶斯)

如果你发现你确实需要自己训练模型,我会考虑尝试OpenNlp,看看它的表现如何,只是为了进行比较,因为通过微调,你可以得到相当不错的结果。


推荐