是否有任何 NER 模型可以识别名字和姓氏而不仅仅是 PERSON?

Ste*_*veS 7 nlp named-entity-recognition nltk python-3.x spacy

给定一组字符串,例如:

"John Doe"
"Doe John"
"Albert Green"
"Greenshpan David"

...
Run Code Online (Sandbox Code Playgroud)

我想运行一个能够识别名字和姓氏的 NER 模型。我使用的所有英文模型(Spacy、NLTK 等)都给了我 PERSON 实体。

请问有没有已经训练好的模型?

期望的输出:

{"John": "First Name", "Doe": "Last Name"}
{"Doe": "Last Name", "John": "First Name"}
{"Albert": "First Name", "Green": "Last Name"}
{"Greenshpan": "Last Name", "David": "First Name"}
Run Code Online (Sandbox Code Playgroud)

ewz*_*z93 6

嗯,我认为几乎所有重要的 NER 数据集(这些模型在这些数据集上进行训练)都不会区分名字和姓氏。我猜想在正常的完整句子语言中,这种模式last name first name是相当罕见的。我的猜测甚至是,在大多数情况下,主要是上下文决定了哪个先出现。在正常的书面和口语句子中,名字几乎总是排在第一位。在某些列表格式和特定​​数据库中,可能是相反的方式,尽管通常由,.

此外,这种分离在语言中通常是困难和模糊的(甚至比 NER 已经更加困难),因为存在像David Paul/Paul David这样的明显情况,即使对于人类注释者来说也是不可能分辨的。

所以你可以做的是:

  1. 基于规则处理此问题,例如以下方式之一:
    • ,如果实体中有 a ,则假设它是lastname firstname,否则firstname lastname
    • 如果名称所在的句子完整且语法正确,则假设为firstname lastname,否则lastname firstname:为此,您可以使用 SpaCy 的句子分割将句子分割成句子,然后将句子输入到在 CoLA(语言可接受性语料库)任务上训练的任何模型,例如,请参见此演示:示例 1(正确)示例 2(不正确)
    • 从您或任何大型语料库创建可能的名字和姓氏的数据集,例如通过提取实体并将 等之后的所有内容视为可能的姓氏Mr.Dr.由单个单词组成的实体作为可能的名字。也许也有包含流行名字和姓氏的数据库。使用收集的数据集检查名称实体的一部分是作为名字出现的频率更高还是作为姓氏的频率更高。如果未知,则假设较长的部分是姓氏。
  1. 将模型训练/微调为令牌分类任务,方法是自己注释数据,或者首先按照描述收集可能的名字和姓氏,然后自动注释数据(并可选择对其进行后期更正)。解决这个问题的最佳方法可能是微调 BERT 或 RoBERTa 等 Transformer 模型。它们在 NER 上表现相当强,并且在其修改/更细粒度的版本上也可能表现得很好。查看本课程,了解如何微调此类模型。