2012-02-23 13 views
12

Estoy usando el pos_tagger en las recetas. Un problema que estoy teniendo es que el pos_tagger devuelve que las palabras en el tiempo imperativo son sustantivos, ¿no deberían ser verbos? Por ejemplo:NLTK piensa que los imperativos son sustantivos

Con la entrada:

combine 1 1/2 cups floud, 3/4 cup sugar, salt and baking powder 

La salida es:

[('combine', 'NN'), ('1', 'CD'), ('1/2', 'CD'), ('cups', 'NNS'), ('floud', 'VBD'), (',',  ','), ('3/4', 'CD'), ('cup', 'NN'), ('sugar', 'NN'), (',', ','), ('salt', 'NN'), ('and', 'CC'), ('baking', 'VBG'), ('powder', 'NN')] 

Aquí está el código que estoy usando para ello:

def part_of_speech(self,input_sentance): 
     text = nltk.word_tokenize(input_sentance) 
     return nltk.pos_tag(text) 

No debería 'combinar' ser etiquetado como algún tipo de verbo? ¿Es esto culpa de la nltk? ¿O estoy haciendo algo mal?

+0

¿Puede mostrarnos qué código está utilizando actualmente para generar lo anterior? –

+0

sí, acaba de agregar el código – mdogg

+2

Si bien no sé nada sobre nltk, en una coincidencia poco común, esta semana el NFL Scouting Combine anual se celebra en Indianápolis, en el que "combinar" se usa como sustantivo. – DSM

Respuesta

10

Lo que está viendo es un problema muy común en el procesamiento estadístico tradicional del lenguaje natural (NLP). En resumen, los datos en los que está utilizando el etiquetador no se parecen a los datos con los que fue entrenado. NLTK no documenta los detalles, pero hasta donde yo sé, el etiquetador predeterminado está entrenado en artículos del Wall Street Journal, Brown Corpus, o alguna combinación de los dos. Estos corpora contienen muy pocos imperativos, por lo que cuando le das datos con imperativos no hace lo correcto.

Una buena solución a largo plazo sería corregir las etiquetas de un gran corpus de recetas y entrenar en los datos corregidos, de esa manera se resuelve el problema de falta de coincidencia entre los datos de entrenamiento y prueba. Esto es, sin embargo, una gran cantidad de trabajo. Idealmente, un corpus con muchos imperativos ya existiría; mi grupo de investigación ha investigado esto y no hemos encontrado uno adecuado, aunque estamos en proceso de producir uno.

Una solución mucho más simple que he estado usando en un proyecto reciente que requirió que los imperativos se entiendan correctamente es simplemente anotar cuáles son los imperativos que desea, y forzar las etiquetas para que esas palabras sean correctas.

Así que en el ejemplo siguiente, hice un diccionario que decía que "combinar" debería tratarse como un verbo, y luego usé una lista de comprensión para cambiar las etiquetas.

tagged_words = [('combine', 'NN'), ('1', 'CD'), ('1/2', 'CD'), ('cups', 'NNS'), ('flour', 'VBD')] 
force_tags = {'combine': 'VB'} 
new_tagged_words = [(word, force_tags.get(word, tag)) for word, tag in tagged_words] 

El contenido de new_tagged_words ahora tiene las etiquetas originales, excepto cambió dondequiera que había una entrada en force_tags.

>>> new_tagged_words 
[('combine', 'VB'), ('1', 'CD'), ('1/2', 'CD'), ('cups', 'NNS'), ('flour', 'VBD')] 

Esta solución requiere que usted diga cuáles son las palabras que quiere forzar a los verbos. Esto está lejos de ser ideal, pero no hay una mejor solución general.

+0

Ya veo. Entonces, ¿esto significa que POS es simplemente una coincidencia de cadenas? ¿O lo estoy simplificando demasiado? – mdogg

+1

Taggers generalmente toman al menos dos tipos de información en cuenta: información posicional entre las etiquetas (es decir, sustantivos siguen determinantes como 'the'), e información sobre las posibles etiquetas que cada palabra puede tomar (es decir, con qué frecuencia 'steer' es verbo o sustantivo). En este caso, es sobre todo la información posicional el problema porque en las oraciones de datos de entrenamiento casi nunca comienzan con verbos. – Constantine

+0

Para información, tengo el mismo problema cuando analizo textos alemanes con el MatePosTagger. –

1

La 'combinación' con el mapa de nombres puede deberse al hecho de que cree que es un sustantivo. Una cosechadora por ejemplo. Supongo que deberías sintonizar el algoritmo sustantivo para tu caso de uso o cambiar/modificar la palabra corpus.

+0

¿cómo haces para eso? Soy un completo novato cuando se trata de NLTK – mdogg

+0

Hay dos grandes libros nltk python que tengo ambos. Si esto va a ser una gran cosa para obtenerlos jajaja. De lo contrario, aumenta tu recompensa y podría codificar un ejemplo para ti. –

+0

También por favor vote mi respuesta si cree que es correcto. –

3

El entrenamiento en corpus imperativos sería la mejor opción. Pero si no tiene tiempo o no cree que el esfuerzo valga la pena, aquí hay una solución simple (más de un truco): simplemente ponga un pronombre como 'ellos' antes de cada oración (lo cual está seguro es imperativo) Ahora nltk hace un buen trabajo con el etiquetador predeterminado.

0
>>> from nltk import pos_tag, word_tokenize 
>>> def imperative_pos_tag(sent): 
...  return pos_tag(['He']+sent)[1:] 
... 
>>> sent1 = 'combine 1 1/2 cups floud, 3/4 cup sugar, salt and baking powder' 

>>> imperative_pos_tag(word_tokenize(sent1)) 
[('combine', 'VBD'), ('1', 'CD'), ('1/2', 'CD'), ('cups', 'NNS'), ('floud', 'VBD'), (',', ','), ('3/4', 'CD'), ('cup', 'NN'), ('sugar', 'NN'), (',', ','), ('salt', 'NN'), ('and', 'CC'), ('baking', 'VBG'), ('powder', 'NN')] 

También, echar un vistazo a Python NLTK pos_tag not returning the correct part-of-speech tag y NLTK identifies verb as Noun in Imperatives

1

Prueba el Stanford POS tagger.

He tenido mejor suerte con eso. Se ha entrenado con oraciones más imperativas en comparación con el etiquetador NLTK predeterminado.

También dockedized en cuzzo/stanford-pos-tagger.

p. Ej.

Follow us on Instagram 
VB PRP IN NN 
+0

¿Cómo se intercambia el etiquetador NLTK para el de Stanford? –

Cuestiones relacionadas