Un sistema de respuesta de preguntas de dominio cerrado de extremo a extremo. Construido sobre la Biblioteca de Transformers Huggingface.
⛔ [No mantenido] Este repositorio ya no se mantiene, sino que se mantiene con fines educativos. Si desea una alternativa mantenida a CDQA, consulte: https://github.com/deepset-ai/haystack
Si está interesado en comprender cómo funciona el sistema y su implementación, escribimos un artículo sobre medio con una explicación de alto nivel.
También hicimos una presentación durante el desayuno de la PNL #9 organizado por Feedly. Puedes verlo aquí.
pip install cdqagit clone https://github.com/cdqa-suite/cdQA.git
cd cdQA
pip install -e .Se han realizado experimentos con:
t2.medium Medium Deep Learning AMI (Ubuntu) Versión 22.0p3.2xlarge Deep Learning AMI (Ubuntu) Versión 22.0 + un solo Tesla V100 16GB. Para usar cdQA , necesita crear un Pandas DataFrame con las siguientes columnas:
| título | párrafos |
|---|---|
| El título del artículo | [Párrafo 1 del artículo, ..., párrafo n del artículo] |
El objetivo de los convertidores cdqa es facilitar la creación de este marco de datos a partir de su base de datos de documentos sin procesar. Por ejemplo, el pdf_converter puede crear un cdqa DataFrame a partir de un directorio que contiene archivos .pdf :
from cdqa . utils . converters import pdf_converter
df = pdf_converter ( directory_path = 'path_to_pdf_folder' )Deberá instalar Java OpenJDK para usar este convertidor. Actualmente tenemos convertidores para:
Planeamos mejorar y agregar más convertidores en el futuro. ¡Manténganse al tanto!
Puede descargar los modelos y datos manualmente desde las versiones de GitHub o usar nuestras funciones de descarga:
from cdqa . utils . download import download_squad , download_model , download_bnpp_data
directory = 'path-to-directory'
# Downloading data
download_squad ( dir = directory )
download_bnpp_data ( dir = directory )
# Downloading pre-trained BERT fine-tuned on SQuAD 1.1
download_model ( 'bert-squad_1.1' , dir = directory )
# Downloading pre-trained DistilBERT fine-tuned on SQuAD 1.1
download_model ( 'distilbert-squad_1.1' , dir = directory )Coloque la tubería en su corpus utilizando el lector pre-capacitado:
import pandas as pd
from ast import literal_eval
from cdqa . pipeline import QAPipeline
df = pd . read_csv ( 'your-custom-corpus-here.csv' , converters = { 'paragraphs' : literal_eval })
cdqa_pipeline = QAPipeline ( reader = 'bert_qa.joblib' ) # use 'distilbert_qa.joblib' for DistilBERT instead of BERT
cdqa_pipeline . fit_retriever ( df = df )Si desea ajustar al lector en su conjunto de datos anotado con forma de escuadrón personalizado:
cdqa_pipeline = QAPipeline ( reader = 'bert_qa.joblib' ) # use 'distilbert_qa.joblib' for DistilBERT instead of BERT
cdqa_pipeline . fit_reader ( 'path-to-custom-squad-like-dataset.json' )Guarde el modelo del lector después de ajustar:
cdqa_pipeline . dump_reader ( 'path-to-save-bert-reader.joblib' )Para obtener la mejor predicción dada una consulta de entrada:
cdqa_pipeline . predict ( query = 'your question' )Para obtener las N mejores predicciones:
cdqa_pipeline . predict ( query = 'your question' , n_predictions = N )También existe la posibilidad de cambiar el peso de la puntuación Retriever versus la puntuación del lector en el cálculo de la puntuación de clasificación final (el valor predeterminado es 0.35, que se muestra como el mejor peso en el conjunto de desarrollo del escuadrón 1.1-Open)
cdqa_pipeline . predict ( query = 'your question' , retriever_score_weight = 0.35 )Para evaluar los modelos en su conjunto de datos personalizado, deberá anotarlo. El proceso de anotación se puede realizar en 3 pasos:
Convierta su Pandas DataFrame en un archivo JSON con formato de escuadrón:
from cdqa . utils . converters import df2squad
json_data = df2squad ( df = df , squad_version = 'v1.1' , output_dir = '.' , filename = 'dataset-name' )Use un anotador para agregar pares de respuesta de la verdad de tierra:
Consulte nuestro cdQA-annotator , un anotador basado en la web para conjuntos de datos de respuesta a preguntas de dominio cerrado con formato de escuadrón.
Evaluar el objeto de la tubería:
from cdqa . utils . evaluation import evaluate_pipeline
evaluate_pipeline ( cdqa_pipeline , 'path-to-annotated-dataset.json' )Evaluar al lector:
from cdqa . utils . evaluation import evaluate_reader
evaluate_reader ( cdqa_pipeline , 'path-to-annotated-dataset.json' )Preparamos algunos ejemplos de cuaderno en el directorio de ejemplos.
También puede jugar directamente con estos ejemplos de cuaderno usando Binder o Google Colaboratory:
| Computadora portátil | Hardware | Plataforma |
|---|---|---|
| [1] Primeros pasos con CDQA | CPU o GPU | |
| [2] Usando el convertidor PDF | CPU o GPU | |
| [3] Entrenar al lector en el escuadrón | GPU |
Binder y Google Colaboratory proporcionan entornos temporales y pueden ser lentos para comenzar, pero los recomendamos si desea comenzar con cdQA fácilmente.
Puede implementar una API REST cdQA ejecutando:
export dataset_path=path-to-dataset.csv
export reader_path=path-to-reader-model
FLASK_APP=api.py flask run -h 0.0.0.0Ahora puede hacer solicitudes para probar su API (aquí usando httpie):
http localhost:5000/api query== ' your question here ' Si desea servir una interfaz de usuario además de su sistema cdQA , siga las instrucciones de CDQA-UI, una interfaz web desarrollada para cdQA .
Lea nuestras pautas contribuyentes.
| Tipo | Título | Autor | Año |
|---|---|---|---|
| ? Video | Stanford CS224N: NLP con conferencia de aprendizaje profundo 10 - Respuesta de preguntas | Christopher Manning | 2019 |
| ? Papel | Leer Wikipedia para responder preguntas de dominio abierto | Danqi Chen, Adam Fisch, Jason Weston, Antoine Bordes | 2017 |
| ? Papel | Comprensión de lectura neuronal y más allá | Chen danqi | 2018 |
| ? Papel | BERT: pretruamiento de transformadores bidireccionales profundos para la comprensión del lenguaje | Jacob Devlin, Ming-Wei Chang, Kenton Lee, Kristina Toutanova | 2018 |
| ? Papel | Representaciones de palabras contextuales: una introducción contextual | Noah A. Smith | 2019 |
| ? Papel | Pregunta de dominio abierto de extremo a extremo respondiendo con Bertserini | Wei Yang, Yuqing Xie, Aileen Lin, Xingyu Li, Luchen Tan, Kun Xiong, Ming Li, Jimmy Lin | 2019 |
| ? Papel | Aumento de datos para el ajuste de Bert en la respuesta a las preguntas de dominio abierto | Wei Yang, Yuqing Xie, Luchen Tan, Kun Xiong, Ming Li, Jimmy Lin | 2019 |
| ? Papel | Pasaje reanicando con Bert | Rodrigo Nogueira, Kyunghyun Cho | 2019 |
| ? Papel | MRQA: Lectura en máquina para responder preguntas | Jonathan Berant, Percy Liang, Luke Zettlemoyer | 2019 |
| ? Papel | Pregunta no supervisada Respondiendo por traducción de Cloze | Patrick Lewis, Ludovic Denoyer, Sebastian Riedel | 2019 |
| Estructura | Scikit-Learn: Aprendizaje automático en Python | Pedregosa et al. | 2011 |
| Estructura | Pytorch | Adam Paszke, Sam Gross, Soumith Chintala, Gregory Chanan | 2016 |
| Estructura | Transformadores: procesamiento del lenguaje natural de última generación para TensorFlow 2.0 y Pytorch. | Cara abrazada | 2018 |
Apache-2.0