我希望通过关注系统中双打最多的歌曲来清理我的音乐库。我可以将它们全部列出,然后手动排序,但这需要很长时间。我希望列表对最可能的重复项进行排序。因此,如果一首歌有10个重复,那就意味着有10个相似的歌曲,因此我会首先关注那首歌,以保持最佳版本。
我可以使用levenshtein字符串比较技术和gem
来比较两个歌名require 'levenshtein'
Levenshtein.distance("string1", "string2") => 1
但是,假设我有x个歌曲,我必须将每首歌曲进行x次比较,因为我不能依赖正常的文件归档,我会错过一些重复的歌曲。例如
The Beatles - Hey Jude
Beatles, The - hey jude
Beatles_-_Hey_Judy_(remastered)
应该给披头士乐队 - 嘿judy(x3)
有没有办法根据文件名生成索引,然后可以对其进行排序,并按降序排列所有重复项?一种可以比较的哈希值?
我知道其他音乐比较方法,但它们有缺陷,这也可用于比较其他类型的文件。
答案 0 :(得分:3)
尝试使用此代码
files
是一个文件名数组,max_distance
是考虑名称相似的最大距离。
hash = {}
files.each do |file|
similar = hash.keys.select { |f| Levenshtein.distance(f, file) < max_distance }
if similar.any?
hash[similar.first] += 1
else
hash.merge!({file => 0})
end
end
之后,您将获得hash
,其中文件名为键,“重复”计为值,您可以根据需要对其进行排序。