Word2Vec ve Gensim ile Sentence Similarity.

Word2vec’i öğrendikten sonra nasıl kullanacağız yahu diye düşündüğünüzü biliyorum. Şu şekilde cümle benzerliklerini öğrenebilirsiniz. Kendi modelinizle özelleştirip bildiri bile yazabilirsiniz.

Ben nasılmış diye bakmak için Google’ın Google news modelini kullandım ve ilginç bir şekilde çok da iyi olmadığını gördüm. Şu adresteki model bu arada:https://github.com/mmihaltz/word2vec-GoogleNews-vectors

Sadede gelecek olursak n_similarity isimli fonksiyon ile işlemlerimizi gerçekleştireceğiz. n_similarity doğası gereği kelimelerin sıralarından etkilenmiyor ve doğal olarak sadece modelimizde bulunan kelime ve kelime grupları ile işlemi gerçekleştirebiliyor. Cümlelerde bir stop word temizliği yapmak isteyebilirsiniz hatalardan kaçınmak için ama Türkçe için yapacaksanız ben yapmanızı önermem. Kodlama aşamasına gelecek olursak:

s1 = 'This girl is  medical student'
s2 = 'I eat cucumber'
distance=model.wv.n_similarity(s1.lower().split(),
s2.lower().split()) #0.2011

Görüldüğü gibi iki alakasız cümle ile işlem yapıldığında 0.20 gibi bir değer ile karşılaşılıyor. Peki aynı iki cümleyi verdiğimizde ne oluyor:

s1= "music listening I like"
s2= "I like listening music "
distance = model.wv.n_similarity(s1.lower().split(), s2.lower().split())
print(distance) #1.0

Burada hem sıranın bir önemi olmadığını hem de maksimum değerin bir olduğunu öğrendik. Peki şimdi asıl can alıcı noktaya gelelim. Benzer anlamlı cümleler kullanıldığında nasıl bir durum ile karşılaşıyoruz:

s1="I haven't watched  for ages"
s2="It's been long time since I watched "
distance = model.wv.n_similarity(s1.lower().split(), s2.lower().split())
print(distance) #0.7012

Benzer anlamlı 2 cümle içinde 0.70 gibi bir benzerlik oranı yakaladı ki burada watched kelimesinin bir etkisi olduğu kesin ama wathced kelimelerini silersek dahi:

s1="I haven't for ages"
s2="It's been long time since I "
distance = model.wv.n_similarity(s1.lower().split(), s2.lower().split())
print(distance) #0.6077

Hala sadece I kelimesi ortak olmasına rağmen 0.45 gibi bir benzerlik oranı ile karşılaşıyoruz ki bu kabul edilebilir bir oran.

I kelimesini sildiğimizde ise 0.45 gibi bir oranla karşılaşıyoruz yine de hiç bir ortak kelime olmamasına rağmen gerçekten iyi bir oran olarak göze çarpıyor.

n_similarity temelde kelime vektörlerini toplayıp cosine similaritylerini alıyor. Word2vec ile ne yapabilirim diye düşünürken aklıma gelen 3. şey sentence similarity mevzusu oldu. Doc2Vec gibi daha gelişmiş yöntemler ile çok daha başarılı sonuçlar alınabilir ancak bu da bir kısayol olarak düşünülebilir.

Kaynaklar

Computer Engineer,Sociologist, CSE Master Student

Computer Engineer,Sociologist, CSE Master Student