중복 요소와 루비 어레이 교차로를 반환하는 방법은 무엇입니까? (주사위 계수에서 Bigrams의 문제)

StackOverflow https://stackoverflow.com/questions/1600168

문제

DICE의 계수를 스크립트하려고하지만 배열 교차점에 약간의 문제가 있습니다.

def bigram(string)
  string.downcase!
  bgarray=[]
  bgstring="%"+string+"#"
  bgslength = bgstring.length
  0.upto(bgslength-2) do |i|
    bgarray << bgstring[i,2]
   end
   return bgarray
 end

def approx_string_match(teststring, refstring)
  test_bigram = bigram(teststring) #.uniq
  ref_bigram = bigram(refstring)   #.uniq

  bigram_overlay = test_bigram & ref_bigram

  result = (2*bigram_overlay.length.to_f)/(test_bigram.length.to_f+ref_bigram.length.to_f)*100

  return result
end

문제는 AS & AS 및 제거를 제거한다는 것입니다.

string1="Almirante Almeida Almada"
string2="Almirante Almeida Almada"

puts approx_string_match(string1, string2) => 76.0%

100을 반환해야합니다.

UNIQ 메소드는 그것을 못 박았지만 정보 손실이 있으며, 이는 내가 작동하는 특정 데이터 세트에서 원치 않는 일치를 가져올 수 있습니다.

포함 된 모든 복제물과 교차로를 어떻게 얻을 수 있습니까?

도움이 되었습니까?

해결책

처럼 Yuval F 사용해야한다고 말했습니다 multiset. 그러나 아무도 없습니다multiset Ruby Standard Library에서는 살펴보십시오 여기 그리고 여기.

성능이 애플리케이션에 그다지 중요하지 않은 경우에도 여전히 사용 할 수 있습니다.Array 약간의 코드로.

def intersect  a , b  
    a.inject([]) do |intersect, s|
      index = b.index(s)
      unless index.nil?
         intersect << s
         b.delete_at(index)
      end
      intersect        
    end
end

a=  ["al","al","lc" ,"lc","ld"]
b = ["al","al" ,"lc" ,"ef"]
puts intersect(a ,b).inspect   #["al", "al", "lc"]

다른 팁

에서 이 링크 나는 당신이 루비의 세트를 사용해서는 안되지만 다중 집합을 사용해야한다고 생각합니다. 아마 당신은 사용할 수 있습니다 이 보석 멀티 셋의 경우. 이것은 반복되는 Bigrams에 대한 올바른 행동을 제공해야합니다.

나는 @pierr의 답변을 바탕으로 한동안 이것으로 장난감을 가지고 결국 이것으로 끝났다.

a = ["al","al","lc","lc","lc","lc","ld"]
b = ["al","al","al","al","al","lc","ef"]
result=[]
h1,h2=Hash.new(0),Hash.new(0)
a.each{|x| h1[x]+=1}
b.each{|x| h2[x]+=1}
h1.each_pair{|key,val| result<<[key]*[val,h2[key]].min if h2[key]!=0}
result.flatten

=> ["al", "al", "lc"]

이것은 일종의 멀티 세트 교차 일 수 있습니다 a & b 그러나 확실하게 테스트하지 않았기 때문에 내 말을 받아들이지 마십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top