Este repositorio alberga la implementación del artículo "Aumento de la generación de respuestas neuronales con atención tópica consciente del contexto".
THRED es un sistema de generación de respuestas de múltiples turnos destinado a producir respuestas contextuales y temáticas. El código base ha evolucionado a partir del repositorio Tensorflow NMT.
TL;DR Pasos para crear un agente de diálogo utilizando este marco:
conda env create -f thred_env.yml
(para usar pip
, consulte Dependencias)MODEL_DIR
es un directorio en el que se guardará el modelo. Recomendamos entrenar en al menos 2 GPU; de lo contrario, puede reducir el tamaño de los datos (omitiendo las conversaciones del archivo de entrenamiento) y el tamaño del modelo (modificando el archivo de configuración). python -m thred --mode train --config conf/thred_medium.yml --model_dir <MODEL_DIR>
--train_data <TRAIN_DATA> --dev_data <DEV_DATA> --test_data <TEST_DATA>
python -m thred --mode interactive --model_dir <MODEL_DIR>
1 paquetes necesarios solo para analizar y limpiar los datos de Reddit. 2 se usa solo para probar modelos de diálogo en modo interactivo de línea de comandos
Para instalar las dependencias usando pip
, ejecute pip install -r requirements
. Y para Anaconda, ejecute conda env create -f thred_env.yml
(recomendado). Una vez que haya terminado con las dependencias, ejecute pip install -e .
para instalar el paquete thred.
Nuestro conjunto de datos de Reddit, al que llamamos Reddit Conversation Corpus (RCC), se recopila de 95 subreddits seleccionados (enumerados aquí). Procesamos Reddit durante un período de 20 meses que va desde noviembre de 2016 hasta agosto de 2018 (excluyendo junio de 2017 y julio de 2017; utilizamos estos dos meses junto con los datos de octubre de 2016 para entrenar un modelo LDA). Consulte aquí para obtener detalles sobre cómo se construye el conjunto de datos de Reddit, incluido el preprocesamiento y la limpieza de los archivos sin procesar de Reddit. La siguiente tabla resume la información del RCC:
Cuerpo | #tren | #desarrollador | #prueba | Descargar | Descargar con palabras temáticas |
---|---|---|---|---|---|
3 vueltas por línea | 9,2 millones | 508K | 406K | descargar (773MB) | descargar (2,5 GB) |
4 vueltas por línea | 4M | 223K | 178K | descargar (442MB) | descargar (1,2 GB) |
5 vueltas por línea | 1,8 millones | 100K | 80K | descargar (242MB) | descargar (594MB) |
En los archivos de datos, cada línea corresponde a una única conversación donde las expresiones están separadas por TAB. Las palabras temáticas aparecen después del último enunciado separadas también por un TAB.
Tenga en cuenta que los archivos de 3 turnos/4 turnos/5 turnos contienen contenido similar aunque con diferente número de expresiones por línea. Todos ellos se extraen de la misma fuente. Si encontró algún error o alguna expresión inapropiada en los datos, informe sus inquietudes aquí.
En los archivos de configuración del modelo (es decir, los archivos YAML en conf), los tipos de incrustación pueden ser cualquiera de los siguientes: glove840B
, fastText
, word2vec
y hub_word2vec
. Para manejar los vectores de incrustación previamente entrenados, aprovechamos Pymagnitude y Tensorflow-Hub. Tenga en cuenta que también puede utilizar random300
(300 se refiere a la dimensión de los vectores integrados y puede reemplazarse por cualquier valor arbitrario) para aprender vectores durante el entrenamiento de los modelos de generación de respuesta. Las configuraciones relacionadas con la incrustación de modelos se proporcionan en word_embeddings.yml.
La configuración de entrenamiento debe definirse en un archivo YAML similar a Tensorflow NMT. Aquí se proporcionan configuraciones de muestra para THRED y otras líneas base.
Los modelos implementados son Seq2Seq, HRED, Topic Aware-Seq2Seq y THRED.
Tenga en cuenta que, si bien la mayoría de los parámetros son comunes entre los diferentes modelos, algunos modelos pueden tener parámetros adicionales (por ejemplo, los modelos temáticos tienen parámetros topic_words_per_utterance
y boost_topic_gen_prob
).
Para entrenar un modelo, ejecute el siguiente comando:
python main.py --mode train --config < YAML_FILE >
--train_data < TRAIN_DATA > --dev_data < DEV_DATA > --test_data < TEST_DATA >
--model_dir < MODEL_DIR >
En <MODEL_DIR>
, se almacenan archivos de vocabulario y archivos de modelo de Tensorflow. El entrenamiento se puede retomar ejecutando:
python main.py --mode train --model_dir < MODEL_DIR >
Con el siguiente comando, el modelo se puede probar con el conjunto de datos de prueba.
python main.py --mode test --model_dir < MODEL_DIR > --test_data < TEST_DATA >
Es posible anular los parámetros de prueba durante la prueba. Estos parámetros son: ancho de viga --beam_width
, peso de penalización de longitud --length_penalty_weight
y temperatura de muestreo --sampling_temperature
.
Se implementa una interfaz de línea de comando simple que le permite conversar con el modelo aprendido (de manera similar al modo de prueba, los parámetros de prueba también se pueden anular):
python main.py --mode interactive --model_dir < MODEL_DIR >
En el modo interactivo, se requiere un modelo LDA previamente entrenado para introducir las palabras del tema inferidas en el modelo. Entrenamos un modelo LDA usando Gensim en un corpus de Reddit, recopilado para este propósito. Se puede descargar desde aquí. El archivo descargado debe descomprimirse y pasarse al programa a través de --lda_model_dir <DIR>
.
Cite el siguiente artículo si utilizó nuestro trabajo en su investigación:
@article{dziri2018augmenting,
title={Augmenting Neural Response Generation with Context-Aware Topical Attention},
author={Dziri, Nouha and Kamalloo, Ehsan and Mathewson, Kory W and Zaiane, Osmar R},
journal={arXiv preprint arXiv:1811.01063},
year={2018}
}