OpenNLP 与斯坦福 CoreNLP

OpenNLP vs Stanford CoreNLP

我一直在对这两个包进行一些比较,但我不确定该往哪个方向走。我正在寻找的简要内容是:

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

据我所知,OpenNLP 和 Stanford CoreNLP 具有非常相似的功能。然而,Stanford CoreNLP 看起来有更多 activity 而 OpenNLP 在过去六个月中只有少数提交。

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

坦白地说,我是 CoreNLP 的贡献者,所以这是一个有偏见的答案。但是,在我看来,您的三个标准是:

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

  2. 性别识别。我认为这两种工具在这方面的记录都很少。 OpenNLP 似乎有一个 GenderModel class; CoreNLP 有一个性别注释器。

  3. 训练API。我怀疑 OpenNLP 培训 API 对于非现成的培训更易于使用。但是,如果您只想从 CoNLL 文件训练模型,那么两者都应该很简单。与我尝试过的其他工具相比,使用 CoreNLP 的训练速度往往更快,但我还没有正式对它进行基准测试,所以对此持保留态度。

这取决于您的目的和需要,我对这两个的了解是 OpenNLP 是开源的,而 CoreNLP 当然不是。

但是,如果您查看准确度级别,Stanford CoreNLP 的检测比 OpenNLP 更准确。最近我对两者的 Part Of Speech (POS) 标记进行了比较,是的,这是任何 NLP 任务中最重要的部分,所以在我的分析中,获胜者是 CoreNLP

OpenNLP 相比,NER 也有 CoreNLP 更准确的结果。

因此,如果您刚刚起步,可以在以后使用 OpenNLP 如果需要,您可以迁移到 Stanford CoreNLP

这里有点晚了,但我最近看 OpenNLP 只是基于斯坦福大学获得 GPL 许可这一事实——如果这对你的项目来说没问题,那么斯坦福大学通常被称为 NLP 的 benchmark/state-of-the-art。

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

OpenNlp 的一个优势是它的可扩展性很强,编写起来很容易与其他库一起使用,并且具有很好的 API 集成 - 训练非常简单(一旦你有了训练数据) OpenNLP (I wrote about it here - with a pretty lousy generated data set I was able to get ok results identifying foods), and it is very configurable - you can configure all the parameters around training very easily and there are a range of algorithms you can use (perceptron, max entropy, and in the snapshot version they have added Naive Bayes)

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