如何在OpenNLP中创建一个优秀的命名实体识别训练模型?

17

我刚开始学习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”代表女性等,但我想自己添加)

谢谢。

1个回答

19

第一个问题的答案是算法处理句子中的上下文(标记),而不仅仅是简单的查找机制。OpenNLP 使用最大熵,这是一种多项式逻辑回归来构建其模型。原因是为了减少“词义歧义”并在上下文中寻找实体。例如,如果我的名字是April,那么我容易与四月份混淆,如果我的名字是May,那么我会与五月份以及may动词混淆。对于第一个问题的第二部分,您可以列出已知的名称列表,并将这些名称用于程序,检查您的句子并自动注释它们以帮助您创建训练集。但是仅列出名称而没有上下文将无法充分或完全训练模型。实际上,有一个名为“modelbuilder addon”的OpenNLP插件专门用于此:您可以给它一个名称文件,它使用名称和一些数据(句子)来训练模型。如果您正在寻找通常不含歧义实体的特定名称,则最好只使用列表和类似正则表达式的东西来发现名称,而不是使用NER。

至于第二个问题,有一些选项,但总体而言,我认为NER不是区分性别等内容的好工具,但是如果您有足够的训练句子,您可能会获得不错的结果。由于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表示命名实体识别。

希望有所帮助。


1
谢谢!是的,我应该按照您的做法使用female.personmale.person。问题是我有很多名字和姓氏(大约有20万个),这种情况下我是否需要再次编写相同的句子,并每次使用不同的名称?就像 START:male.person Pierre Vinken <END> ,61岁... 然后 START:male.person John Travolta <END> ,61岁... 等等? - Dail
你能否找到名字中间有空格的内容? - Rajkumar Palani
1
@Nuwanda 不,实际上那不是正确的。模型是基于您注释的句子,而分词器只是opennlp查看您的句子的方式。然而,即使您在具有空格的多部分名称上进行了训练,命名实体识别器有时也只能找到名称的一部分...自然语言处理很难 :-) - Mark Giaconia
1
嗯,我曾经将块分析器的输出组合在一起,所以如果你想要查找人们的复合姓名,你可以检测到一个姓名,然后看看它是否在一个名词短语中,如果是,就取整个名词短语,这可能会让你得到包括空格在内的整个姓名...但即使这样,我还是需要清理一些名词短语,而且块分析器也可能出错,特别是对于它没有类似训练的句子。否则,除了像我刚才描述的不同启发式方法之外,更多的训练数据就是你能做的所有事情。 - Mark Giaconia
1
@FredrikL 很好的问题,我其实不确定实际名称对因素有多大影响... 我得进行一些测试。如果确实有影响,你可以通过随机名称进行一些替换(美国人口普查局是一个很好的名字来源)。 - Mark Giaconia
显示剩余6条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接