Estoy tratando de crear un identificador de sinónimo general para las palabras en una oración que son significativas (es decir, no "a" o "el"), y estoy usando el lenguaje natural toolkit (nltk) en python para él. El problema que estoy teniendo es que el buscador de sinónimos en nltk requiere un argumento de parte del discurso para poder vincularse a sus sinónimos. Mi intento de solución para esto fue utilizar el etiquetador de parte del habla simplificado presente en nltk, y luego reducir la primera letra para pasar este argumento al buscador de sinónimos, sin embargo, esto no está funcionando.Sinónimo general y parte del procesamiento de voz usando nltk
def synonyms(Sentence):
Keywords = []
Equivalence = WordNetLemmatizer()
Stemmer = stem.SnowballStemmer('english')
for word in Sentence:
word = Equivalence.lemmatize(word)
words = nltk.word_tokenize(Sentence.lower())
text = nltk.Text(words)
tags = nltk.pos_tag(text)
simplified_tags = [(word, simplify_wsj_tag(tag)) for word, tag in tags]
for tag in simplified_tags:
print tag
grammar_letter = tag[1][0].lower()
if grammar_letter != 'd':
Call = tag[0].strip() + "." + grammar_letter.strip() + ".01"
print Call
Word_Set = wordnet.synset(Call)
paths = Word_Set.lemma_names
for path in paths:
Keywords.append(Stemmer.stem(path))
return Keywords
Este es el código Actualmente estoy trabajando desde, y como se puede ver que estoy primero lematización la entrada para reducir el número de partidos que tendré en el largo plazo (I piensa ejecutar esto en decenas de miles de oraciones), y en teoría estaría derivando la palabra después de esto para aumentar este efecto y reducir el número de palabras redundantes que genero, sin embargo, este método devuelve casi invariablemente errores en la forma siguiente:
Traceback (most recent call last):
File "C:\Python27\test.py", line 45, in <module>
synonyms('spray reddish attack force')
File "C:\Python27\test.py", line 39, in synonyms
Word_Set = wordnet.synset(Call)
File "C:\Python27\lib\site-packages\nltk\corpus\reader\wordnet.py", line 1016, in synset
raise WordNetError(message % (lemma, pos))
WordNetError: no lemma 'reddish' with part of speech 'n'
No tengo mucho control sobre los datos que se ejecutarán, así que simplemente limpiar mi corpus no es realmente una opción. Alguna idea sobre como resolver esto?
Investigué un poco más y tengo un liderazgo prometedor, pero todavía no estoy seguro de cómo podría implementarlo. En el caso de una palabra no encontrada o asignada incorrectamente, me gustaría utilizar una métrica de similitud (Leacock Chodorow, Wu-Palmer, etc.) para vincular la palabra con la palabra clave más cercana categorizada correctamente. Tal vez junto con una medida de distancia de edición, pero nuevamente no he podido encontrar ningún tipo de documentación sobre esto.
He intentado que este código funcione por un tiempo, y parece estar lleno de errores. Por un lado, "worndet" no es parte de NLTK, y la organización del paquete se ha movido un poco. – aendrew
Disculpa, este código tiene 11 meses de vida. Sí, nltk cambió un poco, publicó una versión modificada y funcional para la nueva versión de nltk en lugar de la anterior. –
También vale la pena señalar que las búsquedas en wordnet son en realidad bastante lentas y, en teoría, deberían delegarse en un subproceso. Si desea limpiar esto un poco más y hacer una mejor utilidad, hágamelo saber y puedo abrir una esencia para esto en Github y copiarlo en él. –