16

我正在开发一个应用程序,该应用程序尝试将一组可能“混乱”的实体名称与参考列表中的“干净”实体名称进行匹配。我一直在使用编辑距离和其他常见的模糊匹配算法,但我想知道是否有更好的方法允许词权重,这样常见的词在模糊匹配中的权重较小。

考虑这个例子,使用 Python 的difflib库。我正在使用组织名称,它们具有许多共同的标准化组件,因此不能用于区分实体。

from difflib import SequenceMatcher  
e1a = SequenceMatcher(None, "ZOECON RESEARCH INSTITUTE", 
                            "LONDON RESEARCH INSTITUTE")
print e1a.ratio()
0.88

e1b = SequenceMatcher(None, "ZOECON", "LONDON")
print e1b.ratio() 
0.333333333333

e2a = SequenceMatcher(None, "WORLDWIDE SEMICONDUCTOR MANUFACTURING CORP",
                            "TAIWAN SEMICONDUCTOR MANUFACTURING CORP")
print e2a.ratio() 
0.83950617284

e2b = SequenceMatcher(None, "WORLDWIDE",
                            "TAIWAN")
print e2b.ratio() 
0.133333333333

这两个示例在完整字符串上的得分都很高,因为RESEARCH, INSTITUTE, SEMICONDUCTOR, MANUFACTURING, 和CORP是许多组织名称中的高频通用术语。我正在寻找有关如何将术语频率集成到模糊字符串匹配中的任何想法(不一定使用difflib),这样分数就不会受到常用术语的影响,结果可能看起来更像“e1b”和“e2b” “ 例子。

我意识到我可以制作一个大的“常用词”列表并将其排除在比较之外,但如果可能的话,我想使用频率,因为即使是常用词也会添加一些信息,而且任何列表的截止点当然也会随意。

4

4 回答 4

2

how about splitting each string into a list of words, and running your comparison on each word to get a list which holds the scores of word matches. then you can average the scores, find the lowest/highest indirect match or partials...

gives you the ability to add your own weight.

you would of course need to handle offsets like..

"the london company for leather"

and

"london company for leather"

于 2012-10-10T18:16:15.530 回答
2

这是一个奇怪的想法:

压缩您的输入并进行比较。

您可以使用例如Huffman字典编码器来压缩您的输入,它会自动处理常用术语。不过,对于拼写错误,它可能效果不佳,在您的示例中,London 可能是一个相对常见的词,而拼写错误的 Lundon 则根本不是,压缩术语之间的差异远高于原始术语之间的差异。

于 2012-10-08T19:20:35.690 回答
1

我只是提出另一种不同的方法。既然您提到实体名称来自参考列表,我想知道您是否有其他上下文信息,例如共同作者姓名、产品/论文标题、地址 w/ 城市、州、国家/地区?

如果您确实有上述一些有用的上下文,您实际上可以根据它们之间的关系构建实体图。关系可以是,例如:

 Author-paper relation
 Co-author relation
 author-institute relation
 institute-city relation
 ....

然后是时候使用详细描述的基于图的实体解析方法了:

该方法在合著者论文领域有很好的表现。

于 2012-10-21T02:21:02.537 回答
1

在我看来,一个通用的解决方案永远不会符合您对相似性的看法。一旦你对你的数据有了一些隐含的知识,你就必须以某种方式将其放入代码中。这立即取消了固定的现有解决方案的资格。

也许您应该查看http://nltk.org/以了解一些 NLP 技术。您没有告诉我们有关您的数据的足够信息,但是 POS 标记器可能有助于识别更多和更少相关的术语。包含城市、国家名称的可用数据库......可能有助于在进一步处理数据之前清理数据。

有许多可用的工具,但要获得高质量的输出,您需要一个针对您的数据和用例定制的解决方案。

于 2012-10-08T19:43:18.187 回答