如何确定两个相似的波段名称是否代表相同的波段?

时间:2009-12-17 00:58:48

标签: c# string spell-checking

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

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

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

我认为主要区别在于缺少“the”或使用“&”而不是“和”,但也可能有不同的订单中的拼写和单词略有不同。

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

你有没有在c#中看到任何类似的东西的例子?

更新:如果有人对c#示例感兴趣,可以通过执行google code search for Levenshtein distance

来访问堆。

4 个答案:

答案 0 :(得分:14)

规范(可能是最简单)的方法是测量两个字符串之间的 Levenshtein distance 。如果距离相对于字符串的大小较小,则可能是相同的字符串。请注意,如果你必须比较很多非常小的字符串,那么就更难判断它们是否相同。使用更长的字符串可以更好地工作。

更聪明的方法可能是比较两个琴弦之间的Levenshtein距离,但是为了更明显的变换指定零距离,例如“and”/“&”,“Snoop Doggy Dogg”/“Snoop”,等

答案 1 :(得分:1)

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

你可以:

  • 使用API callnamevariations字段)。
  • 下载monthly data dumps*_artists.xml.gz)&将其导入您的数据库。这包含相同的数据,但显然要快得多。

这比Levenshtein distance)解决方案的一个优点是你可以减少错误匹配 例如,Ryan AdamsBryan Adams的得分为2,这是非常好的(较低的是更好的匹配,Pig and WhistlePig & Whistle得分为{ {1}}),但他们显然是不同的人。

虽然您可以制作更智能的算法(例如,也可以查看字符串长度),但使用别名DB会更加简单和简单。错误电话;实施之后,我可以完全删除其他答案中提出的解决方案。有更好的比赛。

答案 2 :(得分:0)

soundex也可能有用

答案 3 :(得分:0)

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

有很多算法,您可能希望查看全局对齐

在这方面,Needleman-Wunsch algorithm可能就是你所寻找的。

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