2012-04-28 5 views
0

시스템에서 가장 두 배가 많은 노래에주의를 기울여 내 음악 라이브러리를 정리하고 싶습니다. 나는 그 (것)들을 모두 목록으로 만들 수 있고, 그것을 수동으로 분류하고 그것을 할 수 있었다. 그러나 그것은 너무 오랫동안 잡을 것이다. 목록을 가장 가능한 중복으로 정렬하길 원합니다. 그래서 노래에 10 개의 중복이 있다면 그것은 서로 닮은 10 개의 노래 이름이 있다는 것을 의미하므로 가장 좋은 버전을 유지하기 위해 먼저 노래에 집중할 것입니다.문자열 색인 또는 해시 색인 생성 및 비교

난 내가 각 노래의 X 시간을 비교하는 것은이 levenshtein의 문자열 비교 기술과 보석

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

를 사용하여 두 songnames 비교 그러나이 전 곡의 X 번호를 가정 해 봅시다 수 '내가 할 수 있기 때문에 정상적인 파일 정렬에 의지 할 때, 필자는 몇 가지 중복 된 것을 놓치고 싶다. 예를 들어

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

는 비틀즈를 제공해야합니다 - 헤이 주디 (X3)

다음 정렬 할 수 있습니다 내림차순의 모든 중복을 줄 것 파일 이름을 기준으로 인덱스를 생성하는 방법이 있나요? 비교할 수있는 해시의 종류?

나는 다른 음악을 비교하는 방법을 알고 있지만 결함이 있으며 다른 유형의 파일을 비교하는 데에도 유용 할 것입니다.

+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 , "Beatles - Tell Me Why (Remastered) .mp3"=> 0}, 제발 좀 더 도와 줄 수 있어요? – peter

+1

distance = 0은 문자열이 동일 함을 의미합니다. 필자가 작성한 것처럼 파일 이름이 비슷한 것으로 간주되는 값을 선택해야합니다. 매우 큰 숫자가 아니어야 0이되지 않습니다. 실험으로 가져와. 알고리즘에 대한 자세한 내용은 http://en.wikipedia.org/wiki/Levenshtein_distance를 참조하십시오. – Flexoid

+0

좋아, 고마워, 먼저 교체를하고 비교 문자열의 길이를 계산해야 해. – peter