如何为公司名称数据实施实体共指?

How do I implement entity coreferencing for company name data?

我有这样的公司名称列向量数据:

Var1
AEP
American Electric Power
AEP - Ohio
Chase Bank
JP Morgan
Chase

我想弄清楚如何解决此数据集中的指代。我一直在想办法使用 Wikipedia miner 来解决这个问题,但我不知道它是如何工作的,也不知道如何使用它。是否存在可以查找与同一公司相关的不同名称实例的工具?

换句话说,我想合并同一家公司的相似名称(例如 AEP、American Electric Power 和 AEP - Ohio 都是一家公司,Chase Bank、Chase 和 JP Morgan 也是一家公司)。该列有超过 41,000 家唯一数量的公司。

您可以使用现有的知识图之一,例如

  • DBpedia
  • YAGO3:实体名称附加到关系(不确定)和rdf:label
  • BabelNet : 只有一个 API

此外,如果您只对实体的可能名称感兴趣,请检查 AIDA 它是一个开源 java 命名实体消歧(类似于维基百科矿工)。您只能使用那里的数据集,因为它具有每个实体的一组可能名称和上下文短语。英文资源丰富

可以使用类型系统过滤实体。

您有 41.000 家独特的公司,您想要合并 所有相似的名字。我相信你需要做两件事:

  • 设计一个相似度函数来比较任意两个给定的公司名称
  • 找到一种有效的方法来比较数据集中的所有姓名

对于相似性度量,并考虑到您提供的小样本,我注意到 3 种不同类型的名称:

  1. 首字母缩写词:'AEP' 是 'American Electric Power'
  2. 的首字母缩写词
  3. 单令牌名称:'Chase'
  4. 多令牌名称:'American Electric Power'

我相信你的指标必须考虑到这些,我会给你 我的 post.

末尾的一些建议

为了进行有效比较,我建议使用 Sorted Neighborhood Method 方法,它包含 3 个步骤:

  1. 创建一个排序键:根据公司名称定义一个键,可以是简单的名称第一个字符串的第一个字母,也可以是更复杂的由子字符串组成的东西来自公司名称;

  2. 排序数据:名称按照第一步定义的key进行排序;

  3. 合并:固定大小 window 被移动通过名称的顺序列表,以便将匹配记录的比较限制为 window 中的那些记录。如果 window 的大小是 w,那么每个进入 window 的新名称都会与之前的 w-1 个名称进行比较,以找到 "matching" 个名称。

例如,假设您的密钥由第一个字符串的第一个字母定义,您的列表将按如下顺序排列:

AEP
American Electric Power
AEP - Ohio
Chase Bank
Chase
JP Morgan

现在使用尺寸为 3 的 window 进行比较,您首先只需比较:

AEP
American Electric Power
AEP - Ohio

如果你的相似度函数考虑了首字母缩写词,它会发现 AEP 是 American Electric Power 的首字母缩写词,并将两者合并。您现在可以保留两个字符串作为同一公司名称的表示,或者只选择一个,假设您同时保留两个字符串:

['AEP, 'American Electric Power']
AEP - Ohio
Chase Bank

现在您将 'AEP - Ohio' 与 ['AEP'、'American Electric Power'] 进行比较,再次取决于您定义函数的方式,这可能是匹配,例如,您可以看到重叠'AEP - Ohio' 和 'AEP' 的结果为 0.5(即,假设您丢弃了“-”),另外您还可以检查 'AEP - Ohio' 中是否有一个序列是 'American Electric Power'.

['AEP', 'American Electric Power','AEP - Ohio'] 
Chase Bank
Chase

现在比较下一个应该给现在匹配,我们前进 window:

Chase Bank
Chase
JP Morgan

此处您的相似度函数应匹配 'Chase' 和 'Chase Bank'。在末尾, 你会:

['AEP', 'American Electric Power', 'AEP - Ohio']
['Chase Bank', 'Chase']
JP Morgan

注意,有很多 algorithms to estimate string similarity,这里有 Python 和 Java 库实现了其中的一些:

为了检测首字母缩略词,我建议 A Simple Algorithm for Identifying Abbreviation Definitions in Biomedical Text by A.S Schwartz and M.A. Hearst. The Java implementation is available here. I applied this algorithm to the English Wikipedia, you can see the results here