中文知识问答数据集(KgCLUE 千万级精准 开源)

简介

开源项目KgCLUE中包含2千万的三元组数据,还有一份2.2万的知识问答数据集。有效的利用2.2万问答数据集可以生成两千万精准的知识问答数据集。

KBQA(Knowledge Base Question Answering),即给定自然语言问题,通过对问题进行语义理解和解析,进而利用知识库进行查询、推理得出答案。

KBQA利可以用图谱丰富的语义关联信息,能够深入理解用户问题并给出答案,近年来吸引了学术界和工业界的广泛关注。KBQA主要任务是将自然语言问题(NLQ)通过不同方法映射到结构化的查询,并在知识图谱中获取答案。

KgCLUE:中文KBQA测评基准,基于CLUE的积累和经验,并结合KBQA的特点和近期的发展趋势,精心设计了该测评,希望可以促进中文领域上KBQA领域更多的研究、应用和发展。

问答数据集描述

中文知识问答数据集(KgCLUE 千万级精准 开源)_第1张图片
问答数据集为json格式,每行为一条问答对。问题是one-hop问题,即答案为知识库中的一条三元组。数据格式如下,其中id为问答对索引,quetion为问题,answer为答案,来自知识库,以’ ||| '分割。

工具代码

1. 读取已有问答数据集

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")

2. 抽取问句模板

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)

3. 读取知识图谱数据组装问句

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})

4.数据增强工具

# 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 网页
中文知识问答数据集(KgCLUE 千万级精准 开源)_第2张图片

你可能感兴趣的:(知识图谱,NLP,开源,知识图谱,人工智能)