Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/CLUEbenchmark/KgCLUE
KgCLUE: 大规模中文开源知识图谱问答
https://github.com/CLUEbenchmark/KgCLUE
kbqa knowledge-graph ner qa similarity-search
Last synced: about 1 month ago
JSON representation
KgCLUE: 大规模中文开源知识图谱问答
- Host: GitHub
- URL: https://github.com/CLUEbenchmark/KgCLUE
- Owner: CLUEbenchmark
- Created: 2021-10-13T02:14:03.000Z (about 3 years ago)
- Default Branch: main
- Last Pushed: 2022-07-05T05:20:36.000Z (over 2 years ago)
- Last Synced: 2024-11-09T05:09:33.481Z (about 1 month ago)
- Topics: kbqa, knowledge-graph, ner, qa, similarity-search
- Language: Python
- Homepage: https://www.CLUEbenchmarks.com
- Size: 34.8 MB
- Stars: 428
- Watchers: 5
- Forks: 60
- Open Issues: 10
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
- StarryDivineSky - CLUEbenchmark/KgCLUE
README
# KgCLUE
KgCLUE: 大规模中文开源知识图谱问答
在线DEMO点击此处体验
预约演示:数据集自动标注工具--释放AI潜力!
## 内容导引
| 章节 | 描述 |
|-|-|
| [简介](#简介) | 介绍背景 |
| [任务描述](#任务描述) | 介绍任务的基本信息 |
| [数据集介绍](#数据集介绍) | 介绍数据集及示例 |
| [实现思路](#实现思路) | 介绍实现的具体思路 |
| [实验结果](#实验结果) | 针对各种不同方法,在KgCLUE上的实验对比 |
| [实验分析](#实验分析) | 对模型能力进行分析 |
| [KgCLUE有什么特点](#KgCLUE有什么特点) | 特点介绍 |
| [基线模型及运行](#基线模型及运行) | 支持多种基线模型 |
| [相关阅读](#相关阅读) | 新方案及其解读 |
| [排行榜及提交](#排行榜及提交) | 排行榜及提交样例 |
| [贡献与参与](#贡献与参与) | 如何参与项目或反馈问题|
## 简介
KBQA(Knowledge Base Question Answering),即给定自然语言问题,通过对问题进行语义理解和解析,进而利用知识库进行查询、推理得出答案。
KBQA利可以用图谱丰富的语义关联信息,能够深入理解用户问题并给出答案,近年来吸引了学术界和工业界的广泛关注。KBQA主要任务是将自然语言问题(NLQ)通过不同方法映射到结构化的查询,并在知识图谱中获取答案。
KgCLUE:中文KBQA测评基准,基于CLUE的积累和经验,并结合KBQA的特点和近期的发展趋势,精心设计了该测评,希望可以促进中文领域上KBQA领域更多的研究、应用和发展。### UPDATE:
******* 2021-12-18:添加完整基线模型(baselines/ner_sim),包括预训练脚本及训练好的模型的下载地址
******* 2021-11-27:添加支持KgCLUE的Roberta-wwm-ext的baseline******* 2021-11-15:添加支持KgCLUE的Roberta-wwm-large的baseline
******* 2021-11-03: 添加支持KgCLUE的Bert的baseline
******* 2021-11-02: 添加了知识库和问答数据集。
## 任务描述
KBQA任务即为给定一份知识库和一份问答数据集,从问答数据集中学习问题语义然后从知识库中查询答案。本测评提供了一份中文百科知识库和一份问答数据集。
## 数据集介绍
### 知识库介绍
知识库可通过百度云,提取码:nhsb,或着Google云下载。
下载后,请将其放入knowledge文件夹中。
### 知识库(三元组)统计信息
| 实体数量 | 关系数量 | 高频关系(>100) |三元组数量|
| :----:| :----: |:----: |:----: |
| 3121457 | 245838 | 3833 | 20559652 |知识库来源于百科类数据,由百科类搜索页面的事实性三元组构成。
### 知识库描述
知识库中数据存储格式如上,每一行是一个三元组,格式为<头实体,关系,尾实体>,每列之间以'\t'分隔,
其中头实体后的括号项为该实体的消歧项。### 问答数据集统计信息
| Corpus | Train | Dev |Test Public| Test Private |
| :----:| :----: |:----: |:----: |:----: |
| Num Samples | 18k | 2k | 2k | 3k |
| Num Relations | 2164 | 1258 | 1260 | 423 |问答数据集为one-hop数据,总共包含25000条问答对。
数据集分为4份:1份训练集(Train);1份验证集(Dev);1份公开测试集(Test Public),用于测试;1份私有测试集(Test Private),用于提交,不公开。### 问答数据集描述
问答数据集为json格式,每行为一条问答对。问题是one-hop问题,即答案为知识库中的一条三元组。数据格式如下,其中id为问答对索引,quetion为问题,answer为答案,来自知识库,以' ||| '分割。
## 实验结果
实验设置:训练集和验证集使用训练集与验证集,测试集使用公开测试集。
## 实现思路
下面简单介绍该任务的baseline的构建思路,但并不对任务数据进行详细介绍,如对任务数据不明白,请返回[数据集介绍](#数据集介绍)部分以下图片仅为思路参考,总体思路:
1.利用NER模型进行实体识别(S);
2.根据识别到的实体,通过es接口找到可能的候选关系的列表;
3.训练相似度模型进行关系预测:输入为问句和候选关系,找到最可能的关系(P);
4.最后根据实体(S)、关系(P)定位到答案(O,即尾实体)#### NER阶段
做NER任务,如图所示用于识别出问题中的实体。
#### SIM阶段
我们使用句子分类任务(二分类),把问题和关系(属性)拼接到一起,用于判断问题要问的是不是这个属性。
## 基线模型及运行
### 环境依赖
1)NER模型:
python3.6+
1.1.0 =< pytorch < 1.5.0, or 1.7.1
2)SIM模型
python3.6+
tensorflow 1.14+
bert4keras, 0.10.8
### 如何运行
进入到ner_re的目录(cd baselines/ner_re);
然后顺序执行以下命令:1)训练NER模型;2)训练相似度模型;3)生成预测文件并提交。
#### 1.NER模型(pytorch)
##### 1.0 下载预训练模型
下载并将预训练模型(chinese_rbt3_pytorch)放入到prev_trained_model目录。
pytorch版用于NER,tensorflow版用于相似度模型。##### 1.1 训练NER模型
bash scripts/run_ner_softmax.sh
其中,处理成NER训练数据的主要代码:processors/utils_ner.py的DataProcessor(65-96行)
已经训练好的NER模型下载
##### 1.2 对测试集(test.json)进行预测,生成NER结果bash scripts/run_ner_softmax.sh predict
预测结果在这里:./outputs/kg_output/bert/test_prediction.json
生成的示例如:
{"id": 0, "tag_seq": "O O O O B-NER I-NER I-NER O O O O O O", "entities": [["NER", 4, 6]]}
{"id": 1, "tag_seq": "O O B-NER I-NER I-NER O O O O O O O O", "entities": [["NER", 2, 4]]}
{"id": 2, "tag_seq": "O O B-NER I-NER I-NER I-NER I-NER I-NER I-NER O O O O O O O O", "entities": [["NER", 2, 8]]}
#### 2.SIM(相似度)模型
##### 2.1 生成相似度训练数据python3 -u sim/process_sim_data.py
其中,生成的相似度训练数据所在的目录为:./processed_data
已经训练好的相似度(SIM)模型下载##### 2.2 训练SIM模型
python3 -u sim/train.py
其中,相似度模型所在的位置:./outputs/kg_sim_output
##### 测试单个输入的相似度(可选)python3 -u sim/predict.py
#### 3. 生成预测文件并提交python3 -u submit/generate_submit_file.py
生成的文件为:./kgclue_predict_rbt3.json使用如下命令压缩文件:zip -r kgclue_predict_rbt3.zip kgclue_predict_rbt3.json
提交预测文件到测评系统,并查看:榜单效果基线模型详细介绍见:./baselines/ner_re/README.md
### 相关阅读
《Seq2Seq+前缀树:检索任务新范式(以KgCLUE为例)》,苏剑林
本文介绍了检索模型的一种新方案——“Seq2Seq+前缀树”,并以KgCLUE为例给出了一个具体的baseline。
“Seq2Seq+前缀树”的方案有着训练简单、空间占用少等优点,也有一些不足之处,总的来说算得上是一种简明的有竞争力的方案。
>我们还提供了另一个代码库可以更简单方便的复现我们的效果https://github.com/CLUEbenchmark/KgCLUEbench## 效果评估脚本
Score=EM_O * 0.50 + F1_O * 0.50## 实验分析
### 1.测评结果 Benchmark Results
#### 1.1 模型评测指标
我们采用业界常用的F1-score 以及完全匹配(Exact Match下简称EM)来作为模型的评测指标
F1-score:F1-score是分类问题的常用指标,广泛用于 QA。 当我们同样关心精度和召回率时用F1就十分合适。 在这种情况下,它是针对预测中的单个单词与真实答案中的单词进行计算的。 预测和真值之间的共享词数是F1分数的基础:精度是预测中共享词的数量与总词数的比值,召回率是共享词数的比值 到基本事实中的单词总数。
完全匹配(Exact Match):对于每个问题+答案对,如果模型预测的答案的字符与正确答案(之一)的字符完全匹配,则 EM = 1,否则 EM = 0。这是一个严格的有或无的指标; 如有单字错误仍然得分为 0。在针对负面示例进行评估时,如果模型预测了任何文本,它会自动为该示例得分为 0。
#### 1.2 模型表现分析 Analysis of Model Performance
baseline都使用预训练模型直接做下游任务微调 bert-base-chinese,chinese-roberta-wwm-ext-large以及chinese-roberta-wwm-ext
我们发现:
1)参照过往工作,三个个模型的F1和EM分数都属于中等水平 说明对于中文KBQA领域,模型还有很大的发展空间
2)模型的效果会对下游任务分数有所提升
3)在NER和similarity的阶段的效果影响结果较大,参考过往工作,我们的baseline模型两阶段分数处于中下等水平,还是有很大的发展空间
4)我们曾使用过不同难度的数据训练以及测试模型,发现数据处理对分数的影响较大,或许可以设法通过难样本挖掘构建难样本进行更有效训练
## KgCLUE有什么特点
1、KBQA利用的是结构化的知识,其数据来源决定了适合回答what,when 等事实性问题。2、KBQA的研究,根据目标问题的性质,可以分为几个方向。第一个是单跳问题 (one hop) ,第二个是多跳问题 (multi hop)。单跳问题是指可以通过知识库中某一条事实三元组来回答,而多跳问题是指需要知识库中的多条事实三元组来回答。KgCLUE第一版(即KgCLUE1.0)针对的是单跳问题构建的数据集。
3、测评的主要目标是KBQA,根据KBQA任务的特点,可以考察近年来的实体识别、关系分类以及实体链接等子任务的发展。
此外,我们提供KBQA测评完善的基础设施。
从任务设定,广泛的数据集,多个有代表性的基线模型及效果对比,一键运行脚本,到测评系统等完整的基础设施。## 排行榜及提交
#### 提交说明
训练端到端或非端到端模型,在非公开测试集上test.json进行预测,
生成kgclue_predict.json并压缩,得到kgclue_predict.zip;然后提交到CLUE测评系统## 问题 Question
1. 问:测试系统,什么时候开发?
答:测评系统在2021年12月1日后开放。
2. 问:SIM训练的数据集标注怎么搞?
答:问题原样本属性为正,再随机从样本中其他属性抽5个设为负(你也可以设法通过难样本挖掘构建难样本进行更有效训练)。
3. 问:什么是属性?
答:三元组中间那列数据,如图所示
## 贡献与参与
1.问:我有符合代码规范的模型代码,并经过测试,可以贡献到这个项目吗?
答:可以的。你可以提交一个pull request,并写上说明。我们会设法在24小时内反馈。
2.问:我正在研究KBQA学习,具有较强的模型研究能力,怎么参与到此项目?
答:发送邮件到 [email protected],标题为:参与KgCLUE课题,并介绍一下你的研究。
3.如何交流?
提交你的issue;加QQ群(群号:836811304);或加入微信群