UD03 · EX3 — NLTK y Python¶
Uso de NLTK y Python¶
- Referencias:
a)Procesamiento del corpus cess_esp anotado con información morfosintáctica.¶
- Dividir el corpus en dos partes: training (el 90% de las primeras frases) y de test (el 10% restante)
- Reducir el conjunto de etiquetas morfosintácticas del corpus (289) a un conjunto reducido(67). Para ello, considerar las etiquetas de longitud =2 salvo los verbos (v) y los signos de puntuación (F) que pueden ser de tres. También pueden existir etiquetas de longitud =1. Eliminar también las tuplas vacias, por ejemplo: (u'0', u'sn'), son tuplas que el primer elemento tiene el valor '0'.
Nota: para entender el significado de las etiquetas se puede consultar el siguiente enlace: https://freeling-user-manual.readthedocs.io/en/latest/tagsets/tagset-es/
Ejemplo de lo que se pide:
- original
[[('El', 'da0ms0'), ('grupo', 'ncms000'), ('estatal', 'aq0cs0'), ('Electricité_de_France', 'np00000'), ('-Fpa-', 'Fpa'), ('EDF', 'np00000'), ('-Fpt-', 'Fpt'), ('anunció', 'vmis3s0'), ('hoy', 'rg'), (',', 'Fc'), ('jueves', 'W'), (',', 'Fc'), ('la', 'da0fs0'), ('compra', 'ncfs000'), ('del', 'spcms'), ('51_por_ciento', 'Zp'), ('de', 'sps00'), ('la', 'da0fs0'), ('empresa', 'ncfs000'), ('mexicana', 'aq0fs0'), ('Electricidad_Águila_de_Altamira', 'np00000'), ('-Fpa-', 'Fpa'), ('EAA', 'np00000'), ('-Fpt-', 'Fpt'), (',', 'Fc'), ('creada', 'aq0fsp'), ('por', 'sps00'), ('el', 'da0ms0'), ('japonés', 'aq0ms0'), ('Mitsubishi_Corporation', 'np00000'), ('para', 'sps00'), ('poner_en_marcha', 'vmn0000'), ('una', 'di0fs0'), ('central', 'ncfs000'), ('de', 'sps00'), ('gas', 'ncms000'), ('de', 'sps00'), ('495', 'Z'), ('megavatios', 'ncmp000'), ('.', 'Fp')], [('Una', 'di0fs0'), ('portavoz', 'nccs000'), ('de', 'sps00'), ('EDF', 'np00000'), ('explicó', 'vmis3s0'), ('a', 'sps00'), ('EFE', 'np00000'), ('que', 'cs'), ('el', 'da0ms0'), ('proyecto', 'ncms000'), ('para', 'sps00'), ('la', 'da0fs0'), ('construcción', 'ncfs000'), ('de', 'sps00'), ('Altamira_2', 'np00000'), (',', 'Fc'), ('al', 'spcms'), ('norte', 'ncms000'), ('de', 'sps00'), ('Tampico', 'np00000'), (',', 'Fc'), ('prevé', 'vmm02s0'), ('la', 'da0fs0'), ('utilización', 'ncfs000'), ('de', 'sps00'), ('gas', 'ncms000'), ('natural', 'aq0cs0'), ('como', 'cs'), ('combustible', 'ncms000'), ('principal', 'aq0cs0'), ('en', 'sps00'), ('una', 'di0fs0'), ('central', 'ncfs000'), ('de', 'sps00'), ('ciclo', 'ncms000'), ('combinado', 'aq0msp'), ('que', 'pr0cn000'), ('debe', 'vmip3s0'), ('empezar', 'vmn0000'), ('a', 'sps00'), ('funcionar', 'vmn0000'), ('en', 'sps00'), ('mayo_del_2002', 'W'), ('.', 'Fp')]]
- nuevo
[[('El', 'da'), ('grupo', 'nc'), ('estatal', 'aq'), ('Electricité_de_France', 'np'), ('-Fpa-', 'fpa'), ('EDF', 'np'), ('-Fpt-', 'fpt'), ('anunció', 'vmi'), ('hoy', 'rg'), (',', 'fc'), ('jueves', 'w'), (',', 'fc'), ('la', 'da'), ('compra', 'nc'), ('del', 'sp'), ('51_por_ciento', 'zp'), ('de', 'sp'), ('la', 'da'), ('empresa', 'nc'), ('mexicana', 'aq'), ('Electricidad_Águila_de_Altamira', 'np'), ('-Fpa-', 'fpa'), ('EAA', 'np'), ('-Fpt-', 'fpt'), (',', 'fc'), ('creada', 'aq'), ('por', 'sp'), ('el', 'da'), ('japonés', 'aq'), ('Mitsubishi_Corporation', 'np'), ('para', 'sp'), ('poner_en_marcha', 'vmn'), ('una', 'di'), ('central', 'nc'), ('de', 'sp'), ('gas', 'nc'), ('de', 'sp'), ('495', 'z'), ('megavatios', 'nc'), ('.', 'fp')], [('Una', 'di'), ('portavoz', 'nc'), ('de', 'sp'), ('EDF', 'np'), ('explicó', 'vmi'), ('a', 'sp'), ('EFE', 'np'), ('que', 'cs'), ('el', 'da'), ('proyecto', 'nc'), ('para', 'sp'), ('la', 'da'), ('construcción', 'nc'), ('de', 'sp'), ('Altamira_2', 'np'), (',', 'fc'), ('al', 'sp'), ('norte', 'nc'), ('de', 'sp'), ('Tampico', 'np'), (',', 'fc'), ('prevé', 'vmm'), ('la', 'da'), ('utilización', 'nc'), ('de', 'sp'), ('gas', 'nc'), ('natural', 'aq'), ('como', 'cs'), ('combustible', 'nc'), ('principal', 'aq'), ('en', 'sp'), ('una', 'di'), ('central', 'nc'), ('de', 'sp'), ('ciclo', 'nc'), ('combinado', 'aq'), ('que', 'pr'), ('debe', 'vmi'), ('empezar', 'vmn'), ('a', 'sp'), ('funcionar', 'vmn'), ('en', 'sp'), ('mayo_del_2002', 'w'), ('.', 'fp')]]
- opcional:
- número de frases: 6030
- número de palabras: 192686
In [ ]:
Copied!
import nltk
import nltk
In [ ]:
Copied!
# Descarga del corpus, sin el menu interactivo (nltk.download() a secas no funciona
# en Colab ni en un notebook no interactivo):
nltk.download('cess_esp')
# Descarga del corpus, sin el menu interactivo (nltk.download() a secas no funciona # en Colab ni en un notebook no interactivo): nltk.download('cess_esp')
In [ ]:
Copied!
#Esta linea carga el corpus en castellano, pero podemos hacerlo en ingles o catalan si os apetece
from nltk.corpus import cess_esp
corpus_sentences=cess_esp.tagged_sents()
#opcional: calculamos el número de sentencias y palabras del corpus y los mostramos.
#mostramos las 3 primeras frases del corpus (como está originalmente en el enunciado)
#Escribir el corpus en un fichero
#Leer el corpus de un fichero y guardalo en una lista
#Definimos una funcion auxiliar (getLabel) que a partir de una etiqueta, la reduzca a su nueva versión siguiendo las instrucciones del enunciado
#Definimos un array retic. A continuación leeremos todo el corpus, para cada etiqueta la procesaremos con getLabel y la guardaremos en retic.
#mostramos las 3 primeras frases del corpus con las etiquetas reducidas (como muestra el enunciado)
print(retic[0:2])
#Esta linea carga el corpus en castellano, pero podemos hacerlo en ingles o catalan si os apetece from nltk.corpus import cess_esp corpus_sentences=cess_esp.tagged_sents() #opcional: calculamos el número de sentencias y palabras del corpus y los mostramos. #mostramos las 3 primeras frases del corpus (como está originalmente en el enunciado) #Escribir el corpus en un fichero #Leer el corpus de un fichero y guardalo en una lista #Definimos una funcion auxiliar (getLabel) que a partir de una etiqueta, la reduzca a su nueva versión siguiendo las instrucciones del enunciado #Definimos un array retic. A continuación leeremos todo el corpus, para cada etiqueta la procesaremos con getLabel y la guardaremos en retic. #mostramos las 3 primeras frases del corpus con las etiquetas reducidas (como muestra el enunciado) print(retic[0:2])
b) Uso de etiquetadores morfosintácticos (hmm o tnt).¶
- Entrenar los etiquetadores con la partición de train previamente construida mostrar la precisión:
precisión hmm: 0.8784427571832664
In [ ]:
Copied!
#definimos la parte de corpus de entramiento (train 90%) y la parte de corpus de test (test 10%)
#importamos el etiquetador hmm o tnt, lo entrenamos y mostramos su precisión (accuracy)
#definimos la parte de corpus de entramiento (train 90%) y la parte de corpus de test (test 10%) #importamos el etiquetador hmm o tnt, lo entrenamos y mostramos su precisión (accuracy)
c) Etiquetar con dicho modelo el conjunto de test construido¶
- Evaluar las prestaciones sobre el conjunto de test
- Hacer una evaluación de las prestaciones de etiquetado usando todo el corpus (10-fold cross validation).
Media de la precisión de los 10 KFolds: 0.9580362988365326
In [ ]:
Copied!
#importamos scikit-learn y mostramos la versión para comprobar que todo funcione bien.
import sklearn
sklearn.__version__
#importamos scikit-learn y mostramos la versión para comprobar que todo funcione bien. import sklearn sklearn.__version__
In [ ]:
Copied!
#Montamos el kfold de 10 splits sin shuffle y sin random_state
#Para cada KFold guardamos su accuracy, y finalmente mostramos la media de los 10.
from sklearn.model_selection import KFold
#Montamos el kfold de 10 splits sin shuffle y sin random_state #Para cada KFold guardamos su accuracy, y finalmente mostramos la media de los 10. from sklearn.model_selection import KFold
d) Tokenizar una frase y etiquetarla con el modelo entrenado previamente¶
- Usar word_tokenize y tag del modelo usado (tnt, hmm)
In [ ]:
Copied!
#Usar el tokenizador de nltk
#Usar el tokenizador de nltk
e) De manera opcional puedes probar a cambiar el idioma, el corpus y ver si afecta mucho a la precisión de los modelos.¶
In [ ]:
Copied!