2011-04-04 29 views
13

Necesito tomar un archivo de texto de entrada con una palabra. Entonces necesito encontrar los lemma_names, la definición y los ejemplos del synset de la palabra usando wordnet. He revisado el libro: "Procesamiento de texto de Python con el libro de cocina NLTK 2.0" y también "Procesamiento de lenguaje natural usando NLTK" para ayudarme en esta dirección. Aunque he entendido cómo se puede hacer esto con el terminal, no puedo hacer lo mismo con un editor de texto.Para buscar sinónimos, definiciones y oraciones de ejemplo usando WordNet

Por ejemplo, si el texto de entrada tiene la palabra "pasmado", la salida tiene que ser de esta manera:

Flabbergasted (verbo) flabbergast, aturdir, tazón sobre - superar con asombro; "¡Esto aturde la mente!" (adjetivo) estupefacto, estupefacto, estupefacto, estupefacto, estupefacto, mudo, mudo, como estupefacto por el asombro y la sorpresa; "un círculo de la policía quedó estupefacto por su negativa a haber visto el accidente"; "los concejales estupefactos estaban mudos"; "Estaba asombrado por la noticia de su promoción"

¡Los sintonizadores, definiciones y oraciones de ejemplo se obtienen directamente de WordNet!

Tengo el siguiente fragmento de código:


from __future__ import division 
import nltk 
from nltk.corpus import wordnet as wn 


tokenizer = nltk.data.load('tokenizers/punkt/english.pickle') 
fp = open("inpsyn.txt") 
data = fp.read() 

#to tokenize input text into sentences 

print '\n-----\n'.join(tokenizer.tokenize(data))# splits text into sentences 

#to tokenize the tokenized sentences into words 

tokens = nltk.wordpunct_tokenize(data) 
text = nltk.Text(tokens) 
words = [w.lower() for w in text] 
print words  #to print the tokens 

for a in words: 
    print a 

syns = wn.synsets(a) 
print "synsets:", syns 

for s in syns: 
    for l in s.lemmas: 
     print l.name 
    print s.definition 
    print s.examples 

me da el siguiente resultado:


flabbergasted 

['flabbergasted'] 
flabbergasted 
synsets: [Synset('flabbergast.v.01'), Synset('dumbfounded.s.01')] 
flabbergast 
boggle 
bowl_over 
overcome with amazement 
['This boggles the mind!'] 
dumbfounded 
dumfounded 
flabbergasted 
stupefied 
thunderstruck 
dumbstruck 
dumbstricken 
as if struck dumb with astonishment and surprise 
['a circle of policement stood dumbfounded by her denial of having seen the accident', 'the flabbergasted aldermen were speechless', 'was thunderstruck by the news of his promotion'] 

¿Hay una manera de recuperar la parte del discurso junto con el grupo de nombres lemma?

+1

Si se vuelva a conectar a SO, usted debe aceptar Andrey respuesta, esp. ya que él no solo respondió, sino que también respondió a sus comentarios para ayudarlo. –

Respuesta

22
def synset(word): 
    wn.synsets(word) 

no devuelve nada así que por defecto se obtiene None

debe escribir

nombres
def synset(word): 
    return wn.synsets(word) 

que extrae la lemma:

from nltk.corpus import wordnet 
syns = wordnet.synsets('car') 
syns[0].lemmas[0].name 
>>> 'car' 
[s.lemmas[0].name for s in syns] 
>>> ['car', 'car', 'car', 'car', 'cable_car'] 


[l.name for s in syns for l in s.lemmas] 
>>>['car', 'auto', 'automobile', 'machine', 'motorcar', 'car', 'railcar', 'railway_car', 'railroad_car', 'car', 'gondola', 'car', 'elevator_car', 'cable_car', 'car'] 
+0

¡Muchas gracias! :) ¡Qué error tan tonto! – aks

+0

¿Hay alguna manera de extraer solo la palabra del synset y pasarla como parámetro? Por ejemplo, para la palabra estupefacto, obtienes Synset ('flabbergast.v.01') y Synset ('dumbfounded.s.01'). ¿Cómo puedo pasar estos como parámetros a la función lemma_name? – aks

+1

de importación nltk.corpus wordnet Syns = wordnet.synsets ('coche') [s.lemmas [0] .name para s en Syns] >>> [ 'coche', 'coche', " coche ',' coche ',' cable_carro '] – Andrey

5

Aquí he creado un módulo que puede ser utilizado fácilmente (importado), y con una cadena que se le pasa, devolverá todas las palabras lematizadas de la cuerda.

Módulo:

#!/usr/bin/python2.7 
''' pass a string to this funciton (eg 'car') and it will give you a list of 
words which is related to cat, called lemma of CAT. ''' 
from nltk.corpus import wordnet as wn 
import sys 
#print all the synset element of an element 
def lemmalist(str): 
    syn_set = [] 
    for synset in wn.synsets(str): 
     for item in synset.lemma_names: 
      syn_set.append(item) 
    return syn_set 

Uso:

Nota: nombre del módulo es lemma.py por lo tanto, "de lema lemmalist importación"

>>> from lemma import lemmalist 
>>> lemmalist('car') 
['car', 'auto', 'automobile', 'machine', 'motorcar', 'car', 'railcar', 'railway_car', 'railroad_car', 'car', 'gondola', 'car', 'elevator_car', 'cable_car', 'car'] 

Salud!

+0

Obtuvo el error 'no ImportError: Ningún módulo llamado lemma ' –

0
synonyms = [] 
for syn in wordnet.synsets("car"): 
    for l in syn.lemmas(): 
     synonyms.append(l.name()) 
print synonyms 
+0

Por favor, edite su respuesta para que incluya más información. Se desalientan las respuestas de solo código y "prueba esto" porque no contienen contenido que se pueda buscar y no explican por qué alguien debe "probar esto". – BrokenBinary

0

En NLTK 3.0, lemma_names ha cambiado de atributo para método.Así que si usted obtiene un error diciendo:

TypeError: 'method' object is not iterable 

Puede fijarlo usando:

>>> from nltk.corpus import wordnet as wn 
>>> [item for sysnet in wn.synsets('car') for item in sysnet.lemma_names()] 

Esta es la salida:

>>> [ 
     'car', 'auto', 'automobile', 'machine', 'motorcar', 'car', 
     'railcar', 'railway_car', 'railroad_car', 'car', 'gondola', 
     'car', 'elevator_car', 'cable_car', 'car' 
    ] 
Cuestiones relacionadas