/ccks-2020

CCKS 2020:新冠知识图谱构建与问答评测(四)新冠知识图谱问答评测

Primary LanguagePython

CCKS-2020

0. 代码结构

  • 主要有三大模块:
    1. dataset模块:数据预处理等与数据相关的
      1. config.py 所有文件路径写这里,方便查找
    2. models模块:各种深度学习模型
    3. qa模块:将训练好的模型和策略组合应用,完成问答

代码运行必须从几个接口模块开始;小脚本测试,可模仿接口模块,新写一个接口模块,在其中导入函数运行

├── dao //数据库接口,准备做辅助缓存
├── dataset //数据相关
│ ├── data_prepare.py //train数据预处理,将给定训练数据做各种处理,构造字典等
│ └── kb_data_prepare.py //图谱数据预处理,将给定图谱做各种转换,构造字典等
├── layers //损失函数等
├── models //模型
│ ├── entity_score // 对识别出的主实体打分模型
│ │ └── model.py // 模型定义
│ ├── ner //主实体识别模型
│ │ └── model.py // 模型定义
│ ├── relation_score //对实体关联的关系打分的模型
│ │ ├── model.py // 模型定义
│ │ ├── predictor.py // 模型封装用作后续预测
│ │ └── trainer.py // 模型训练
│ ├── base_trainer.py //训练模块;模型初始化到训练
│ ├── data_helper.py //train数据处理成合适的格式,feed给模型
│ └── evaluation_matrics.py // 指标计算
├── qa //问答模块
│ ├── algorithms.py // 后处理算法
│ ├── cache.py // 大文件,在单例模式缓存;避免多次载入内存;ent2id等放在这里,提供给其他模块公共使用
│ ├── el.py //entity link,实体链接(主实体识别模块)
│ ├── entity_score.py // 对识别出的主实体打分模型
│ ├── lac_tools.py // 分词模块自定义优化等
│ ├── neo4j_graph.py //图数据库查询缓存等
│ ├── qa.py //问答接口,将其他模块组装到这里完成问答
│ └── relation_extractor.py //实体关联关系识别
├── utils //通用工具
├── docs //文档
├── examples //临时任务,模块试验等,单个脚本
├── tests //测试
├── config.py //所有数据路径和少量全局配置
├── data.py //所有数据处理的入口文件
├── evaluate.py //模块评测入口文件
├── manage.py //所有模型训练的入口文件
├── qa.py //问答入口文件
├── README.md //说明文档
└── requirements.txt //依赖包

1. 图数据库

  • 知识库管理系统
  • SPARQL
    • 国际化资源标识符(Internationalized Resource Identifiers,简称IRI),与其相提并论的是URI(Uniform Resource Identifier,统一资源标志符)。
      使用来表示一个IRI
    • Literal用于表示三元组中客体(Object),表示非IRI的数据,例如字符串(String),数字(xsd:integer),日期(xsd:date)等。 普通字符串等 "chat"
    • RDF查询语言SPARQL - SimmerChan的文章 - 知乎

neo4j数据库

2. 历年方案

  • CCKS 2019 | 开放域中文KBQA系统 - 最AI的小PAI的文章 - 知乎

    1. 首先在句子中找到主题实体。在这里,我们使用了比赛组织者提供的Entity-mention文件和一些外部工具,例如paddle-paddle。 2. 然后在关系识别模块中,通过提取知识图中的主题实体的子图来找到问题(也称为谓词)的关系。通过相似性评分模型获得所有关系的排名。
    2. 最后,在答案选择模块中,根据简单复杂问题分类器和一些规则,得出最终答案。
  • 百度智珠夺冠:在知识图谱领域百度持续领先

    1. 实体链接组件把问题中提及的实体链接到了知识库,并识别问题的核心实体。为了提高链接的精度,链接组件综合考虑了实体的子图与问题的匹配度、实体的流行度、指称正确度等多种特征,最后利用 LambdaRank 算法对实体进行排序,得到得分最高的实体。
    2. 子图排序组件目标是从多种角度计算问题与各个子图的匹配度,最后综合多个匹配度的得分,得到出得分最高的答案子图。
    3. 针对千万级的图谱,百度智珠团队采用了自主研发的策略来进行子图生成时的剪枝,综合考虑了召回率、精确率和时间代价等因素,从而提高子图排序的效率和效果。 针对开放领域的子图匹配,采用字面匹配函数计算符号化的语义相似,应用 word2vec 框架计算浅层的语义匹配,最后应用 BERT 算法做深度语义对齐。 除此之外,方案还针对具体的特征类型的问题进行一系列的意图判断,进一步提升模型在真实的问答场景中的效果和精度,更好地控制返回的答案类型,更符合真实的问答产品的需要。
  • http://nlpprogress.com/

3. 数据分析及预处理

以下提到所有路径都是/home/wangshengguang/下的相对路径

3.1 原始数据

原始数据存放在data/roaw_data 目录下

  1. 问答数据 data/raw_data/ccks_2020_7_4_Data下
    1. 有标注训练集15999:data/raw_data/ccks_2020_7_4_Data/task1-4_train_2020.txt
    2. 无标注验证集(做提交)1529:data/raw_data/ccks_2020_7_4_Data/task1-4_valid_2020.questions
  2. 图谱数据 data/raw_data/PKUBASE下
    1. 所有三元组66499745:data/raw_data/PKUBASE/pkubase-complete.txt

3.2 数据分析

 三元组中实体分两类:<实体>和"属性"; 

3.3 预处理tips:

三元组中数据分两类,<实体>和"属性"; 
预处理时将属性的双引号去掉(包括构建的字典和导入neo4j的数据全部双引号都被去掉了,主要考虑双引号作为json的key不方便保存),方便使用;
kb_data_prepare.py->iter_triples
在最后提交时需要恢复 

4. 目前方案

1. 先做NER识别 主实体
2. 查找实体的关系,做分类,挑选出top 路径
3. 生成sparql查询结果

4.1 主实体识别模块

EL

4.2 关系打分模块

RelationExtractor

4.3 后处理模块

Algorithms

Others

执行顺序

1. 数据准备 data.py + neo4j 数据库安装及数据导入
2. 模型训练 manage.py
3. 组合以上模型得到问答结果 qa.py