2013-06-25 11 views
5

İki sözcük arasında, python nltk wordnet'ini kullanarak benzerlik bulmaya çalışıyorum. İki örnek anahtar kelime 'oyun' ve 'leonardo'dur. İlk önce, bu iki kelimenin tüm simetlerini çıkardım ve benzerliklerini bulmak için her synset'i eşleştirdim. kurallarapython nltk wordnet benzerlik ölçüsü için tek sonuç döndürme

game.n.01 bir yarışma kazanan leonardo.n.01 İtalyan ressam ve heykeltıraş ve mühendis ve bilim adamı belirlemek için: İşte İşte benim kod

from nltk.corpus import wordnet as wn 

xx = wn.synsets("game") 
yy = wn.synsets("leonardo") 
for x in xx: 
    for y in yy: 
     print x.name 
     print x.definition 
     print y.name 
     print y.definition 
     print x.wup_similarity(y) 
     print '\n' 

toplam çıkış olduğunu ve mimar; İtalyan Rönesans çok yönlü deha (1452-1519) 0,285714285714

game.n.02 bir spor ya da diğer yarışma leonardo.n.01 İtalyan ressam ve heykeltıraş ve mühendis ve bilim adamı ve mimarın tek oyun ; İtalyan Rönesans çok yönlü deha (1452-1519) 0,285714285714

game.n.03 bir eğlence veya eğlence leonardo.n.01 İtalyan ressam ve heykeltıraş ve mühendis ve bilim adamı ve mimar; İtalyan Renaissance en çok yönlü dahi (1452-1519) 0,25

game.n.04 hayvan gıda ya da spor leonardo.n.01 İtalyan ressam ve heykel ve mühendis ve bilim adamı ve mimarı için avlanırdı İtalyan Rönesans en çok yönlü deha (1452-1519) 0,923076923077

game.n.05 (tenis) bir oyuncu leonardo.n.01 İtalyan ressam ve heykeltıraş ve mühendis ve hizmet veren bu süre boyunca oyunun bir bölümü bilim adamı ve mimar; İtalyan Rönesans (1452-1519) 0,222222222222

game.n.06 (oyunlar) belirli bir noktada puanı ya puanının en çok yönlü deha leonardo.n.01 İtalyan ressam ve heykeltıraş kazanmak için gerekli ve mühendis ve bilim adamı ve mimar; İtalyan Rönesans en çok yönlü deha (1452-1519) 0,285714285714

game.n.07 gıda leonardo.n.01 İtalyan ressam ve heykeltıraş ve mühendis ve bilim adamı için kullanılan yabani hayvanların eti ve mimar; İtalyan Rönesans en çok yönlü deha (1452-1519) 0,5

plot.n.01 şey yapmak için gizli bir plan İtalyan ressam ve heykeltıraş ve leonardo.n.01 (özellikle bir şey sinsi veya yasadışı ) mühendis ve bilim adamı ve mimar; İtalyan Rönesans (1452-1519) 0,2

game.n.09 en çok yönlü deha sırayla gerekli oyun ekipmanları belirli oyun leonardo.n.01 İtalyan ressam ve heykeltıraş ve mühendis ve bilim adamı oynamak ve mimar; İtalyan Rönesans (1452-1519) 0,666666666667

game.n.10 sizin meslek veya iş leonardo.n satırının en çok yönlü deha.01 İtalyan ressam ve heykeltıraş, mühendis, bilim adamı ve mimar; İtalyan Renaissance çok yönlü dahi (1452-1519) İtalyan ressam ve heykel ve mühendis ve bilim adamı ve mimarı leonardo.n.01 0,25

game.n.11 boş veya önemsiz davranışlar; İtalyan Rönesans'ın en yönlü deha (1452-1519) 0,222222222222

bet_on.v.01 yer leonardo.n.01 İtalyan ressam ve heykeltıraş ve mühendis ve bilim adamı ve mimar üzerine bahis; İtalyan ressam ve heykel ve mühendis ve bilim adamı ve mimarı leonardo.n.01 ayak ve bacaklarda devre dışı en çok yönlü dahi İtalyan Renaissance (1452-1519) -1

crippled.s.01; İtalyan Rönesans en çok yönlü deha İtalyan ressam ve heykeltıraş ve mühendis ve bilim adamı ve mimar leonardo.n.01 tehlikesiyle karşı karşıya istekli (1452-1519) -1

game.s.02; İtalyan Rönesans (1452-1519) -1

Ama game.n.04 ve leonardo.n.01 arasındaki benzerliğin en çok yönlü deha gerçekten garip. Bence benzerlik (0.923076923077) o kadar yüksek olmamalı. yiyecek ya da spor için avlanan

game.n.04

hayvan

leonardo.n.01

İtalyan ressam ve heykeltıraş ve mühendis ve bilim adamı ve mimar; İtalyan Rönesans (1452-1519)

0,923076923077

en çok yönlü deha benim konsepti ile herhangi bir sorun var mı? the docs göre

cevap

8

, wup_similarity() metot bize ...

... Bir sınıflandırmasında iki duyu derinliğine bağlı iki kelime duyular ne kadar benzer belirten skor ve bu onların En Az Ortak Subsumer (en spesifik ata düğüm). ben almak rağmen onlar, benzer olduğunu düşünüyor yüzden

... ve ...

>>> from nltk.corpus import wordnet as wn 
>>> game = wn.synset('game.n.04') 
>>> leonardo = wn.synset('leonardo.n.01') 
>>> game.lowest_common_hypernyms(leonardo) 
[Synset('organism.n.01')] 
>>> organism = game.lowest_common_hypernyms(leonardo)[0] 
>>> game.shortest_path_distance(organism) 
2 
>>> leonardo.shortest_path_distance(organism) 
3 

... ...

>>> game.wup_similarity(leonardo) 
0.7058823529411765 

... hangi bazı sebeplerden dolayı farklıdır.


Güncelleme ben benzeşmezlik ('oyun', 'leonardo') çok daha çok daha az olduğunu farklılık ('oyunu' 'satranç') gösterecektir bazı ölçüm istiyorum

nasıl ... böyle bir şey hakkında

from nltk.corpus import wordnet as wn 
from itertools import product 

def compare(word1, word2): 
    ss1 = wn.synsets(word1) 
    ss2 = wn.synsets(word2) 
    return max(s1.path_similarity(s2) for (s1, s2) in product(ss1, ss2)) 

for word1, word2 in (('game', 'leonardo'), ('game', 'chess')): 
    print "Path similarity of %-10s and %-10s is %.2f" % (word1, 
                  word2, 
                  compare(word1, word2)) 
01 yazdırır

... ... açıklama için

Path similarity of game  and leonardo is 0.17 
Path similarity of game  and chess  is 0.25 
+0

teşekkürler. Fakat orijinal/yaklaşık karşıtlıklarını hangi hesaplama gösterecek? – qmaruf

+0

@QuaziMarufurRahman "Farklılığı" nasıl tanımladığınıza bağlıdır. 'Path_distance()' yöntemiyle daha iyi sonuçlar alabilirsiniz, ancak tam olarak ne ölçmeye çalıştığınıza bağlıdır. – Aya

+0

Aslında, farklılığın ('oyun', 'satranç') farklılıktan çok daha az olduğunu gösterecek bazı ölçümler istiyorum ('oyun', 'leonardo') – qmaruf