2012-04-28 12 views
0

私の音楽ライブラリを整理するために、私のシステムで最も倍増している曲に注意を払います。私はちょうどそれらをすべてリストし、並べ替え、手動で行うことができますが、それは時間がかかりすぎます。私は、リストが最も重複したものを並べ替えるようにしたい。だから、曲に10個の重複がある場合は、お互いに似ている10の曲名があることを意味するので、最初にその曲に注目して、最高のバージョンを保つようにします。インデックスや文字列のインデックスやハッシュを比較する

私はレーベンシュタイン文字列比較技術や宝石を使用して

require 'levenshtein' 
Levenshtein.distance("string1", "string2") => 1 

を使用して2つのsongnamesを比較だがさんは、私は曲のx数を持っているとしましょう可能性があり、私は「私ができるので、それぞれの曲のx回を比較しなければなりません通常のファイル共有に頼っていると、重複してしまいます。例えば

The Beatles - Hey Jude 
Beatles, The - hey jude 
Beatles_-_Hey_Judy_(remastered) 

はビートルズを与える必要があります - ちょっとジュディ(×3)

は、ソートすることができ、降順ですべての重複を与えるだろう、ファイル名に基づいてインデックスを生成する方法はありますか?比較できるハッシュの一種?

私は方法を比較する他の音楽を知っていますが、彼らの欠陥があり、これは他の種類のファイルを比較するのにも役立ちます。

+0

[pHash](https://github.com/toy/pHash)のようなものを見て、実際のオーディオを比較し、それらが一致する信頼水準を与えることができます。 –

+0

はおもしろい宝石のようですが、インストール後に私が必要なときは、C:/Ruby193/lib/ruby/gems/1.9.1/gems/ffi-1.0.11/lib/ffi/library.rb:121:in 'block in ffi_lib ':ライブラリ' .dll 'を開けませんでした:指定されたモジュールが見つかりませんでした。 (LoadError) – peter

+0

宝石が使用する[phashライブラリをダウンロードしてインストールする](http://phash.org/download/)が必要です。 –

答えて

3

max_distanceは、類似した名前を検討する最大距離で、このコード

filesファイル名の配列があるを使用してみてください。

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を、取得する値としてカウントし、あなたが望むようにそれを並べ替えることができます。

+0

ファイルの配列にいくつかの名前をつけてmax_distanceを0に初期化しますが、その結果のハッシュはすべて0になります。例えば、 "Beatles - The Word .mp3" => 0、 "The Beatles - The Word.mp3" => 0 、 "ビートルズ - Tell Me Why(remastered).mp3" => 0}、もう助けてくれますか? – peter

+1

距離= 0は文字列が等しいことを意味します。私が書いたように、ファイル名が類似していると見なされる値を選択する必要があります。それは非常に大きな数値ではありませんが、0にはなりません。実験でそれを拾う。アルゴリズムの詳細についてはhttp://en.wikipedia.org/wiki/Levenshtein_distanceを参照してください。 – Flexoid

+0

大丈夫、ありがとう、私はそれを取得し、いくつかの置換を最初に行う必要があり、比較された文字列の長さの数を取る – peter

関連する問題