Ce dépôt fournit le code source et les données de notre article: QA-GNN: Raisonnement avec des modèles de langage et des graphiques de connaissances pour la réponse aux questions (NAACL 2021).
@InProceedings { yasunaga2021qagnn ,
author = { Michihiro Yasunaga and Hongyu Ren and Antoine Bosselut and Percy Liang and Jure Leskovec } ,
title = { QA-GNN: Reasoning with Language Models and Knowledge Graphs for Question Answering } ,
year = { 2021 } ,
booktitle = { North American Chapter of the Association for Computational Linguistics (NAACL) } ,
}Page Web: https://snap.stanford.edu/qagnn


Exécutez les commandes suivantes pour créer un environnement conda (en supposant CUDA10.1):
conda create -n qagnn python=3.7
source activate qagnn
pip install torch==1.8.0+cu101 -f https://download.pytorch.org/whl/torch_stable.html
pip install transformers==3.4.0
pip install nltk spacy==2.1.6
python -m spacy download en
# for torch-geometric
pip install torch-scatter==2.0.7 -f https://pytorch-geometric.com/whl/torch-1.8.0+cu101.html
pip install torch-sparse==0.6.9 -f https://pytorch-geometric.com/whl/torch-1.8.0+cu101.html
pip install torch-geometric==1.7.0 -f https://pytorch-geometric.com/whl/torch-1.8.0+cu101.htmlNous utilisons la question des ensembles de données répondant ( CommansenseQA , OpenBookQA ) et le graphique de connaissance conceptnet. Téléchargez toutes les données brutes par
./download_raw_data.sh
Prétraitez les données brutes en exécutant
python preprocess.py -p <num_processes>
Le script sera:
data/csqa/statement/ )TL; DR (sautez les étapes au-dessus et obtenez simplement des données prétraitées) . Le prétraitement peut prendre longtemps. Pour votre commodité, vous pouvez télécharger toutes les données traitées par
./download_preprocessed_data.sh
? NOUVELLES (Ajouter Medqa-Usmle) . Outre les ensembles de données QA de Communsense ( CommonSenseQA , OpenBookQA ) avec le graphique de connaissance conceptnet, nous avons ajouté un ensemble de données AQ biomédical ( MedQA-Usmle ) avec un graphique de connaissances biomédical basé sur la base de données et la banque de médicaments. Vous pouvez télécharger toutes les données pour cela à partir de [ici] . Décompressez-le et placez les dossiers medqa_usmle et ddb à l'intérieur du répertoire data/ . Bien que ces données soient déjà prétraitées, nous fournissons également les scripts de prétraitement que nous avons utilisés dans utils_biomed/ .
La structure de fichiers résultante ressemblera à:
.
├── README.md
├── data/
├── cpnet/ (prerocessed ConceptNet)
├── csqa/
├── train_rand_split.jsonl
├── dev_rand_split.jsonl
├── test_rand_split_no_answers.jsonl
├── statement/ (converted statements)
├── grounded/ (grounded entities)
├── graphs/ (extracted subgraphs)
├── ...
├── obqa/
├── medqa_usmle/
└── ddb/
Pour CommunsensQa, courez
./run_qagnn__csqa.sh
Pour openbookqa, exécutez
./run_qagnn__obqa.sh
Pour medqa-usmle, courez
./run_qagnn__medqa_usmle.sh
Comme configuré dans ces scripts, le modèle a besoin de deux types de fichiers d'entrée
--{train,dev,test}_statements : Instructions de question prétraitées au format JSONL. Ceci est principalement chargé par la fonction load_input_tensors dans utils/data_utils.py .--{train,dev,test}_adj : Informations du sous-graphe KG extraites pour chaque question. Ceci est principalement chargé par la fonction load_sparse_adj_data_with_contextnode dans utils/data_utils.py . Remarque : Nous constatons que la formation pour OpenBookQA est instable (par exemple, la meilleure précision de développement varie lors de l'utilisation de différentes graines, différentes versions des transformateurs / bibliothèques géométriques de torche, etc.), probablement parce que l'ensemble de données est petit. Nous suggérons d'essayer différentes graines. Une autre façon potentielle de stabiliser la formation consiste à initialiser le modèle avec l'un des points de contrôle réussis fournis ci-dessous, par exemple en ajoutant un argument --load_model_path obqa_model.pt .
Pour CommunsensQa, courez
./eval_qagnn__csqa.sh
De même, pour d'autres ensembles de données (OpenBookQA, Medqa-Usmle), exécutez ./eval_qagnn__obqa.sh et ./eval_qagnn__medqa_usmle.sh . Vous pouvez télécharger des points de contrôle des modèles formés dans la section suivante.
Communsenseqa
| Modèle formé | Dev House en interne acc. | Test interne ACC. |
|---|---|---|
| Roberta-Large + QA-GNN [lien] | 0,7707 | 0,7405 |
Openbookqa
| Modèle formé | Dev Acc. | Test acc. |
|---|---|---|
| Roberta-Large + QA-GNN [lien] | 0,6960 | 0,6900 |
MEDQA-USMLE
| Modèle formé | Dev Acc. | Test acc. |
|---|---|---|
| Sapbert-Base + QA-GNN [lien] | 0,3789 | 0,3810 |
Remarque : Les modèles ont été formés et testés avec des transformateurs HuggingFace == 3.4.0.
{train,dev,test}.statement.jsonl au format .jsonl (voir data/csqa/statement/train.statement.jsonl )data/{yourdataset}/ pour stocker les fichiers .jsonlpreprocess.py et effectuez l'extraction des sous-graphiques pour vos donnéesutils/parser_utils.py pour prendre en charge votre propre ensemble de données Ce repo est construit sur les travaux suivants:
Scalable Multi-Hop Relational Reasoning for Knowledge-Aware Question Answering. Yanlin Feng*, Xinyue Chen*, Bill Yuchen Lin, Peifeng Wang, Jun Yan and Xiang Ren. EMNLP 2020.
https://github.com/INK-USC/MHGRN
Un grand merci aux auteurs et aux développeurs!