如何确定两个相似的波段名称是否代表相同的波段?
我目前正在开展一个项目,要求我将我们的乐队和场地数据库与一些外部服务相匹配。
基本上我正在寻找确定两个名称是否相同的最佳方法的方向。 例如:
- 我们的数据库地址名称 – “The Pig and Whistle”
- 服务1 – “猪和口哨”
- 服务2 – “猪与口哨”
- 等等
我认为主要的不同之处在于缺少“the”或使用“&”而不是“and”,但也可能会出现不同命令中略有不同的拼写和单词的情况。
在这种情况下通常使用哪些算法/技术,我是否需要过滤干扰词或进行某种拼写检查类型匹配?
你在c#中看过任何类似的东西的例子吗?
更新:如果有人对ac#example感兴趣,你可以通过google代码搜索Levenshtein距离访问一个堆
规范(也可能是最简单)的方法是测量两个弦之间的Levenshtein距离 。 如果距离相对于字符串的大小较小,则可能是相同的字符串。 请注意,如果你必须比较很多非常小的字符串,那么就更难判断它们是否相同。 使用更长的字符串时效果更好。
一种更聪明的方法可能是比较两个弦之间的Levenshtein距离,但是将距离零指定为更明显的变换,例如“和”/“&”,“Snoop Doggy Dogg”/“Snoop”等。
我刚才做了类似的事情,我使用了Discogs数据库(这是公共领域),它也跟踪艺术家别名;
你可以:
- 使用API调用 (
namevariations
字段)。 - 下载每月数据转储 (
*_artists.xml.gz
)并将其导入数据库。 它包含相同的数据,但显然要快得多。
这相对于Levenshtein距离解决方案的一个优点是,您将获得更少的错误匹配。
例如, Ryan Adams
和Bryan Adams
得分为2
,这是相当不错的(较低的是更好的比赛, Pig and Whistle
以及Pig & Whistle
得分为3
),但他们显然是不同的人。
虽然你可以制作一个更聪明的算法(例如,它也会查看字符串长度),但使用别名DB会更简单,更少错误的电话; 实现这一点后,我可以完全删除其他答案中建议的解决方案,并有更好的匹配。
soundex也可能有用
在生物信息学中,我们使用它来比较DNA或蛋白质序列。
有很多算法,您可能希望查看全局对齐 。
在这方面, Needleman-Wunsch算法可能就是您所寻求的。
如果您有特别长的重复字符串进行比较,您可能还需要考虑像BLAST这样的启发式搜索。