2011-03-30 23 views
6

¿Hay alguna forma de capturar las restricciones de selección de WordNet (como + animate, + human, etc.) desde synsets a través de NLTK? ¿O hay alguna otra forma de proporcionar información semántica sobre synset? Lo más cerca que pude de él fueron las relaciones hipernym.Restricciones de selección de Wordnet en NLTK

Respuesta

4

Depende de lo que es su "restricciones de selección" o lo llamaría rasgos semánticos, ya que en la semántica clásicos, existe un mundo de concepts y comparar entre los conceptos que tenemos que encontrar

  • discriminar características (es decir, características de los conceptos que se utilizan para distinguirlos unos de otros) y
  • características de similitud (es decir, características de los conceptos similares y pone de relieve la necesidad de diferenciarlos)

Por ejemplo:

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

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

El problema común de la semántica tradicionales y aplicando esta teoría en la semántica computacional es la cuestión de

"¿Hay una lista específica de funciones que podemos utilizar para comparar cualquier

"Si es así, ¿cuáles son las características en esta lista?" conceptos? "

(ver www.acl.ldc.upenn.edu/E/E91/E91-1034.pdf para más detalles)

Volviendo a WordNet, puedo sugerir 2 métodos para resolver el " restricciones de selección "

Primero, Compruebe los hipernotipos para las características discriminatorias, pero primero debe decidir cuáles son las características discriminatorias. Para diferenciar un animal de un humano, tomemos las características discriminantes como [+ -humano] y [+ -animal].

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" 

En segundo lugar, Compruebe si hay medidas de similitud como @Jacob había sugerido.

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

Gracias por la respuesta completa. Me di cuenta hace un tiempo que no pude encontrar las características de similitud/discriminación en WordNet debido a las razones que mencionaste. – erickrf

0

Puede intentar usar algunas de las funciones de similitud con synsets seleccionados a mano, y usar eso para filtrar. Pero es esencialmente lo mismo que seguir el árbol de hypernym: afaik todas las funciones de similitud de wordnet usan la distancia de hypernym en sus cálculos. Además, hay muchos atributos opcionales de un synset que valdría la pena explorar, pero su presencia puede ser muy inconsistente.