Um sistema de resposta a perguntas de domínio fechado de ponta a ponta. Construído sobre a biblioteca de Transformers Huggingface.
⛔ [não mantido] Este repositório não é mais mantido, mas está sendo mantido por perto para fins educacionais. Se você deseja uma alternativa mantida ao CDQA, confira: https://github.com/deepset-ai/haystack
Se você estiver interessado em entender como o sistema funciona e sua implementação, escrevemos um artigo no Medium com uma explicação de alto nível.
Também fizemos uma apresentação durante o café da manhã nº 9 do NLP organizado pela Feedly. Você pode conferir aqui.
pip install cdqagit clone https://github.com/cdqa-suite/cdQA.git
cd cdQA
pip install -e .Experimentos foram feitos com:
t2.medium Deep Learning Ami (Ubuntu) Versão 22.0p3.2xlarge Deep Learning AMI (Ubuntu) Versão 22.0 + Um único Tesla V100 16GB. Para usar cdQA , você precisa criar um quadro de dados de pandas com as seguintes colunas:
| título | parágrafos |
|---|---|
| O título do artigo | [Parágrafo 1 do artigo, ..., parágrafo n do artigo] |
O objetivo dos conversores cdqa é facilitar a criação desse quadro de dados a partir do seu banco de dados RAW Documents. Por exemplo, o pdf_converter pode criar um DataFrame cdqa a partir de um diretório contendo arquivos .pdf :
from cdqa . utils . converters import pdf_converter
df = pdf_converter ( directory_path = 'path_to_pdf_folder' )Você precisará instalar o Java OpenJDK para usar este conversor. Atualmente temos conversores para:
Planejamos melhorar e adicionar mais conversores no futuro. Fique atento!
Você pode baixar os modelos e dados manualmente nos lançamentos do GitHub ou usar nossas funções de download:
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 )Ajuste o oleoduto em seu corpus usando o leitor pré-treinado:
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 )Se você deseja ajustar o leitor em seu conjunto de dados anotados do tipo Esquadrão Custom:
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' )Salve o modelo do leitor após o ajuste fino:
cdqa_pipeline . dump_reader ( 'path-to-save-bert-reader.joblib' )Para obter a melhor previsão, dada uma consulta de entrada:
cdqa_pipeline . predict ( query = 'your question' )Para obter as n melhores previsões:
cdqa_pipeline . predict ( query = 'your question' , n_predictions = N )Existe também a possibilidade de alterar o peso da pontuação do Retriever em comparação com a pontuação do leitor no cálculo da pontuação final da classificação (o padrão é 0,35, o que se mostra o melhor peso no conjunto de desenvolvimento do esquadrão 1.1-aberto)
cdqa_pipeline . predict ( query = 'your question' , retriever_score_weight = 0.35 )Para avaliar os modelos no seu conjunto de dados personalizado, você precisará anotá -lo. O processo de anotação pode ser feito em 3 etapas:
Converta o quadro de dados do Pandas em um arquivo JSON com formato de esquadrão:
from cdqa . utils . converters import df2squad
json_data = df2squad ( df = df , squad_version = 'v1.1' , output_dir = '.' , filename = 'dataset-name' )Use um annotador para adicionar pares de perguntas de verdade do solo:
Consulte o nosso cdQA-annotator , um annotador baseado na Web para obter perguntas sobre o domínio fechado, respondendo a conjuntos de dados com formato de esquadrão.
Avalie o objeto de pipeline:
from cdqa . utils . evaluation import evaluate_pipeline
evaluate_pipeline ( cdqa_pipeline , 'path-to-annotated-dataset.json' )Avalie o leitor:
from cdqa . utils . evaluation import evaluate_reader
evaluate_reader ( cdqa_pipeline , 'path-to-annotated-dataset.json' )Preparamos alguns exemplos de notebooks no diretório exemplos.
Você também pode jogar diretamente com esses exemplos de notebooks usando o Binder ou o Google Colaboratory:
| Caderno | Hardware | Plataforma |
|---|---|---|
| [1] Primeiros passos com cDQA | CPU ou GPU | |
| [2] Usando o conversor PDF | CPU ou GPU | |
| [3] Treinando o leitor no esquadrão | GPU |
O Binder e o Google Colaboratory fornecem ambientes temporários e podem demorar para iniciar, mas recomendamos que você queira começar com cdQA facilmente.
Você pode implantar uma API REST cdQA executando:
export dataset_path=path-to-dataset.csv
export reader_path=path-to-reader-model
FLASK_APP=api.py flask run -h 0.0.0.0Agora você pode fazer solicitações para testar sua API (aqui usando httpie):
http localhost:5000/api query== ' your question here ' Se você deseja servir uma interface de usuário na parte superior do seu sistema cdQA , siga as instruções do CDQA-UI, uma interface da Web desenvolvida para cdQA .
Leia nossas diretrizes contribuintes.
| Tipo | Título | Autor | Ano |
|---|---|---|---|
| ? Vídeo | Stanford CS224N: NLP com Palestra de Aprendizagem Deep 10 - Resposta de Perguntas | Christopher Manning | 2019 |
| ? Papel | Lendo a Wikipedia para responder a perguntas de domínio aberto | Danqi Chen, Adam Fisch, Jason Weston, Antoine Bordes | 2017 |
| ? Papel | Compreensão da leitura neural e além | Danqi Chen | 2018 |
| ? Papel | Bert: pré-treinamento de transformadores bidirecionais profundos para compreensão de idiomas | Jacob Devlin, Ming-Wei Chang, Kenton Lee, Kristina Toutanova | 2018 |
| ? Papel | Representações contextuais de palavras: uma introdução contextual | Noah A. Smith | 2019 |
| ? Papel | Perguntas para o domínio aberto de ponta a ponta Resposta com Bertserini | Wei Yang, Yuqing Xie, Aileen Lin, Xingyu Li, Luchen Tan, Kun Xiong, Ming Li, Jimmy Lin | 2019 |
| ? Papel | Aumentação de dados para o ajuste fino de Bert na resposta de perguntas de domínio aberto | Wei Yang, Yuqing Xie, Luchen Tan, Kun Xiong, Ming Li, Jimmy Lin | 2019 |
| ? Papel | Passagem novamente com Bert | Rodrigo Nogueira, Kyunghyun Cho | 2019 |
| ? Papel | MRQA: Leitura da máquina para resposta a perguntas | Jonathan Berant, Percy Liang, Luke Zettlemoyer | 2019 |
| ? Papel | Resposta de perguntas não supervisionadas por tradução de cloze | Patrick Lewis, Ludovic Denoyer, Sebastian Riedel | 2019 |
| Estrutura | Scikit-Learn: aprendizado de máquina em Python | Pedregosa et al. | 2011 |
| Estrutura | Pytorch | Adam Paszke, Sam Gross, Soumith Chintala, Gregory Chanan | 2016 |
| Estrutura | Transformadores: Processamento de linguagem natural de última geração para Tensorflow 2.0 e Pytorch. | Abraçando o rosto | 2018 |
Apache-2.0