(volver a la página principal)
En este trabajo práctico implementaremos varios modelos de etiquetado de secuencias y realizaremos algunos experimentos con ellos.
El código base para el proyecto se encuentra en el repositorio de la materia. La entrega del proyecto es a través de github. Por lo tanto, deben hacer un “fork” del repositorio dentro de sus cuentas de github.
Además del código fuente, deben elaborar un README con una breve explicación de lo que hicieron en cada ejercicio. El README puede estar en texto plano (txt), markdown (md) o restrucured text (rst), y debe estar incluído dentro de la carpeta tagging
.
Criterios de Evaluación:
Programar un script stats.py
que muestre la siguiente información del corpus:
Uso del script:
$ python tagging/scripts/stats.py
Documentación:
Interfaz de BaselineTagger
en baseline.py
:
class BaselineTagger: def __init__(self, tagged_sents, default_tag='nc0s000'): """ tagged_sents -- training sentences, each one being a list of pairs. default_tag -- tag for unknown words. """ def tag(self, sent): """Tag a sentence. sent -- the sentence. """ def tag_word(self, w): """Tag a word. w -- the word. """ def unknown(self, w): """Check if a word is unknown for the model. w -- the word. """
Tests:
$ nosetests tagging/tests/test_baseline.py
Ejemplo de uso de los scripts:
$ python tagging/scripts/train.py -o baseline $ python tagging/scripts/eval.py -i baseline
Documentación:
features.py
los siguientes features básicos:word_lower
: la palabra actual en minúsculas.word_istitle
: la palabra actual empieza en mayúsculas.word_isupper
: la palabra actual está en mayúsculas.word_isdigit
: la palabra actual es un número.NPrevTags(n)
: la tupla de los últimos n
tags.PrevWord(f)
: Dado un feature f
, aplicarlo sobre la palabra anterior en lugar de la actual.
Interfaz de los features paramétricos en features.py
:
class NPrevTags(Feature): def __init__(self, n): """Feature: n previous tags tuple. n -- number of previous tags to consider. """ def _evaluate(self, h): """n previous tags tuple. h -- a history. """ class PrevWord(Feature): def __init__(self, f): """Feature: the feature f applied to the previous word. f -- the feature. """ def _evaluate(self, h): """Apply the feature to the previous word in the history. h -- the history. """
Tests:
$ nosetests tagging/tests/test_features.py
Documentación:
featureforge.vectorizer.Vectorizer
) con los features definidos en el ejercicio anterior.sklearn.linear_model.LogisticRegression
).tag
.n
(1, 2, 3 y 4).sklearn.naive_bayes.MultinomialNB
sklearn.svm.LinearSVC
Interfaz de MEMM
en memm.py
:
class MEMM: def __init__(self, n, tagged_sents, clf='svm'): """ n -- order of the model. tagged_sents -- list of sentences, each one being a list of pairs. clf -- classifying model, one of 'svm', 'maxent', 'mnb' (default: 'svm'). """ def sents_histories(self, tagged_sents): """ Iterator over the histories of a corpus. tagged_sents -- the corpus (a list of sentences) """ def sent_histories(self, tagged_sent): """ Iterator over the histories of a tagged sentence. tagged_sent -- the tagged sentence (a list of pairs (word, tag)). """ def sents_tags(self, tagged_sents): """ Iterator over the tags of a corpus. tagged_sents -- the corpus (a list of sentences) """ def sent_tags(self, tagged_sent): """ Iterator over the tags of a tagged sentence. tagged_sent -- the tagged sentence (a list of pairs (word, tag)). """ def tag(self, sent): """Tag a sentence. sent -- the sentence. """ def tag_history(self, h): """Tag a history. h -- the history. """ def unknown(self, w): """Check if a word is unknown for the model. w -- the word. """
Tests:
$ nosetests tagging/tests/test_memm.py
Documentación:
Implementar el algoritmo de Viterbi para obtener la secuencia de tags de máxima probabilidad de acuerdo a un MEMM:
predict_proba
si el clasificador lo tiene (e.g. LogisticRegression
y MultinomialNB
). Si no, usar la exponenciación (base 2) del método decision_function
(e.g. LinearSVC
).k
taggings más probables, a donde k
es un parámetro de la clase.LogisticRegression
y LinearSVC
), para varios valores de n
(1, 2, 3 y 4), y para varios valores de k
(1, 2 y 3). Reportar los resultados en el README. Reportar también tiempo de evaluación.Documentación: