2013-06-25 9 views
5

Próbuję znaleźć podobieństwo między dwoma słowami za pomocą wordnet z Pythona Nltk. Dwa przykładowe słowo kluczowe to "gra" i "Leonardo". Najpierw wyodrębniłem wszystkie synsety tych dwóch słów i dopasowałem każdy zestaw synchronizujący, aby znaleźć ich podobieństwo. Oto mój kodpython nltk zwraca nieparzysty wynik dla miary podobieństwa wordnet

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' 

tu jest całkowita moc:

game.n.01 konkurs z zasadami w celu określenia zwycięzcy leonardo.n.01 włoski malarz i rzeźbiarz i inżyniera i naukowca i architekt; najbardziej wszechstronny geniusz włoskiego renesansu (1452-1519) 0,285714285714

game.n.02 pojedyncza gra sport lub innego konkursu leonardo.n.01 włoski malarz i rzeźbiarz i inżyniera i naukowca i architekta ; najbardziej wszechstronny geniusz włoskiego renesansu (1452-1519) 0,285714285714

game.n.03 rzeźbiarz rozrywki lub rozrywką leonardo.n.01 włoski malarz i i inżynier i naukowiec i architekt; Najbardziej wszechstronny geniusz włoskiego renesansu (1452-1519) 0,25

game.n.04 zwierzę polować na jedzenie lub sportu leonardo.n.01 włoskiego malarza i rzeźbiarza i inżyniera i naukowca i architekta; najbardziej wszechstronny geniusz włoskiego renesansu (1452-1519) 0,923076923077

game.n.05 (tenis) podział zaawansowania, podczas której jeden gracz służy leonardo.n.01 włoski malarz i rzeźbiarz i inżyniera i naukowiec i architekt; Najbardziej wszechstronny geniusz włoskiego renesansu (1452-1519) 0,222222222222

game.n.06 (Games) wynikiem określonego punktu lub punktów potrzebna wygrać leonardo.n.01 włoski malarz i rzeźbiarz i inżynier oraz naukowiec i architekt; najbardziej wszechstronny geniusz włoskiego renesansu (1452-1519) 0,285714285714

game.n.07 mięso dzikich zwierząt, które służy do żywności leonardo.n.01 włoskiego malarza i rzeźbiarza i inżyniera i naukowca i architekt; Najbardziej wszechstronny geniusz włoskiego renesansu (1452-1519) 0,5

plot.n.01 tajny plan, aby zrobić coś (zwłaszcza coś podstępny lub nielegalne) leonardo.n.01 włoskiego malarza i rzeźbiarza i inżynier i naukowiec i architekt; Najbardziej wszechstronny geniusz włoskiego renesansu (1452-1519) 0,2

game.n.09 sprzęt gra potrzebne w celu odgrywać szczególną gra leonardo.n.01 włoski malarz i rzeźbiarz i inżyniera i naukowca i architekt; najbardziej wszechstronny geniusz włoskiego renesansu (1452-1519) 0.666666666667

game.n.10 Twój zawód lub linia pracy leonardo.n.01 Włoski malarz i rzeźbiarz, inżynier, naukowiec i architekt; najbardziej wszechstronny geniusz włoskiego renesansu (1452-1519) 0,25

game.n.11 niepoważna lub błahe zachowania leonardo.n.01 włoskiego malarza i rzeźbiarza i inżyniera i naukowca i architekta; najbardziej wszechstronny geniusz włoskiego renesansu (1452-1519) 0,222222222222

bet_on.v.01 postawisz na leonardo.n.01 włoskiego malarza i rzeźbiarza i inżyniera i naukowca i architekta; Najbardziej wszechstronny geniusz włoskiego renesansu (1452-1519) -1

crippled.s.01 wyłączona w stopach lub nogach leonardo.n.01 włoskiego malarza i rzeźbiarza i inżyniera i naukowca i architekta; najbardziej wszechstronny geniusz włoskiego renesansu (1452-1519) -1

game.s.02 gotów stawić czoła niebezpieczeństwu leonardo.n.01 włoskiego malarza i rzeźbiarza i inżyniera i naukowca i architekta; Najbardziej wszechstronny geniusz włoskiego renesansu (1452/19) -1

ale podobieństwa game.n.04 i leonardo.n.01 jest naprawdę dziwne. Myślę, że podobieństwo (0.923076923077) nie powinno być tak wysokie.

game.n.04

zwierzę polować na jedzenie lub sportem

leonardo.n.01

włoski malarz i rzeźbiarz i inżynier i naukowiec i architekt; Najbardziej wszechstronny geniusz włoskiego renesansu (1452-1519)

0,923076923077

Czy jest jakiś problem z moim pojęciem?

Odpowiedz

8

Według the docs powraca wup_similarity() metoda ...

... punktacja oznaczający, jak podobne są dwa sens wyrazu, na podstawie głębokości dwóch zmysłów w taksonomii i swoich Najmniejszy wspólny Subsumer (najbardziej specyficzny węzeł nadrzędny).

... i ...

>>> 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 

... dlatego też uważa, że ​​są one podobne, chociaż mam ...

>>> game.wup_similarity(leonardo) 
0.7058823529411765 

... co z różnych powodów jest inny.


Aktualizacja

chcę jakiś pomiar, który pokaże, że odmienność ('gra', 'szachy') jest o wiele mniej niż odmienności ('gra', 'Leonardo')

Jak o czymś takim ...

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)) 

... która drukuje ...

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

Dzięki za wyjaśnienie. Ale jakie obliczenia wykażą ich oryginalną/przybliżoną odmienność? – qmaruf

+0

@QuaziMarufurRahman Zależy od tego, jak definiujesz "odmienność". Możesz uzyskać lepsze wyniki za pomocą metody 'path_distance()', ale to zależy od tego, co dokładnie chcesz zmierzyć. – Aya

+0

Właściwie chcę trochę pomiaru, który pokaże, że odmienność ("gra", "szachy") jest znacznie mniejsza niż odmienność ("gra", "leonardo") – qmaruf

Powiązane problemy