En este 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.
In [1]:
import nltk
from nltk.corpus import cess_esp
cess_esp = cess_esp.tagged_sents()
print(cess_esp[5])
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 primeras 50 palabras encontramos:
da0ms0
: determinante artículo masculino singularncms000
: nombre común masculino singularaq0cs0
: adjetivo calificativo de género común singularnp00000
: nombre propio sps00
: preposiciónvmis3s0
: verbo principal indicativo pasado 3ª persona del singularAquí tienes el la explicación de las etiquetas y el catálogo completo de rasgos para el etiquetado en español usadas en este corpus. A partir de lo que aprendas en el enlace anterior:
In [2]:
# escribe tu código aquí
# la etiqueta de 3 pers plur del pret. perf simpl es: vmis3p0
verbos_en_pasado = []
total = 0
for oracion in cess_esp:
total += len(oracion)
for item in oracion:
if item[1] == 'vmis3p0':
verbos_en_pasado.append(item[0])
print('Tengo', len(verbos_en_pasado), 'verbos en pasado y', total, 'palabras en total')
print('El porcentaje de verbos es', len(verbos_en_pasado)/total)
Las etiquetas morfológicas que hemos visto son bastante complejas, ya que incorporan los rasgos de la flexión del español. Afortunadamente, NLTK permite cargar los corpus etiquetados con un conjunto de etiquetas universal y simplificado (todos los detalles en el paper) utilizando la opcion tagset='universal'
. Para ello, asegúrate de que has almacenado dentro de tu directorio de recursos de nltk
el mapeo de etiquetas originales del corpus con su versión simplificada. Este fichero se llama universal_tagset-ES.map
y lo tienes en la carpeta data
del respositorio. Es recomendable renombrarlo, por ejemplo:
In [3]:
!cp ../data/universal_tagset-ES.map ~/nltk_data/taggers/universal_tagset/es-ancora.map
Después, ejecuta la siguiente celda y fíjate cómo hemos cargado una lista de oraciones etiquetadas con esta nueva versión de las etiquetas.
In [4]:
from nltk.corpus import cess_esp
cess_esp._tagset = 'es-ancora'
oraciones = cess_esp.tagged_sents(tagset='universal')
print(oraciones[0])
Estas etiquetas son más sencillas, ¿verdad? Básicamente tenemos DET
para determinante, NOUN
para nombre, VERB
para verbo, ADJ
para adjetivo, ADP
para preposición, etc.
Vamos a utilizar este corpus 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.
oraciones
y utilice en etiquetador anterior como respaldo.oraciones
y utilice en etiquetador anterior como respaldo.oraciones
y utilice en etiquetador anterior como respaldo.
In [5]:
# escribe tu código aquí
defaultTagger = nltk.DefaultTagger('NOUN')
unigramTagger = nltk.UnigramTagger(oraciones, backoff=defaultTagger)
bigramTagger = nltk.BigramTagger(oraciones, backoff=unigramTagger)
trigramTagger = nltk.TrigramTagger(oraciones, backoff=bigramTagger)
In [6]:
# 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()))