我刚开始使用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 .
问题是两个:
为什么我必须将这些人的姓名放在文本(短语)上下文中?为什么不为每一行写一个人名?像:
<START:person> Robert <END>
<START:person> Maria <END>
<START:person> John <END>
如何在该名称中添加额外信息? 例如,我想为每个名字保存男性/女性信息。
(我知道有些系统试图理解它读取最后一个字母,比如女性等的“a”但我想自己添加它)
感谢。
答案 0 :(得分:18)
你的第一个问题的答案是该算法适用于句子中的周围环境(标记);它不仅仅是一个简单的查找机制。 OpenNLP使用最大熵,这是一种多项逻辑回归形式来构建其模型。这样做的原因是为了减少词义模糊,&#34;并在上下文中查找实体。例如,如果我的名字是四月份,我很容易与四月份混淆,如果我的名字是五月,那么我会对五月和动词可能会感到困惑。对于第一个问题的第二部分,您可以列出已知的名称列表,并在查看您的句子的程序中使用这些名称,并自动注释它们以帮助您创建训练集,但是制作一个名称列表单独没有上下文不会充分或完全训练模型。实际上,有一个名为&#34; modelbuilder addon&#34;的OpenNLP插件。为此设计:你给它一个名字文件,它使用名称和你的一些数据(句子)来训练模型。如果您正在寻找通常不含糊不清的实体的特定名称,那么您最好只使用列表和类似正则表达式来发现名称而不是NER。
关于你的第二个问题,有一些选择,但总的来说,我并不认为NER是描绘性别等内容的好工具,但是如果有足够的训练句,你可能会获得不错的结果。由于NER在您的句子训练集中使用基于周围令牌的模型来建立命名实体的存在,因此在识别性别方面它不能做很多事情。您可能最好找到所有人名,然后引用您知道男性或女性的名称索引以获得匹配。此外,一些名字,如帕特,都是男性和女性,在大多数文本数据中,没有任何迹象表明它既不是人类也不是机器。话虽这么说,您可以单独创建男性和女性模型,或者您可以在同一模型中创建不同的实体类型。您可以使用这样的注释(使用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