2 büyük değerler listesi verildiğinde, Spark kullanarak Scala'da jaccard similarity arasında hesaplamaya çalışıyorum.Spark Jaccard benzerlik hesaplaması önemsiz yaklaşımla karşılaştırıldığında min hashing slow
colHashed1
öğesinin ilk listesini içerir ve colHashed2
ikinci listeyi içerir.
Yaklaşım 1 (Bu etkiyi): (minHashing kullanılarak)
val jSimilarity = colHashed1.intersection(colHashed2).distinct.count/(colHashed1.union(colHashed2).distinct.count.toDouble)
yaklaşım 2: yaklaşım kullandık
here açıklanmıştır.
import java.util.zip.CRC32
def getCRC32 (s : String) : Int =
{
val crc=new CRC32
crc.update(s.getBytes)
return crc.getValue.toInt & 0xffffffff
}
val maxShingleID = Math.pow(2,32)-1
def pickRandomCoeffs(kIn : Int) : Array[Int] =
{
var k = kIn
val randList = Array.fill(k){0}
while(k > 0)
{
// Get a random shingle ID.
var randIndex = (Math.random()*maxShingleID).toInt
// Ensure that each random number is unique.
while(randList.contains(randIndex))
{
randIndex = (Math.random()*maxShingleID).toInt
}
// Add the random number to the list.
k = k - 1
randList(k) = randIndex
}
return randList
}
val colHashed1 = list1Values.map(a => getCRC32(a))
val colHashed2 = list2Values.map(a => getCRC32(a))
val nextPrime = 4294967311L
val numHashes = 10
val coeffA = pickRandomCoeffs(numHashes)
val coeffB = pickRandomCoeffs(numHashes)
var signature1 = Array.fill(numHashes){0}
for (i <- 0 to numHashes-1)
{
// Evaluate the hash function.
val hashCodeRDD = colHashed1.map(ele => ((coeffA(i) * ele + coeffB(i)) % nextPrime))
// Track the lowest hash code seen.
signature1(i) = hashCodeRDD.min.toInt
}
var signature2 = Array.fill(numHashes){0}
for (i <- 0 to numHashes-1)
{
// Evaluate the hash function.
val hashCodeRDD = colHashed2.map(ele => ((coeffA(i) * ele + coeffB(i)) % nextPrime))
// Track the lowest hash code seen.
signature2(i) = hashCodeRDD.min.toInt
}
var count = 0
// Count the number of positions in the minhash signature which are equal.
for(k <- 0 to numHashes-1)
{
if(signature1(k) == signature2(k))
count = count + 1
}
val jSimilarity = count/numHashes.toDouble
Yaklaşım 1 defa hep açısından Yaklaşım 2 daha iyi performans gibi görünüyor. Kodu analiz ettiğimde, Yaklaşım 2'deki RDD
'daki min()
işlev çağrısı önemli ölçüde zaman alır ve bu fonksiyonun kaç karma işlevinin kullanıldığına bağlı olarak defalarca çağrılır.
Yaklaşım 1'de kullanılan kesişim ve birleştirme işlemleri, tekrarlanan min() işlev çağrılarına göre daha hızlı çalışıyor gibi görünüyor.
Neden minHashing'in burada yardımcı olmadığını anlamıyorum. MinHashing'in önemsiz yaklaşıma göre daha hızlı çalışmasını bekledim. Burada yanlış yaptığım bir şey var mı?
Örnek veri MinHash ile here
için örnek verileri ekleyebilir miyim senin Veri kümesindeki col1 ve col2? – tuxdna
@tuxdna örnek veri bağlantısı, soru – CRM