开源项目KgCLUE中包含2千万的三元组数据,还有一份2.2万的知识问答数据集。有效的利用2.2万问答数据集可以生成两千万精准的知识问答数据集。
KBQA(Knowledge Base Question Answering),即给定自然语言问题,通过对问题进行语义理解和解析,进而利用知识库进行查询、推理得出答案。
KBQA利可以用图谱丰富的语义关联信息,能够深入理解用户问题并给出答案,近年来吸引了学术界和工业界的广泛关注。KBQA主要任务是将自然语言问题(NLQ)通过不同方法映射到结构化的查询,并在知识图谱中获取答案。
KgCLUE:中文KBQA测评基准,基于CLUE的积累和经验,并结合KBQA的特点和近期的发展趋势,精心设计了该测评,希望可以促进中文领域上KBQA领域更多的研究、应用和发展。
问答数据集为json格式,每行为一条问答对。问题是one-hop问题,即答案为知识库中的一条三元组。数据格式如下,其中id为问答对索引,quetion为问题,answer为答案,来自知识库,以’ ||| '分割。
import os
import json
import random
from tqdm import tqdm
def load_json(path):
datas=[]
with open(path,encoding="utf-8") as f:
line=f.readline()
while line:
data=json.loads(line)
datas.append(data)
line=f.readline()
return datas
data_train=load_json("train.json")
data_test=load_json("test_public.json")
data_dev=load_json("dev.json")
relation2question={}
def extract(data):
for item in tqdm(data):
s,p,o=item["answer"].split("|||")
s,p,o= s.replace("\u200b",""),p.replace("\u200b",""),o.replace("\u200b","")
s=s.split("(")[0].split("(")[0].strip()
q=item["question"].strip()
if q.find(s)!=-1:
relation2question.setdefault(p.strip(),set()).add(q.replace(s,"{}").strip())
extract(data_train)
extract(data_test)
extract(data_dev)
datas=sp.read_data("Knowledge_1215133704.txt")
wiki_qa=[]
for item in tqdm(datas):
s,p,o=item.strip("\n").split("\t")
s=s.split("(")[0].split("(")[0]
q=relation2question.get(p)
if q:
if len(q)>1:q=random.choice(list(q))
else:q=list(q)[0]
q=q.format(*(s,)*q.count("{}"))
q,o= q.replace("\u200b",""),o.replace("\u200b","")
wiki_qa.append({"question":q,"answer":o})
# pip install nlpcda
from nlpcda import Similarword,RandomDeleteChar,CharPositionExchange,EquivalentChar
sw = Similarword(create_num=1, change_rate=0.3)
rd = RandomDeleteChar(create_num=1, change_rate=0.3)
cpe = CharPositionExchange(create_num=1, change_rate=0.3,char_gram=3,seed=1)
ec = EquivalentChar(create_num=1, change_rate=0.3)
def augment(text):
obj=random.choice([sw,rd,cpe,ec])
return obj.replace(text)[0]
第三步的代码就变成了:
datas=sp.read_data("Knowledge_1215133704.txt")
wiki_qa=[]
for item in tqdm(datas):
s,p,o=item.strip("\n").split("\t")
s=s.split("(")[0].split("(")[0]
q=relation2question.get(p)
if q:
if len(q)>1:q=random.choice(list(q))
else:q=list(q)[0]
q=augment(q) #增加此行代码
q=q.format(*(s,)*q.count("{}"))
q,o= q.replace("\u200b",""),o.replace("\u200b","")
wiki_qa.append({"question":q,"answer":o})
知识库百度云:提取码:nhsb(下载后,请将其放入knowledge文件夹中。)
知识库谷歌云:(下载后,请将其放入knowledge文件夹中。)
公众号文章
一键中文数据增强包 ;NLP数据增强、bert数据增强、EDA:pip install nlpcda (github.com)
github项目地址:CLUEbenchmark/KgCLUE
demo 网页