确认实体的最佳方法
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
我觉得不太好,因为:
- 我读过we need many sentences to train a good model
- 那些不是"sentences"我没有"context"(记得我在哪里说文档类似于resume/cv)
- 可能这些词组太短了
我不知道我能找到多少种不同的方式来表达确切的意思,但我肯定找不到 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搜索,最好从调查开始
此时编程真的是一门艺术。您必须找到一种系统用户将严格使用您的字段的方法,以便您可以将它们读取为 [实体值]。
我现在想到的是你的想法,这个编程工具如何识别代码中的错误并突出显示错误的原因?
我的 2 美分..希望这有帮助。
我对这些项目的种类很感兴趣!
我想了解解决以下问题的最佳方法。
我有与 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
我觉得不太好,因为:
- 我读过we need many sentences to train a good model
- 那些不是"sentences"我没有"context"(记得我在哪里说文档类似于resume/cv)
- 可能这些词组太短了
我不知道我能找到多少种不同的方式来表达确切的意思,但我肯定找不到 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搜索,最好从调查开始
此时编程真的是一门艺术。您必须找到一种系统用户将严格使用您的字段的方法,以便您可以将它们读取为 [实体值]。
我现在想到的是你的想法,这个编程工具如何识别代码中的错误并突出显示错误的原因?
我的 2 美分..希望这有帮助。
我对这些项目的种类很感兴趣!