2012-10-30 5 views
1

내 데이터베이스에는 예를 들어 항목이 있습니다. 배열에 Тормозной диск, Диски тормозные LPR 등. 나는 그런 Диски тормозные LPRRuby에서 유사한 문자열 감지.

이 코드로 Тормозной диск와 유사한 모든 항목을 찾을 싶습니다 :

art_groups_arr.each do |artgrarr| 
    if n2.art_group.include?(artgrarr) 
    non_original << n2 
    end 
end 

분명히 찾을 수 없습니다. 비슷한 문자열을 어떻게 찾을 수 있습니까?

+0

왜 그렇습니까? – oldergod

+0

@oldergod 많은 글자가 있기 때문에 : D하지만 sence는 같지만 ... 컴퓨터에는 IO가 없지만이 예제에서는이를 소개하는 방법이 있습니다 ... – brabertaser19

+0

나는 당신이 Диски Тормозные 또는 Тормозные Диски이 배열에 존재하는지 여부. –

답변

1

당신은 아마도 예를 들어, 정규 표현식을 사용할 수 있습니다 또는

art_groups_arr.each do |art_gr_arr| 
    if n2.art_group.any? { |element| 
    /ормозн/ =~ element and /диск/ =~ element 
    } then non_original << n2 end 
end 

, 스미스 - 워터맨 알고리즘을 구현하는 주장 you can try out fuzz_ball gem을. 0.861 점수

require 'fuzz_ball' 
THRESHOLD_SCORE = 0.75 
MATCHER = FuzzBall::Searcher.new [ 'Тормозной диск LPR' ] 

def complies?(str) 
    matchdata = MATCHER.search str 
    return false if matchdata.nil? or matchdata.empty? 
    score = matchdata[0][:score] 
    puts "score is #{score}" 
    score > THRESHOLD_SCORE 
end 

art_groups_arr.each do |art_gr_arr| 
    if n2.art_group.any? { |element| complies? element } then 
    non_original << n2 
    end 
end 

'Диски тормозные LPR'를 들어 당신은 당신이 조정 임계 값을 얻을.

+0

범용이어야합니다 .... – brabertaser19

+0

그런 경우 문자열 분류 알고리즘이 필요합니다. 결정을 내리고 먼저 결정해야합니다. 예를 들어 'Тормозный Диск'에서 문자열의 거리를 계산할 수 있습니다. 이러한 알고리즘은 예를 들어 biolgy에서의 서열 비교에 사용됩니다. –

+0

[여기에, 문자열 통계, 하나를 선택 ...] (http://en.wikipedia.org/wiki/String_metric) 나는 Smith-Waterman 알고리즘과 같은 것을 제안 할 것이다. –

관련 문제