14

我目前正在开展一个项目,该项目需要我将我们的乐队和场地数据库与许多外部服务相匹配。

基本上,我正在寻找确定两个名称是否相同的最佳方法的方向。例如:

  • 我们的数据库场地名称 - “The Pig and Whistle”
  • 服务 1 - “猪和哨子”
  • 服务 2 - “猪与哨子”
  • 等等等等

我认为主要区别在于缺少“the”或使用“&”而不是“and”,但也可能存在拼写略有不同和单词顺序不同等问题。

在这种情况下通常使用哪些算法/技术,我是否需要过滤噪音词或进行某种拼写检查类型匹配?

你见过 c# 中类似的例子吗?

更新:如果有人对 ac# 示例感兴趣,您可以通过谷歌代码搜索 Levenshtein 距离来访问一个堆

4

4 回答 4

14

执行此操作的规范(可能是最简单的)方法是测量两个字符串之间的Levenshtein 距离。如果距离相对于字符串的大小较小,则可能是相同的字符串。请注意,如果您必须比较许多非常小的字符串,则很难判断它们是否相同。它适用于更长的字符串。

一个更聪明的方法可能是比较两个字符串之间的 Levenshtein 距离,但将距离分配给更明显的转换,例如“and”/“&”、“Snoop Doggy Dogg”/“Snoop”等。

于 2009-12-17T01:03:56.703 回答
1

不久前我做过类似的事情,我使用了 Discogs 数据库(这是公共领域),它也跟踪艺术家别名;

您可以:

  • 使用API 调用namevariations字段)。
  • 下载每月数据转储( *_artists.xml.gz) 并将其导入您的数据库。这包含相同的数据,但显然要快得多。

与Levenshtein 距离)解决方案相比,此方法的一个优点是您将获得更少的错误匹配。
例如,Ryan Adams并且Bryan Adams得分为2,这非常好(越低匹配越好,Pig and Whistle得分Pig & Whistle3),但他们显然是不同的人。

虽然您可以制定更智能的算法(例如,它还查看字符串长度),但使用别名 DB 更简单且错误更少;实施此操作后,我可以完全删除其他答案中建议的解决方案并获得更好的匹配。

于 2014-08-11T10:51:01.410 回答
0

soundex也可能有用

于 2009-12-17T01:19:24.970 回答
0

在生物信息学中,我们一直使用它来比较 DNA 或蛋白质序列。

有很多算法,你可能想看看global alignments

在这方面,Needleman-Wunsch 算法可能就是您所寻求的。

如果您有特别长的重复字符串要比较,您可能还需要考虑启发式搜索,例如 BLAST。

于 2009-12-17T01:49:19.033 回答