如何为公司名称数据实施实体共指?
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 家唯一数量的公司。
您可以使用现有的知识图之一,例如
此外,如果您只对实体的可能名称感兴趣,请检查 AIDA 它是一个开源 java 命名实体消歧(类似于维基百科矿工)。您只能使用那里的数据集,因为它具有每个实体的一组可能名称和上下文短语。英文资源丰富
可以使用类型系统过滤实体。
您有 41.000 家独特的公司,您想要合并
所有相似的名字。我相信你需要做两件事:
- 设计一个相似度函数来比较任意两个给定的公司名称
- 找到一种有效的方法来比较数据集中的所有姓名
对于相似性度量,并考虑到您提供的小样本,我注意到 3 种不同类型的名称:
- 首字母缩写词:'AEP' 是 'American Electric Power'
的首字母缩写词
- 单令牌名称:'Chase'
- 多令牌名称:'American Electric Power'
我相信你的指标必须考虑到这些,我会给你
我的 post.
末尾的一些建议
为了进行有效比较,我建议使用 Sorted Neighborhood Method 方法,它包含 3 个步骤:
创建一个排序键:根据公司名称定义一个键,可以是简单的名称第一个字符串的第一个字母,也可以是更复杂的由子字符串组成的东西来自公司名称;
排序数据:名称按照第一步定义的key进行排序;
合并:固定大小 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 库实现了其中的一些:
- http://www.chokkan.org/software/simstring/
- https://github.com/seatgeek/fuzzywuzzy
- http://secondstring.sourceforge.net/
为了检测首字母缩略词,我建议 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。
我有这样的公司名称列向量数据:
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 家唯一数量的公司。
您可以使用现有的知识图之一,例如
此外,如果您只对实体的可能名称感兴趣,请检查 AIDA 它是一个开源 java 命名实体消歧(类似于维基百科矿工)。您只能使用那里的数据集,因为它具有每个实体的一组可能名称和上下文短语。英文资源丰富
可以使用类型系统过滤实体。
您有 41.000 家独特的公司,您想要合并 所有相似的名字。我相信你需要做两件事:
- 设计一个相似度函数来比较任意两个给定的公司名称
- 找到一种有效的方法来比较数据集中的所有姓名
对于相似性度量,并考虑到您提供的小样本,我注意到 3 种不同类型的名称:
- 首字母缩写词:'AEP' 是 'American Electric Power' 的首字母缩写词
- 单令牌名称:'Chase'
- 多令牌名称:'American Electric Power'
我相信你的指标必须考虑到这些,我会给你 我的 post.
末尾的一些建议为了进行有效比较,我建议使用 Sorted Neighborhood Method 方法,它包含 3 个步骤:
创建一个排序键:根据公司名称定义一个键,可以是简单的名称第一个字符串的第一个字母,也可以是更复杂的由子字符串组成的东西来自公司名称;
排序数据:名称按照第一步定义的key进行排序;
合并:固定大小 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 库实现了其中的一些:
- http://www.chokkan.org/software/simstring/
- https://github.com/seatgeek/fuzzywuzzy
- http://secondstring.sourceforge.net/
为了检测首字母缩略词,我建议 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。