En este primer ejercicio vamos a jugar con uno de los corpus en español que está disponible desde NLTK: CESS_ESP, un treebank anotado a partir de una colección de noticias en español.
Este corpus está actualmente incluído en un recurso más amplio, el corpus AnCora que desarrollan en la Universitat de Barcelona. Para más información, podéis leer el artículo de M. Taulé, M. A. Martí y M. Recasens "AnCora: Multilevel Annotated Corpora for Catalan and Spanish". Proceedings of 6th International Conference on Language Resources and Evaluation (LREC 2008). 2008. Marrakesh (Morocco).
Antes de nada, ejecuta la siguiente celda para acceder al corpus y a otras herramientas que vamos a usar en este ejercicio.
from nltk.corpus import cess_esp
import nltk
Carga en una variable llamada palabras
las palabras del corpus cess_esp
etiquetas morfológicamente. Imprime por pantalla:
# escribe tu código aquí
[(u'El', u'da0ms0'), (u'grupo', u'ncms000'), (u'estatal', u'aq0cs0'), (u'Electricit\xe9_de_France', u'np00000'), (u'-Fpa-', u'Fpa'), (u'EDF', u'np00000'), (u'-Fpt-', u'Fpt'), (u'anunci\xf3', u'vmis3s0'), (u'hoy', u'rg'), (u',', u'Fc'), (u'jueves', u'W'), (u',', u'Fc'), (u'la', u'da0fs0'), (u'compra', u'ncfs000'), (u'del', u'spcms'), (u'51_por_ciento', u'Zp'), (u'de', u'sps00'), (u'la', u'da0fs0'), (u'empresa', u'ncfs000'), (u'mexicana', u'aq0fs0'), (u'Electricidad_\xc1guila_de_Altamira', u'np00000'), (u'-Fpa-', u'Fpa'), (u'EAA', u'np00000'), (u'-Fpt-', u'Fpt'), (u',', u'Fc'), (u'creada', u'aq0fsp'), (u'por', u'sps00'), (u'el', u'da0ms0'), (u'japon\xe9s', u'aq0ms0'), (u'Mitsubishi_Corporation', u'np00000'), (u'para', u'sps00'), (u'poner_en_marcha', u'vmn0000'), (u'una', u'di0fs0'), (u'central', u'ncfs000'), (u'de', u'sps00'), (u'gas', u'ncms000'), (u'de', u'sps00'), (u'495', u'Z'), (u'megavatios', u'ncmp000'), (u'.', u'Fp'), (u'Una', u'di0fs0'), (u'portavoz', u'nccs000'), (u'de', u'sps00'), (u'EDF', u'np00000'), (u'explic\xf3', u'vmis3s0'), (u'a', u'sps00'), (u'EFE', u'np00000'), (u'que', u'cs'), (u'el', u'da0ms0'), (u'proyecto', u'ncms000')]
Fíjate que las etiquetas que se usan en el treebank español son diferentes a las etiquetas que habíamos visto en inglés. Para empezar, el español es una lengua con una morfología más rica: si queremos reflejar el género y el número de los adjetivos, por ejemplo, no nos vale con etiquetar los adjetivos con una simple JJ
.
Echa un vistazo a las etiquetas morfológicas y trata de interpretar su significado. En estas primera 50 palabras encontramos:
da0ms0
: determinante artículo masculino singularncms000
: nombre común masculino singularaq0cs0
: adjetivo calificativo de género común singularnp00000
: nombre propiosps00
: preposiciónvmis3s0
: verbo principal indicativo pasado 3ª persona del singularAquí tienes el la explicación y el catálogo completo de etiquetas usadas en este corpus. A partir de lo que aprendas en el enlace anterior:
# escribe tu código aquí
Las etiquetas morfológicas que hemos visto son bastante complejas. NLTK permite cargar los corpus etiquetados con un conjunto de etiquetas simplificado utilizando la opcion simplify_tags=True
. Para ello, ejecuta la siguiente celda y fíjate cómo hemos cargado una lista de oraciones etiquetadas con esta nueva versión de las etiquetas.
oraciones = cess_esp.tagged_sents(simplify_tags=True)
print oraciones[:2]
Estas etiquetas son más sencillas, ¿verdad? Básicamente tenemos D
para determinante, N
para nombre, V
para verbo, A
para adjetivo, S
para preposición, etc.
Vamos a utilizar este corpus de etiquetas simplificadas para entrenar varios etiquetadores basados en ngramas, tal y como hicimos en clase y se explica en la presentación nltk-pos
.
Construye de manera incremental cuatro etiquetadores.
N
a todas las palabras.oraciones
y utilice en etiquetador anterior como respaldo.oraciones
y utilice en etiquetador anterior como respaldo.oraciones
y utilice en etiquetador anterior como respaldo.# escribe tu código aquí
# prueba tu etiquetador basado en trigramas con las siguientes oraciones que, con toda seguridad, no aparecen en el corpus
print trigramTagger.tag("Este banco está ocupado por un padre y por un hijo. El padre se llama Juan y el hijo ya te lo he dicho".split())
print trigramTagger.tag("""El presidente del gobierno por fin ha dado la cara para anunciar aumentos de presupuesto en Educación y Sanidad a costa de dejar de subvencionar las empresas de los amigotes.""".split())
print trigramTagger.tag("El cacique corrupto y la tonadillera se comerán el turrón en prisión.".split())