确认实体的最佳方法

Best method to confirm an entity

我想了解解决以下问题的最佳方法。

我有与 resume/cv 非常相似的文档,我必须提取实体(姓名、姓氏、生日、城市、邮政编码等)。

为了提取这些实体,我结合了不同的查找器(正则表达式、字典等)

这些发现者没有问题,但是,我正在寻找一种方法/算法或类似的东西来确认实体。

使用 "confirm" 我的意思是我必须在近似值(更接近我找到的实体)中找到特定的术语(或实体)。

示例:

My name is <name>
Name: <name>
Name and Surname: <name>

我可以确认实体 <name> 因为它更接近让我理解 "context" 的特定术语。如果我在实体附近有 "name" 或 "surname" 单词,那么我可以说我很有可能找到了 <name>

所以目标是编写那些类型的规则来确认实体。另一个例子应该是:

My address is ......, 00143 Rome

意大利邮政编码是 5 位长(仅限数字),很容易在我的文档中找到 5 位数字(我使用上面写的正则表达式),我还通过查询数据库来检查它以了解是否号码存在。这里的问题是我需要再检查一次以确认(肯定)它。

我必须看看那个数字是否在实体附近 <city>,如果是,好的...我有很好的概率。

我也试过训练一个模型,但我真的没有"context"(句子)。 训练模型:

My name is: <name>John</name>
Name: <name>John</name>
Name/Surname: <name>John</name>
<name>John</name> is my name

我觉得不太好,因为:

  1. 我读过we need many sentences to train a good model
  2. 那些不是"sentences"我没有"context"(记得我在哪里说文档类似于resume/cv)
  3. 可能这些词组太短了

我不知道我能找到多少种不同的方式来表达确切的意思,但我肯定找不到 15000 种方式:)

我应该使用什么方法来尝试确认我的实体?

非常感谢!

问题陈述

首先,我不认为您将任务分解为 2 个步骤(提取和确认)是最好的,只要我不遗漏问题中的某些细节即可。如果我理解正确,您的目标是以最大的精度和召回率从文档集中提取结构化信息,例如 Name/City/etc;任何一个指标都可能更重要,但通常它们被认为具有相同的权重 - 例如通过使用 F1-measure.

先评价

'你无法控制你无法衡量的东西'Tom DeMarco

我建议首先准备评估系统并标记数据集:为每个文档找到正确的 Name/City/etc - 它可以完全手动完成(这更多 'true',但更难) 或半自动,例如通过应用一些方法,包括正在开发的方法,并纠正其错误(如果有)。 评估系统应该能够计算 Precision 和 Recall(参见 Confusion matrix 以便您自己轻松实现)。

至于它的大小,我不会因为需要准备太大的数据集而害怕:当然,越多越好,但对于复杂(显着非线性)任务和大量任务的情况至关重要的特点。我相信 100-200 个文档足以开始您的案例 - 准备需要几个小时。

然后您可以根据 RegExp 和字典评估您的简单提取器 - 最好是不同方面(名称或城市)有单独的指标。根据结果​​,您的操作可能会有所不同。

低精度 - 添加更具体的特征

如果该方法的精度太低,即提取了太多错误的项目,则应添加特异性或特定特征;如果您对此类信息感兴趣,我会在专门针对特定信息类型的信息提取的科学论文中搜索它们,无论是 Name/Surname 还是地址,或者诸如技能之类的更模糊的东西。例如,许多致力于 Resume 解析的论文(如 [2] and [3])注意到 Name/Surname 通常放在文本的最开头;或者城市通常以 'at' 开头。 我不知道你们文档的细节,但我怀疑它们违反了这种模式。

处理命名实体识别器的输出也可能有用且容易,例如Standord NLP, as a feature (see also relevant question)

同样,更难但更好的是分析 NERC 使用的方法并使它们适应您的任务和文档的细节。

这些特征可以通过任何监督机器学习进行聚合​​(如果您没有太多经验,可以从逻辑回归和随机森林开始):您从评估数据集中知道肯定和否定(所有但不是肯定的)答案,只需转换它们进入功能 space 并提供给一些 ML 库,如 Weka.

低召回率 - 提取更多候选人

如果该方法显示召回率太低,即遗漏了很多项目,那么您应该扩展候选集 - 例如,开发限制较少的模式,添加模糊匹配(查看 Jaro-Winkler or Soundex 字符串指标)字典查找。

另一种选择是应用词性标记并将每个名词作为候选名词——可能是某些信息项的每个专有名词,或者采用名词双字母组,或者添加其他弱限制。在这种情况下,您的精度很可能会降低,因此必须考虑上面的段落。

注意:如果您的数据来自网络(例如来自 LinkedIn 的个人资料),请尝试按关键字搜索 'Web data extraction' 或查看 import.io

文学

随便找几个,尝试在Google scholar搜索,最好从调查开始

  1. Renuka S. Anami,Gauri R. Rao。自动配置文件提取和 使用斯坦福算法进行分类。国际期刊 创新技术与探索工程 (IJITEE) ISSN: 2278-3075,第 4 卷第 7 期,2014 年 12 月 (link)

  2. Swapnil 声纳。使用命名实体聚类恢复解析 算法。 2015 (link)

此时编程真的是一门艺术。您必须找到一种系统用户将严格使用您的字段的方法,以便您可以将它们读取为 [实体值]。

我现在想到的是你的想法,这个编程工具如何识别代码中的错误并突出显示错误的原因?

我的 2 美分..希望这有帮助。

我对这些项目的种类很感兴趣!