完成两个cs课程后,我开始研究Java中的个人项目。我正在编写一个程序,它将查看音乐集,并尝试通过查看文件名和元标记来设置“Composer”标记。我将这些作为一个简单的文本文件创建的作曲家列表进行比较。我的问题是:
比较两个字符串以尝试找到最佳匹配类型的好方法是什么?例如,在我的情况下,假设我有一个名为'Pulenc - 格洛丽亚在excelsis Deo.flac'的文件。在我的作曲家名单中,我有'Poulenc,Francis'。我希望能够阅读'Pulenc',并且看到它非常接近'Poulenc',这样我就可以正确设置作曲家标签了。一位朋友建议我研究使用余弦距离(我之前从未听说过)和另一个推荐的Levenshtein距离。这些方法中的任何一种都是一种好的方法,还是有其他可能更好的方法?
答案 0 :(得分:5)
听起来Levenshtein Distance正是您所需要的。 Cosine Distance似乎处理较长的文本,而像{Soundex} phonetic algorithms可能会对名称产生不良结果,其中大多数都不打算使用英语发音规则发音。
答案 1 :(得分:2)
由英国的project called SimMetrics运营的University of Sheffield可以帮助您。我从.NET的角度写了一些关于它的in my blog,但我相信该项目还有一个Java实现。
答案 2 :(得分:0)
Levenshtein distance是一个合理的想法,尽管如果你的系统中有很多作曲家,它可能表现不佳。与Soundex(或Metaphone或NYSIIS)不同,编辑距离算法可让您将拼写错误的作曲家名称与系统中的其他所有作曲家进行比较。根据有多少,这可能需要一段时间。
作为(过早?)优化,对于名字以正确字母开头的作曲家来说,计算Levenshtein距离可能是值得的。
答案 3 :(得分:0)
Peter Norvig撰写了一篇精彩的文章"How to Write a Spelling Corrector",您可能会发现它很有用,并且可以根据您的具体需求进行调整。
答案 4 :(得分:0)
顺便说一下,Apache Commons Lang lib实现了Levenshtein距离计算器:http://commons.apache.org/lang/api-release/org/apache/commons/lang/StringUtils.html#getLevenshteinDistance(java.lang.String,%20java.lang.String)
答案 5 :(得分:0)
我认为在你的情况下Damerau–Levenshtein distanc e应该可以正常工作。如果您有更多数据,请使用它。在缺乏良好算法的情况下,大量数据可以补偿。