(volver a la página principal)
En este trabajo práctico implementaremos modelos de lenguaje 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 languagemodeling
.
Criterios de Evaluación:
PlaintextCorpusReader
) o definiendo uno propio.sents
que permita iterar sobre las oraciones tokenizadas del corpus.train.py
para utilizar el nuevo corpus.
Interfaz de train.py
:
$ python languagemodeling/scripts/train.py --help Train an n-gram model. Usage: train.py [-m <model>] -n <n> -o <file> train.py -h | --help Options: -n <n> Order of the model. -m <model> Model to use [default: ngram]: ngram: Unsmoothed n-grams. addone: N-grams with add-one smoothing. inter: N-grams with interpolation smoothing. -o <file> Output model file. -h --help Show this screen.
Documentación:
Implementar un modelo de n-gramas con marcadores de comienzo y fin de oración
(<s>
y </s>
).
Interfaz de la clase NGram
(en ngram.py
):
class NGram: def __init__(self, n, sents): """ n -- order of the model. sents -- list of sentences, each one being a list of tokens. """ def count(self, tokens): """Count for an n-gram or (n-1)-gram. tokens -- the n-gram or (n-1)-gram tuple. """ def cond_prob(self, token, prev_tokens=None): """Conditional probability of a token. token -- the token. prev_tokens -- the previous n-1 tokens (optional only if n = 1). """ def sent_prob(self, sent): """Probability of a sentence. Warning: subject to underflow problems. sent -- the sentence as a list of tokens. """ def sent_log_prob(self, sent): """Log-probability of a sentence. sent -- the sentence as a list of tokens. """
Tests:
$ nosetests languagemodeling/tests/test_ngram.py
Documentación:
ngram_generator.py
una clase NGramGenerator
para generar oraciones de lenguaje natural.generate.py
para cargar un modelo de n-gramas y generar oraciones con él:
Funciones a implementar en ngram_generator.py
:
class NGramGenerator: def __init__(self, model): """ model -- n-gram model. """ def generate_sent(self): """Randomly generate a sentence.""" def generate_token(self, prev_tokens=None): """Randomly generate a token, given prev_tokens. prev_tokens -- the previous n-1 tokens (optional only if n = 1). """
Interfaz de generate.py
:
$ python languagemodeling/scripts/generate.py --help Generate natural language sentences using a language model. Usage: generate.py -i <file> -n <n> generate.py -h | --help Options: -i <file> Language model file. -n <n> Number of sentences to generate. -h --help Show this screen.
Tests:
$ nosetests languagemodeling/tests/test_ngram_generator.py
Documentación:
ngram.py
en una clase AddOneNGram
.NGram
más el método V
especificado abajo.</s>
.train.py
) una opción de línea de comandos que permita utilizar add-one en lugar de n-gramas clásicos.
Interfaz de la clase AddOneNGram
(en ngram.py
):
class AddOneNGram: """ Todos los métodos de NGram. """ def V(self): """Size of the vocabulary. """
Tests:
$ nosetests languagemodeling/tests/test_addone_ngram.py
Documentación:
ngram.LanguageModel
.eval.py
para cargar un modelo de lenguajes y evaluarlo sobre el conjunto de test.train.py
para entrenar el modelo “add one” y guardar las instancias resultantes para varios valores de n (1, 2, 3 y 4).eval.py
para calcular la perplejidad de los modelos entrenados en el ejercicio anterior. Reportar los resultados en el README.
Interfaz de eval.py
:
$ python languagemodeling/scripts/eval.py --help Evaulate a language model using the test set. Usage: eval.py -i <file> eval.py -h | --help Options: -i <file> Language model file. -h --help Show this screen.
Documentación:
ngram.py
en una clase InterpolatedNGram
.train.py
) una opción de línea de comandos que permita utilizar este modelo.n
(1, 2, 3 y 4). Reportar los resultados en el README.
Interfaz de la clase InterpolatedNGram
(en ngram.py
):
class InterpolatedNGram: def __init__(self, n, sents, gamma=None, addone=True): """ n -- order of the model. sents -- list of sentences, each one being a list of tokens. gamma -- interpolation hyper-parameter (if not given, estimate using held-out data). addone -- whether to use addone smoothing (default: True). """ """ Todos los métodos de NGram. """
Tests:
$ nosetests languagemodeling/tests/test_interpolated_ngram.py
Documentación:
ngram.py
en una clase BackOffNGram
.n
(1, 2, 3 y 4). Reportar los resultados en el README.
Interfaz de la clase BackOffNGram
(en ngram.py
):
class BackOffNGram: def __init__(self, n, sents, beta=None, addone=True): """ Back-off NGram model with discounting as described by Michael Collins. n -- order of the model. sents -- list of sentences, each one being a list of tokens. beta -- discounting hyper-parameter (if not given, estimate using held-out data). addone -- whether to use addone smoothing (default: True). """ """ Todos los métodos de NGram. """ def A(self, tokens): """Set of words with counts > 0 for a k-gram with 0 < k < n. tokens -- the k-gram tuple. """ def alpha(self, tokens): """Missing probability mass for a k-gram with 0 < k < n. tokens -- the k-gram tuple. """ def denom(self, tokens): """Normalization factor for a k-gram with 0 < k < n. tokens -- the k-gram tuple. """
Tests:
$ nosetests languagemodeling/tests/test_backoff_ngram.py
Documentación:
nltk.metrics.distance.edit_distance
nltk.align.bleu_score.bleu