materias:pln:practico1
Diferencias
Muestra las diferencias entre dos versiones de la página.
| Ambos lados, revisión anteriorRevisión previaPróxima revisión | Revisión previa | ||
| materias:pln:practico1 [2017/04/10 02:54] – francolq | materias:pln:practico1 [2019/02/05 16:43] (actual) – removed francolq | ||
|---|---|---|---|
| Línea 1: | Línea 1: | ||
| - | ====== Trabajo Práctico 1 - Modelado de Lenguaje ====== | ||
| - | [[materias: | ||
| - | |||
| - | En este trabajo práctico implementaremos varios modelos de lenguaje y | ||
| - | realizaremos algunos experimentos con ellos. | ||
| - | |||
| - | * Repositorio: | ||
| - | * **Fecha de entrega:** | ||
| - | * Ejercicios 1 al 5: 13/04 a las 23:59. | ||
| - | * Ejercicios 6,7,8: 20/04 a las 23:59. | ||
| - | |||
| - | |||
| - | ===== Instrucciones ===== | ||
| - | |||
| - | El código base para el proyecto se encuentra en el [[https:// | ||
| - | La entrega del proyecto es a través de github. Por lo tanto, deben **hacer un " | ||
| - | |||
| - | 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 '' | ||
| - | |||
| - | Criterios de Evaluación: | ||
| - | |||
| - | * Estilo de codificación (chequeado con flake8 y a ojo). | ||
| - | * Diseño del código: uso de clases, herencia, etc. | ||
| - | * Uso y aprobación de tests (provistos y definidos por uds.). | ||
| - | * Uso apropiado de git (commits granulares, logs informativos). | ||
| - | * Resultados. | ||
| - | * README. | ||
| - | |||
| - | ===== Ejercicio 1: Corpus ===== | ||
| - | |||
| - | * Elegir corpus de texto en lenguaje natural de más de 5Mb de tamaño. | ||
| - | * Cargar el corpus usando un " | ||
| - | * El " | ||
| - | * Revisar a ojo la correcta tokenización y segmentado en oraciones. De ser necesario, probar otras formas de tokenización/ | ||
| - | * Modificar el script '' | ||
| - | |||
| - | Documentación: | ||
| - | * http:// | ||
| - | * http:// | ||
| - | * http:// | ||
| - | * Ejemplo dado en clase de cómo tokenizar con expresiones regulares: http:// | ||
| - | * [[https:// | ||
| - | |||
| - | |||
| - | ===== Ejercicio 2: Modelo de n-gramas ===== | ||
| - | |||
| - | Implementar un modelo de n-gramas con marcadores de comienzo y fin de oración | ||
| - | (''< | ||
| - | |||
| - | Interfaz de la clase '' | ||
| - | |||
| - | <code python> | ||
| - | class NGram: | ||
| - | |||
| - | def __init__(self, | ||
| - | """ | ||
| - | n -- order of the model. | ||
| - | sents -- list of sentences, each one being a list of tokens. | ||
| - | """ | ||
| - | |||
| - | def count(self, tokens): | ||
| - | """ | ||
| - | |||
| - | tokens -- the n-gram or (n-1)-gram tuple. | ||
| - | """ | ||
| - | |||
| - | def cond_prob(self, | ||
| - | """ | ||
| - | |||
| - | token -- the token. | ||
| - | prev_tokens -- the previous n-1 tokens (optional only if n = 1). | ||
| - | """ | ||
| - | |||
| - | def sent_prob(self, | ||
| - | """ | ||
| - | |||
| - | sent -- the sentence as a list of tokens. | ||
| - | """ | ||
| - | |||
| - | def sent_log_prob(self, | ||
| - | """ | ||
| - | |||
| - | sent -- the sentence as a list of tokens. | ||
| - | """ | ||
| - | </ | ||
| - | |||
| - | Tests: | ||
| - | |||
| - | $ nosetests languagemodeling/ | ||
| - | |||
| - | |||
| - | ===== Ejercicio 3: Generación de Texto ===== | ||
| - | |||
| - | * Implementar en '' | ||
| - | * Programar un script '' | ||
| - | * Generar oraciones usando n-gramas con n en {1, 2, 3, 4}. Armar una figura similar a la Figura 4.3 de Jurafsky & Martin (2008). Incluirla en el README. | ||
| - | |||
| - | Funciones a implementar en '' | ||
| - | |||
| - | <code python> | ||
| - | class NGramGenerator: | ||
| - | |||
| - | def __init__(self, | ||
| - | """ | ||
| - | model -- n-gram model. | ||
| - | """ | ||
| - | |||
| - | def generate_sent(self): | ||
| - | """ | ||
| - | |||
| - | def generate_token(self, | ||
| - | """ | ||
| - | |||
| - | prev_tokens -- the previous n-1 tokens (optional only if n = 1). | ||
| - | """ | ||
| - | </ | ||
| - | |||
| - | Interfaz de '' | ||
| - | |||
| - | < | ||
| - | $ python languagemodeling/ | ||
| - | Generate natural language sentences using a language model. | ||
| - | |||
| - | Usage: | ||
| - | generate.py -i < | ||
| - | generate.py -h | --help | ||
| - | |||
| - | Options: | ||
| - | -i < | ||
| - | -n < | ||
| - | -h --help | ||
| - | </ | ||
| - | |||
| - | Tests: | ||
| - | |||
| - | $ nosetests languagemodeling/ | ||
| - | |||
| - | Documentación: | ||
| - | |||
| - | * https:// | ||
| - | |||
| - | |||
| - | ===== Ejercicio 4: Suavizado " | ||
| - | |||
| - | * Implementar el suavizado " | ||
| - | * La clase debe tener **la misma interfaz que '' | ||
| - | * Calcular V como el tamaño del alfabeto incluyendo el marcador ''</ | ||
| - | * Agregar al script de entrenamiento (train.py) una opción de línea de comandos que permita utilizar add-one en lugar de n-gramas clásicos. | ||
| - | * Entrenar sobre nuestro corpus y guardar los modelos resultantes para varios valores de n (1, 2, 3 y 4). | ||
| - | |||
| - | Interfaz de la clase '' | ||
| - | |||
| - | <code python> | ||
| - | class AddOneNGram: | ||
| - | |||
| - | """ | ||
| - | Todos los métodos de NGram. | ||
| - | """ | ||
| - | |||
| - | def V(self): | ||
| - | """ | ||
| - | """ | ||
| - | </ | ||
| - | |||
| - | Nueva interfaz de '' | ||
| - | |||
| - | < | ||
| - | $ python languagemodeling/ | ||
| - | Train an n-gram model. | ||
| - | |||
| - | Usage: | ||
| - | train.py -n <n> [-m < | ||
| - | train.py -h | --help | ||
| - | |||
| - | Options: | ||
| - | -n < | ||
| - | -m < | ||
| - | ngram: Unsmoothed n-grams. | ||
| - | addone: N-grams with add-one smoothing. | ||
| - | -o < | ||
| - | -h --help | ||
| - | </ | ||
| - | |||
| - | Tests: | ||
| - | |||
| - | $ nosetests languagemodeling/ | ||
| - | |||
| - | |||
| - | ===== Ejercicio 5: Evaluación de Modelos de Lenguaje ===== | ||
| - | |||
| - | * Separar el corpus en entrenamiento y test (90% y 10% resp.). | ||
| - | * Implementar el cálculo de log-probability, | ||
| - | * Programar un script '' | ||
| - | * Calcular perplejidad de los modelos entrenados en el ejercicio anterior. Reportar los resultados en el README. | ||
| - | |||
| - | Interfaz de '' | ||
| - | |||
| - | < | ||
| - | $ python languagemodeling/ | ||
| - | Evaulate a language model using the test set. | ||
| - | |||
| - | Usage: | ||
| - | eval.py -i < | ||
| - | eval.py -h | --help | ||
| - | |||
| - | Options: | ||
| - | -i < | ||
| - | -h --help | ||
| - | </ | ||
| - | |||
| - | |||
| - | ===== Ejercicio 6: Suavizado por Interpolación ===== | ||
| - | |||
| - | * Implementar el suavizado por interpolación en '' | ||
| - | * Calcular lambdas en términos de un único parámetro gamma (ver documentación abajo). | ||
| - | * Usar add-one para el nivel más bajo (unigramas). | ||
| - | * Usar datos held-out (un 10% de train) y barrido para elegir valor para gamma. | ||
| - | * Agregar al script de entrenamiento (train.py) una opción de línea de comandos que permita utilizar este modelo. | ||
| - | * Calcular y reportar perplejidad para varios valores de '' | ||
| - | |||
| - | Interfaz de la clase '' | ||
| - | |||
| - | <code python> | ||
| - | class InterpolatedNGram: | ||
| - | |||
| - | def __init__(self, | ||
| - | """ | ||
| - | 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/ | ||
| - | |||
| - | Documentación: | ||
| - | |||
| - | * [[http:// | ||
| - | (Course notes for NLP by Michael Collins, Columbia University)]] | ||
| - | * [[https:// | ||
| - | * [[https:// | ||
| - | |||
| - | |||
| - | ===== Ejercicio 7: Suavizado por Back-Off con Discounting ===== | ||
| - | |||
| - | * Implementar el suavizado por back-off con discounting en '' | ||
| - | * Usar add-one para el nivel más bajo (unigramas). | ||
| - | * Usar datos held-out (un 10% de train) y barrido para elegir valor para beta. | ||
| - | * Agregar al script de entrenamiento (train.py) una opción de línea de comandos que permita utilizar este modelo. | ||
| - | * Calcular y reportar perplejidad para varios valores de '' | ||
| - | |||
| - | Interfaz de la clase '' | ||
| - | |||
| - | <code python> | ||
| - | class BackOffNGram: | ||
| - | |||
| - | def __init__(self, | ||
| - | """ | ||
| - | 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): | ||
| - | """ | ||
| - | |||
| - | tokens -- the k-gram tuple. | ||
| - | """ | ||
| - | |||
| - | def alpha(self, tokens): | ||
| - | """ | ||
| - | |||
| - | tokens -- the k-gram tuple. | ||
| - | """ | ||
| - | |||
| - | def denom(self, tokens): | ||
| - | """ | ||
| - | |||
| - | tokens -- the k-gram tuple. | ||
| - | """ | ||
| - | </ | ||
| - | |||
| - | Tests: | ||
| - | |||
| - | $ nosetests languagemodeling/ | ||
| - | |||
| - | Documentación: | ||
| - | |||
| - | * [[http:// | ||
| - | (Course notes for NLP by Michael Collins, Columbia University)]] | ||
| - | * [[https:// | ||
| - | * https:// | ||
| - | * https:// | ||
| - | |||
| - | |||
| - | ===== Ejercicio 8 (punto bonus): Reordenamiento de Palabras ó Atribución de Autoría ===== | ||
| - | |||
| - | * Elegir y resolver uno de los dos ejercicios siguientes de Jurafsky & Martin (2008): | ||
| - | * Ejercicio 4.9: Reordenamiento de palabras. | ||
| - | * Ejercicio 4.10: Atribución de autoría. | ||
| - | |||
| - | * Sobre el ejercicio 4.9: | ||
| - | * Implementar una clase que, dada una lista de palabras desordenadas de una oración, devuelva el ordenamiento más probable de acuerdo a un modelo de lenguaje. | ||
| - | * Implementar un script que tome el conjunto de test y para cada oración, la desordene y la vuelva a ordenar usando un modelo de lenguaje dado como parámetro. | ||
| - | * Usar las métricas BLEU y distancia de edición para evaluar la calidad de los reordenamientos (respecto de las oraciones originales). En NLTK: | ||
| - | * '' | ||
| - | * '' | ||
| - | |||
| - | * Sobre el ejercicio 4.10: | ||
| - | * Se requiere tener documentos de dos o más clases diferentes. Por ejemplo, escritos de dos autores diferentes. | ||
| - | * Definir conjuntos de entrenamiento y test para cada clase (90% y 10% resp.). | ||
| - | * Entrenar un modelo de lenguaje para cada clase, siguiendo las indicaciones del libro. | ||
| - | * Implementar un script que tome los conjuntos de test y adivine a qué clase corresponde cada uno. | ||
| - | |||
materias/pln/practico1.1491803661.txt.gz · Última modificación: (editor externo)
