Tabla de Contenidos

Trabajo Práctico 1 - Modelado de Lenguaje

(volver a la página principal)

En este trabajo práctico implementaremos varios modelos de lenguaje y realizaremos algunos experimentos con ellos.

Instrucciones

El código base para el proyecto se encuentra en el branch ''practico1'' del repositorio del a 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:

Ejercicio 1: Corpus

Documentación:

Ejercicio 2: Modelo de n-gramas

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 

Ejercicio 3: Generación de Texto

Funciones a implementar en ngram.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:

Ejercicio 4: Suavizado "add-one"

Interfaz de la clase AddOneNGram (en ngram.py):

class AddOneNGram:
 
    """
       Todos los métodos de NGram.
    """
 
    def V(self):
        """Size of the vocabulary.
        """

Nueva interfaz de train.py:

$ python languagemodeling/scripts/train.py  --help
Train an n-gram model.

Usage:
  train.py -n <n> [-m <model>] -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.
  -o <file>     Output model file.
  -h --help     Show this screen.

Tests:

$ nosetests languagemodeling/tests/test_addone_ngram.py 

Ejercicio 5: Evaluación de Modelos de Lenguaje

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.

Ejercicio 6: Suavizado por Interpolación

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:

Ejercicio 7: Suavizado por Back-Off con Discounting

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:

Ejercicio 8 (punto bonus): Reordenamiento de Palabras ó Atribución de Autoría