Benzer yazı analizi 1
Benzer yazıları bulup, ziyaretçiye öneri göstermek zannettiğimden çok daha zor gibi görünüyor. Bir yandan düzgün bir algoritma oluşturmaya çalışırken, bir yandan da şu anda katettiğim yolu (her ne kadar çok olmasa da) aktarayım istedim.
Yazıların benzerliklerini hesaplamak için, Text similarity: an alternative way to search MEDLINE adlı makalede kosinüs katsayısı (Cosine Coefficient) formülünü gördüm (daha önce de başka bir yerde görmüştüm bu formülü, ama çıkartamıyorum şimdi :) ) ve denemeye karar verdim. Şimdilik, kelime ağırlıklarını formüle eklemeden bir deneme yaptım. Şu şekilde bir python dosyası ortaya çıktı:
Bahsettiğim yazıda geçen formülü birebir uygulamaya çalıştım. kelimeleriAl fonksiyonunda, bir makelede geçen tüm tekil kelimeleri döndürüyorum. Sonra döngünün içerisinde karşılaştırılan her iki makale için bir vektör (vektör denir değil mi ona?) oluşturuyorum.
Vektör oluşturma işleminde, tumKelimeler (içinde tüm tekil kelimeleri barındıran liste) içerisinde her kelime için, eğer o kelime makaleye dahilse, o makalenin vektörüne 1, değilse 0 ekliyorum. Daha sonra da, bahsettiğim linkde gösterilen formülü uyguluyorum. Birkaç sonuç örneği verirsek:
Django şablonlarında php ve 0'dan blog'a Django(1) => 0.951225 Django South göçünde "unique" alan hatası ve 5 Django İpucu => 0.923972 Django'da Abstract Modeller ve 0'dan Bloga Django(3) => 0.917118 Django'da Url Taşıma ve 0'dan Bloga Django(4) => 0.851807 . . . Django ve Url Düzeltme ve Python range ve xrange => 0.161989 If..Else yada Try..Except, hangisi ne zaman kullanılmalı? ve Python range ve xrange => 0.158546 Django Modelleriyle Paket Yöneticisi ve Python range ve xrange => 0.155110
Doğrusunu söylemek gerekirse, bu algoritmadan aldığım sonuçlar çok tatmin edici olmadı. Bunun nedeninin de kelime ağırlıklarını algoritmaya dahil etmememe bağlıyorum.
Bu algoritmanın şu anda bir diğer büyük eksikliği ise, gereksiz kelimeleri (bağlaçlar gibi) de hesaplamaya dahil etmesi. Bir gereksiz kelimeler listesi oluşturup, bir de onları çıkararak denemek gerek diye düşünüyorum. Eğer bu konuda bir yol katedersem, yeni yazılarda bahsedeceğim.
İyi geliştirmeler.