2015-07-05 36 views
5

Calcolo della somiglianza semantica tra due synset in WordNet può essere facilmente effettuata con diverse misure di similarità built-in, come ad esempio:Come si calcola la distanza del percorso più breve (geodetica) tra due aggettivi in ​​WordNet usando Python NLTK?

synset1.path_similarity(synset2) 

synset1.lch_similarity(synset2), Leacock-Chodorow somiglianza

synset1.wup_similarity(synset2), Wu-Palmer somiglianza

(as seen here)

Tuttavia, tutti questi exploit relazioni tassonomiche di WordNet, che sono i rapporti di sostantivi e verbi. Aggettivi e avverbi sono correlati per sinonimi, antonimi e pertinenti. Come si può misurare la distanza (numero di salti) tra due aggettivi?

Ho provato path_similarity(), ma come previsto, restituisce 'None':

from nltk.corpus import wordnet as wn 
x = wn.synset('good.a.01') 
y = wn.synset('bad.a.01') 


print(wn.path_similarity(x,y)) 

Se non v'è alcun modo per calcolare la distanza tra un aggettivo e un altro, segnalarlo sarebbe molto apprezzato.

risposta

6

Non esiste un modo semplice per ottenere la somiglianza tra parole che non sono nomi/verbi.

Come notato, i nomi/verbi somiglianza possono essere facilmente estratti da

>>> from nltk.corpus import wordnet as wn 
>>> dog = wn.synset('dog.n.1') 
>>> cat = wn.synset('cat.n.1') 
>>> car = wn.synset('car.n.1') 
>>> wn.path_similarity(dog, cat) 
0.2 
>>> wn.path_similarity(dog, car) 
0.07692307692307693 
>>> wn.wup_similarity(dog, cat) 
0.8571428571428571 
>>> wn.wup_similarity(dog, car) 
0.4 
>>> wn.lch_similarity(dog, car) 
1.072636802264849 
>>> wn.lch_similarity(dog, cat) 
2.0281482472922856 

Per aggettivo è difficile, quindi si avrebbe bisogno di costruire il proprio dispositivo di testo somiglianza. Il modo più semplice è utilizzare il modello di spazio vettoriale, in pratica tutte le parole sono rappresentate da un numero di numeri in virgola mobile, ad es.

>>> import numpy as np 
>>> blue = np.array([0.2, 0.2, 0.3]) 
>>> red = np.array([0.1, 0.2, 0.3]) 
>>> pink = np.array([0.1001, 0.221, 0.321]) 
>>> car = np.array([0.6, 0.9, 0.5]) 
>>> def cosine(x,y): 
...  return np.dot(x,y)/(np.linalg.norm(x) * np.linalg.norm(y)) 
... 
>>> cosine(pink, red) 
0.99971271929384864 
>>> cosine(pink, blue) 
0.96756147991512709 
>>> cosine(blue, red) 
0.97230558532824662 
>>> cosine(blue, car) 
0.91589118863996888 
>>> cosine(red, car) 
0.87469454283170045 
>>> cosine(pink, car) 
0.87482313596223782 

per addestrare un gruppo di vettori per qualcosa come pink = np.array([0.1001, 0.221, 0.321]), si dovrebbe cercare su Google per

  • Latent Semantic Indexing/analisi semantica latente
  • Borsa delle parole
  • vettore spazio modello semantica
  • Word2Vec, Doc2Vec, Wiki2Vec
  • Reti neurali
  • coseno semantica somiglianza del linguaggio naturale

È anche possibile provare alcuni largo della piattaforma software/librerie come:

Oltre vettore spazio modello, puoi provare un modello grafico che mette le parole in un grafico e usa qualcosa come il pagerank per camminare attorno al grafico t o darti qualche misura di somiglianza.

Vedi anche:

+0

Grazie per il consiglio. C'è un lavoro di Kamps et al. (2004), in cui determinano la polarità (ha un sentimento positivo o negativo) di aggettivi all'interno di WordNet. Lo fanno misurando la distanza (adj1, bad) sottratta dalla distanza (adj1, bad). Quindi parlano di questo nel loro articolo, ma non sono sicuro di come diavolo hanno implementato questo !! qualche idea? [Link alla carta] (http://humanities.uva.nl/~kamps/publications/2004/kamp:usin04.pdf) @alvas – modarwish

+1

sembra che costruiscano un grafico e quindi utilizzino le misure della distanza del grafico ma non sono esattamente sicuro di quello che hanno fatto. Forse puoi mandare un'email agli autori: P – alvas

2

Nella carta da 0.123.551,942 mila, hanno definito un grafico di parole come nodi a cui sono collegati i nodi se due parole sono sinonimi. Quindi hanno definito il percorso più breve tra due parole come la loro distanza geodetica . Come ho capito, non c'è peso sui bordi, il che significa che in pratica puoi contare il numero di spigoli quando vuoi trovare il percorso più breve.

La carta:

Kamps, Jaap, et al. "Usare WordNet per misurare gli orientamenti semantici degli aggettivi". LREC. Vol. 4. 2004.

Ma ciò che realmente cercano è una misura per l'orientamento semantica. Dipende dalla tua applicazione per scegliere la misura migliore di conseguenza. Una serie di misure di similitudine che hanno recentemente ottenuto un'enorme attenzione si basa sull'ipotesi distributiva . Questi metodi di apprendimento automatico basati su impieghi di parole in enormi documenti creano misure di similitudine geometrica (ad esempio, somiglianza del coseno). Ma questi metodi sono concettualmente disconnessi dalle misure di distanza di WordNet.

Tuttavia, ci sono alcuni lavori intorno ad esso per usare gloss e gloss di WordNet in synsets come esempi di contesto per imparare modelli statistici di parole come Patwardhan and Pedersen (2006). Ma in generale questi modelli non sono adatti per trovare gli orientamenti del sentimento senza la supervisione della positività o della negatività.

+0

Sì, ho esplorato varie misure di similarità semantica e le ho usate per taggare una parola come positiva o negativa. Ho provato la distanza WordNet, la classificazione supervisionata con synset come funzioni, o con informazioni sulla lucentezza come caratteristiche, passeggiate casuali, ensemble, modifiche di affetti morfologici, informazioni sull'influenza e corpus/statistiche basate. Ma attualmente sto lavorando su misure basate su distanza WordNet di aggettivi per etichettare parole con un orientamento semantico (polarità). Quindi questo è il motivo per cui sono interessato solo alla distanza degli aggettivi. Credo che avrò sviluppato un codice per contare i bordi. Grazie @Mehdi – modarwish

+1

Penso che ci vuole un calcolo abbastanza pesante se si costruisce tutto il grafico e quindi si trova il percorso più breve. Finora, avevano un set limitato di test, con obiettivi limitati solo per il loro punto di vista. Se hai trovato difficile implementare il percorso più breve nel grafico, forse puoi usare il modello * random walk * invece del percorso più breve. Ho trovato questo documento molto legato all'idea di utilizzare il grafico di WordNet: http://nlp.stanford.edu/pubs/wordwalk-textgraphs09.pdf – Mehdi

+1

Hassan e Radev (2010) applicano anche una passeggiata casuale per taggare le parole con una polarità .. – modarwish