HELLO, I’M SERHAT AND THIS IS MY FANCY TITLE.

Ruby ile iki veri arasındaki benzerliğin hesaplanması

Bir RoR projesinde, iki farklı veritabanında bulunan ad-soyad ve kimlik numarası verilerinin birbirlerine ne kadar benzediğinin hesaplanması ve farklı veri setlerinin birbiriyle aynı olma olasılığının tespiti gibi bir ihtiyacım olmuştu.

Örneğin aşağıdaki iki veri birbirine ne kadar benziyor, bu kişiler gerçekten aynı kişiler olabilir mi bunu hesaplamam gerekiyordu:

"Ahmet Metin 123456789"
"Ahmet Makin 123123123"

Bu hesaplamayı yapabilmek için Elasticsearch ve Ruby'nin marifetleri yeterli oldu. Elasticsearch'ün Ruby için sağladığı records.each_with_hit metodu ile herhangi iki veri birbirlerine ne kadar benziyor (yakınsıyor) kontrol edebilir ve benzerlik oranını 0-2 aralığında matematiksel olarak alabilirsiniz.

Yazdığım örnek betik şu şekildeydi:

file = File.open("/home/msdundar/file", "w")

User.all.each do |u|
  r = User.search "*#{u.full_name}*"
  file.write("Aranan Terim: #{u.id_number}-#{u.full_name}\n")
  r.records.each_with_hit {|r, hit|}.map{|k, v| "#{k.id_number}-#{k.full_name}:  #{v._score}"}.each do |y|
    unless (u.id_number == y.split("-")[0])
      if y.split(": ")[1].to_f > 1.2
        file.write("                           #{y}\n")
      end
    end
  end
  file.write("***********************************\n\n")
end

Betikte bulunan "1.2" değeri, tamamen benim istediğim yakınlık derecesini ifade etmekte. Daha yüksek yakınlığa sahip verileri tespit etmek için bu değeri arttırabilir, daha geniş bir aralık almak için azaltabilirsiniz. Betik çalıştıktan sonra şöyle bir çıktı veriyor:

Aranan Terim: 14674444966-MUSTAFA SERHAT DÜNDAR
***********************************

Aranan Terim: 11156069590-ÖMER FARUK BULUT
33304078456-ÖMER FARUK DÜNDAR: 2.3747075
22256325768-ÖMER FARUK BOZ: 2.2594523
33315234436-ÖMER FARUK KALINTAŞ: 2.229414
33378500384-ÖMER FARUK ÇEPI: 2.146143
11171764882-ÖMER FARUK SAVAS: 2.146143
55577374544-ÖMER FARUK CAN: 2.0586686
***********************************

Aranan Terim: 22225361388-SEHER NUR NAMLI
***********************************

Aranan Terim: 00027522389-ELIF KALIN
 00022785363-ELIF KALIN: 1.4142135

Kolaylıklar.

Date:
Categories: tech, ruby

Share this post!


Blog Comments powered by Disqus.