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/05/30 20:42] – francolq | materias:pln:practico1 [2019/02/05 19: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 ([[https:// | ||
- | |||
- | * 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.1496176957.txt.gz · Última modificación: 2018/08/10 03:03 (editor externo)