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

我刚刚开始使用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

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

至于你的第二个问题,有几个选择,但总的来说,我不认为NER是描述性别的好工具,但是通过足够的训练句子,你可能会得到不错的结果。由于NER使用基于句子训练集中周围标记的模型来建立命名实体的存在,因此它在识别性别方面无能为力。您最好找到所有人名,然后引用您知道是男性或女性的名字索引以获得匹配。此外,一些名字,如Pat,既是男性又是女性,在大多数文本数据中,没有迹象表明它既不是人类也不是机器。话虽如此,您可以分别创建男性和女性模型,也可以在同一模型中创建不同的实体类型。您可以使用这样的注释(使用不同的实体类型名称 male.person 和 woman.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 = 命名实体识别

呵呵


答案 2

推荐