如何在 OpenNLP 中创建良好的 NER 训练模型?

How to create a good NER training model in OpenNLP?

我刚刚开始使用 OpenNLP。我需要创建一个简单的训练模型来识别名称实体。

在此处阅读文档 https://opennlp.apache.org/docs/1.8.0/apidocs/opennlp-tools/opennlp/tools/namefind 我看到这个简单的文本来训练模型:

<START:person> Pierre Vinken <END> , 61 years old , will join the board as a nonexecutive director Nov. 29 .
Mr . <START:person> Vinken <END> is chairman of Elsevier N.V. , the Dutch publishing group .
<START:person> Rudolph Agnew <END> , 55 years old and former chairman of Consolidated Gold Fields PLC ,
    was named a director of this British industrial conglomerate .

问题有两个:

(我知道有些系统试图通过阅读最后一个字母来理解它,例如 Female 的 "a" 等,但我想自己添加)

谢谢。

第一个问题的答案是该算法适用于句子中的周围上下文(标记);它不仅仅是一个简单的查找机制。 OpenNLP 使用最大熵(多项逻辑回归的一种形式)来构建其模型。这样做的原因是减少 "word sense ambiguity," 并在上下文中查找实体。例如,如果我的名字是 April,我很容易和 month of April 混淆,如果我的名字是 May,那么我会和 month of May 以及动词 may 混淆。对于第一个问题的第二部分,您可以列出已知的名称,并在查看您的句子并自动注释它们的程序中使用这些名称以帮助您创建训练集,但是制作名称列表单独没有上下文将无法充分或根本无法训练模型。事实上,有一个名为 "modelbuilder addon" 的 OpenNLP 插件就是为此设计的:你给它一个名称文件,它使用名称和你的一些数据(句子)来训练模型。如果您正在寻找通常没有歧义的实体的特定名称,您最好只使用列表和正则表达式之类的东西来发现名称而不是 NER。

关于你的第二个问题,有几个选项,但总的来说,我不认为 N​​ER 是描述性别等事物的好工具,但是如果有足够的训练句子,你可能会得到不错的结果。由于 NER 使用基于句子训练集中周围标记的模型来确定命名实体的存在,因此它在识别性别方面无能为力。您可能最好找到所有的人名,然后参考您知道是男性还是女性的名字索引来进行匹配。此外,有些名字,如 Pat,既是男性又是女性,在大多数文本数据中,没有任何迹象表明它既不是人类也不是机器。也就是说,您可以分别创建男性和女性模型,或者您可以在同一模型中创建不同的实体类型。您可以使用这样的注释(使用 male.person 和 female.person 的不同实体类型名称)。我从来没有尝试过这个,但它可能没问题,你必须在你的数据上测试它。

<START:male.person> Pierre Vinken <END> , 61 years old , will join the board as a nonexecutive director Nov. 29 .
Mrs . <START:female.person> Maria <END> is chairman of Elsevier N.V. , the Dutch publishing group

NER= 命名实体识别

HTH