2011-03-30 21 views
6

C'è un modo per acquisire restrizioni selettive di WordNet (come + animate, + human, ecc.) Dai synset tramite NLTK? Oppure esiste un altro modo per fornire informazioni semantiche su synset? Il più vicino che potessi ottenere erano le relazioni iperimmiche.restrizioni selettive di Wordnet in NLTK

risposta

4

Dipende da qual è il tuo "restrizioni selectional" o io la chiamerei tratti semantici, perché nella semantica classici, esiste un mondo di concepts e confrontare tra i concetti dobbiamo trovare

  • discriminante caratteristiche (cioè caratteristiche dei concetti che vengono utilizzati per distinguerli l'uno dall'altro) e
  • caratteristiche di similarità (cioè caratteristiche dei concetti simili e evidenzia la necessità di differenziarli)

Ad esempio:

Man is [+HUMAN], [+MALE], [+ADULT] 
Woman is [+HUMAN], [-MALE], [+ADULT] 

[+HUMAN] and [+ADULT] = similarity features 
[+-MALE] is the discrimating features 

Il problema comune della semantica tradizionali e l'applicazione di questa teoria nella semantica computazionale è la questione della

"C'è un elenco specifico di caratteristiche che possiamo usare confrontare qualsiasi

"Se sì, quali sono le caratteristiche di questo elenco?" concetti? "

(vedi www.acl.ldc.upenn.edu/E/E91/E91-1034.pdf per maggiori dettagli)

Tornando a WordNet, posso suggerire 2 metodi per risolvere il " restrizioni di selezione "

Prima, Controllare gli iperimpiadi per le funzionalità discriminanti, ma prima è necessario decidere quali sono le funzionalità di discriminazione. Per differenziare un animale dagli umani, prendiamo le caratteristiche discriminanti come [+ -umano] e [+ -animale].

from nltk.corpus import wordnet as wn 

# Concepts to compare 
dog_sense = wn.synsets('dog')[0] # It's http://goo.gl/b9sg9X 
jb_sense = wn.synsets('James_Baldwin')[0] # It's http://goo.gl/CQQIG9 

# To access the hypernym_paths()[0] 
# It's weird for that hypernym_paths gives a list of list rather than a list, nevertheless it works. 
dog_hypernyms = dog_sense.hypernym_paths()[0] 
jb_hypernyms = jb_sense.hypernym_paths()[0] 


# Discriminating features in terms of concepts in WordNet 
human = wn.synset('person.n.01') # i.e. [+human] 
animal = wn.synset('animal.n.01') # i.e. [+animal] 

try: 
    assert human in jb_hypernyms and animal not in jb_hypernyms 
    print "James Baldwin is human" 
except: 
    print "James Baldwin is not human" 

try: 
    assert human in dog_hypernyms and animal not in dog_hypernyms 
    print "Dog is an animal" 
except: 
    print "Dog is not an animal" 

In secondo luogo, Verificare la presenza di misure di similarità come @Jacob aveva suggerito.

dog_sense = wn.synsets('dog')[0] # It's http://goo.gl/b9sg9X 
jb_sense = wn.synsets('James_Baldwin')[0] # It's http://goo.gl/CQQIG9 

# Features to check against whether the 'dubious' concept is a human or an animal 
human = wn.synset('person.n.01') # i.e. [+human] 
animal = wn.synset('animal.n.01') # i.e. [+animal] 

if dog_sense.wup_similarity(animal) > dog_sense.wup_similarity(human): 
    print "Dog is more of an animal than human" 
elif dog_sense.wup_similarity(animal) < dog_sense.wup_similarity(human): 
    print "Dog is more of a human than animal" 
+0

Grazie per la risposta completa. Mi sono reso conto qualche tempo fa che non riuscivo a trovare le somiglianze/caratteristiche discriminanti in WordNet a causa dei motivi che hai menzionato. – erickrf

0

Si potrebbe provare a utilizzare alcune delle funzioni di similarità con synset raccolti a mano e utilizzarli per filtrare. Ma è essenzialmente lo stesso che seguire l'albero hypernym - afaik tutte le funzioni di similarità wordnet usano la distanza ipernima nei loro calcoli. Inoltre, ci sono molti attributi opzionali di un synset che potrebbe valere la pena di essere esplorati, ma la loro presenza può essere molto incoerente.

Problemi correlati