0

我想清理我的音乐库,将注意力集中在系统上双打最多的歌曲上。我可以将它们全部列出,排序并手动完成,但这会花费太长时间。我希望列表对最可能的重复项进行排序。因此,如果一首歌曲有 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)

应该给披头士乐队 - 嘿朱迪(x3)

有没有办法根据文件名生成索引,然后可以排序并按降序给出所有重复项?一种可以比较的哈希?

我知道其他音乐比较方法,但它们有缺陷,这也可以用于比较其他类型的文件。

4

1 回答 1

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,其中文件名作为键,“重复”计为值,您可以根据需要对其进行排序。

于 2012-04-28T19:06:29.350 回答