tutorial stopwords graphs functions ejemplo python nltk

python - stopwords - etiquetado personalizado con nltk



nltk stopwords (4)

La respuesta de Bud es correcta. Asimismo, según este enlace ,

Si sus paquetes nltk_data se instalaron correctamente, entonces NLTK sabe dónde están en su sistema y no necesita pasar una ruta absoluta.

Es decir, solo puedes decir

tagger_path = ''/path/to/nltk_data/taggers/maxent_treebank_pos_tagger/english.pickle'' default_tagger = nltk.data.load(tagger_path)

Estoy tratando de crear un pequeño lenguaje similar al inglés para especificar tareas. La idea básica es dividir una declaración en verbos y frases nominales a las que esos verbos deberían aplicarse. Estoy trabajando con nltk pero no obteniendo los resultados que esperaba, por ejemplo:

>>> nltk.pos_tag(nltk.word_tokenize("select the files and copy to harddrive''")) [(''select'', ''NN''), (''the'', ''DT''), (''files'', ''NNS''), (''and'', ''CC''), (''copy'', ''VB''), (''to'', ''TO''), ("harddrive''", ''NNP'')] >>> nltk.pos_tag(nltk.word_tokenize("move the files to harddrive''")) [(''move'', ''NN''), (''the'', ''DT''), (''files'', ''NNS''), (''to'', ''TO''), ("harddrive''", ''NNP'')] >>> nltk.pos_tag(nltk.word_tokenize("copy the files to harddrive''")) [(''copy'', ''NN''), (''the'', ''DT''), (''files'', ''NNS''), (''to'', ''TO''), ("harddrive''", ''NNP'')]

En cada caso, no se ha dado cuenta de que la primera palabra (seleccionar, mover y copiar) estaba pensada como verbos. Sé que puedo crear etiquetadores y gramáticas personalizados para solucionar esto, pero al mismo tiempo tengo dudas de reinventar la rueda cuando muchas de estas cosas están fuera de mi liga. Particularmente preferiría una solución donde los idiomas que no están en inglés también se puedan manejar.

De todos modos, mi pregunta es una de las siguientes: ¿Existe un etiquetador mejor para este tipo de gramática? ¿Hay alguna forma de ponderar a un etiquetador existente para que use la forma verbal más frecuentemente que la forma nominal? ¿Hay una manera de entrenar a un tagger? ¿Hay una mejor manera en conjunto?


La respuesta de Jacob es acertada. Sin embargo, para ampliarlo, es posible que necesite más que solo unigramas.

Por ejemplo, considera las tres oraciones:

select the files use the select function on the sockets the select was good

Aquí, la palabra "seleccionar" se usa como verbo, adjetivo y sustantivo respectivamente. Un etiquetador de unigram no podrá modelar esto. Incluso un etiquetador de bigramas no puede manejarlo, porque dos de los casos comparten la misma palabra anterior (es decir, "el"). Necesitarías un etiquetador de trigramas para manejar este caso correctamente.

import nltk.tag, nltk.data from nltk import word_tokenize default_tagger = nltk.data.load(nltk.tag._POS_TAGGER) def evaluate(tagger, sentences): good,total = 0,0. for sentence,func in sentences: tags = tagger.tag(nltk.word_tokenize(sentence)) print tags good += func(tags) total += 1 print ''Accuracy:'',good/total sentences = [ (''select the files'', lambda tags: (''select'', ''VB'') in tags), (''use the select function on the sockets'', lambda tags: (''select'', ''JJ'') in tags and (''use'', ''VB'') in tags), (''the select was good'', lambda tags: (''select'', ''NN'') in tags), ] train_sents = [ [(''select'', ''VB''), (''the'', ''DT''), (''files'', ''NNS'')], [(''use'', ''VB''), (''the'', ''DT''), (''select'', ''JJ''), (''function'', ''NN''), (''on'', ''IN''), (''the'', ''DT''), (''sockets'', ''NNS'')], [(''the'', ''DT''), (''select'', ''NN''), (''files'', ''NNS'')], ] tagger = nltk.TrigramTagger(train_sents, backoff=default_tagger) evaluate(tagger, sentences) #model = tagger._context_to_tag

Tenga en cuenta que puede usar NgramTagger de NgramTagger para entrenar a un etiquetador que utiliza un número arbitrariamente alto de n-gramas, pero normalmente no obtiene un gran aumento de rendimiento después de los trigrams.


Una solución es crear un UnigramTagger manual que retroceda al etiquetador NLTK. Algo como esto:

>>> import nltk.tag, nltk.data >>> default_tagger = nltk.data.load(nltk.tag._POS_TAGGER) >>> model = {''select'': ''VB''} >>> tagger = nltk.tag.UnigramTagger(model=model, backoff=default_tagger)

Entonces tienes

>>> tagger.tag([''select'', ''the'', ''files'']) [(''select'', ''VB''), (''the'', ''DT''), (''files'', ''NNS'')]

Este mismo método puede funcionar para idiomas distintos del inglés, siempre que tenga un etiquetador predeterminado apropiado. Puede entrenar a sus propios etiquetadores usando train_tagger.py de nltk-trainer y un corpus apropiado.


Vea la respuesta de Jacob.

En versiones posteriores (al menos nltk 3.2) nltk.tag._POS_TAGGER no existe. Los etiquetadores predeterminados generalmente se descargan en el directorio nltk_data / taggers / , por ejemplo:

>>> import nltk >>> nltk.download(''maxent_treebank_pos_tagger'')

El uso es el siguiente.

>>> import nltk.tag, nltk.data >>> tagger_path = ''/path/to/nltk_data/taggers/maxent_treebank_pos_tagger/english.pickle'' >>> default_tagger = nltk.data.load(tagger_path) >>> model = {''select'': ''VB''} >>> tagger = nltk.tag.UnigramTagger(model=model, backoff=default_tagger)

Vea también: Cómo hacer el etiquetado POS usando el etiquetador POS NLTK en Python .