构建《海贼王》知识图谱 - bettermorn/KGCourse GitHub Wiki
项目来源
参考API及依赖工具包
- 知识工厂提供的API: http://kw.fudan.edu.cn/apis/cndbpedia/
- DeepKE https://github.com/zjunlp/deepke
- D3JS https://d3js.org/
- REFO http://www.openkg.cn/tool/refo-kbqa
- Bert https://github.com/ymcui/Chinese-BERT-wwm 中文BERT-wwm
构建过程
包括数据采集、知识存储、知识抽取、知识计算、知识应用(知识问答和可视化)
1.数据采集
1.1 确定数据来源
- 从别的知识图谱中获取已经存在的知识信息:CN-DBpedia 3 是由复旦大学知识工场实验室研发并维护的大规模通用领域结构化百科,选择其作为通用知识图谱来源。
- 从相关网页中爬取解析半结构化的自然语言文本信息
1.2 抽取通用知识图谱中已有的目标域知识
1.2.1 构建《海贼王》实体词汇库
文件名
cndbpedia/parse_raw_moegirl_onepiece_entries.py
输入
cndbpedia/data/raw_moegirl_onepiece_entries.txt 原始的半结构化数据:https://zh.moegirl.org.cn/index.php?title=Template:%E6%B5%B7%E8%B4%BC%E7%8E%8B&action=edit
处理过程
用正则式解析
输出
cndbpedia/data/processed_moegirl_onepiece_entries.txt
1.2.2 获取实体列表
文件名
cndbpedia/get_onepiece_cndbpedia_entities.py
输入
词条名作为输入实体指称项名称
处理过程
利用知识工厂提供的API,将词条名作为输入实体指称项名称(mention name),获取返回对应实体(entity)的列表。
输出
输出的结果保存在 cndbpedia/data 文件夹 中。
- cndbpedia_onepiece_entities_list.txt :保存了所有识别出的CN-DBpedia中的实体名
- moelgirl_cndbpedia_entities_mapping.json :保存着从moegirl的的条目作为实体指称项名称
1.2.3 筛选实体列表
文件名
cndbpedia/filter_moelgirl_cndbpedia_entities_mapping_file.py mention name可能对应着知识图谱中的多个不同实体。
输入
moelgirl_cndbpedia_entities_mapping.json
处理过程
设置一些筛选条件,只有当实体名中包含关键词之一时,才认为是我们需要的实体
输出
- 在CN-DBpedia没有对应的实体名:moelgirl_cndbpedia_api_no_results_mention_name_list.txt
- 虽然有实体名,但所有对应实体名中都没有包含上面提到的关键词:filter_out_entities_mapping.json
- 对应符合条件的实体名:query_avpair_entities_list.txt
- 合法词条名和实体名对应的字典:query_avpair_entities_mapping.json
1.2.4 获取图谱中对应实体的三元组知识
文件名
cndbpedia/get_onepiece_cndbpedia_avpair.py
输入
query_avpair_entities_mapping.json
处理过程
调用API,获取图谱中对应实体的三元组知识
输出
- query_avpair_cndbpedia_onepiece_results.json:保存着每个实体对应的三元组知识的字 典,采用两级索引结构,第一级索引是mention name,第二级索引是实体名字
- query_avpair_keys_list_file.txt :保存在所有属性名称的列表
1.3 抽取网页中半结构化的知识
1.3.1 抽取
文件名
talktop/parse_processed_manual_talkop_vivre_card.py
输入
/data/processed_manual_talkop_vivre_card 目录下的文本文件
处理过程
- 从网页中获取原始文本信息
- 人工删除不相关的文本
- 以模板匹配的方式,自动抽取人物属性信息
- 人工校验:例如:查看是否抽取到了所有的实体、通过查看抽取的predicate结果来调整模板。整个过程中是代码自动抽取和人工校验构成闭环的过程,在闭环过程中不断补充模板信息,改善抽取结果 注:2、3、4不断循环,直至抽取到的知识满足要求。
输出
- 输出目录:talkop/data/processed_manual_talkop_vivre_card
- 每个网页对应着三个输出文件
- xxx-predicate_key_list.txt :所有解析得到的predicate
- xxx-entities_id_name_list.txt :所有解析得到的id和实体名
- xxx-entities_avpair.json :抽取到所有实体的属性知识,以json的格式保存
1.3.2 汇总结果
文件名
talkop/summary_talkop_vivre_card
输入
各个网页中人物实体的属性信息
- xxx-predicate_key_list.txt :所有解析得到的predicate
- xxx-entities_id_name_list.txt :所有解析得到的id和实体名
- xxx-entities_avpair.json :抽取到所有实体的属性知识,以json的格式保存
处理过程
汇总信息
输出
- 目录: talkop/data/processed_manual_talkop_vivre_card
- 文件:summary_predicate_set.txt :所有predicate的汇总
- 文件:summary_entities_id_name_list.txt :所有抽取得到的实体名以及对应ID的汇总
1.4 关系抽取
1.4.1 标注数据
- 标注数据来源:历史信息,记录着每个人物在故事中的时间线以及对应的故事。每个人的历史信息记录着其与其他实体之间交互的信息,可以利用它来构建垂直领域内的关系抽取数据集。
- 标注工具:精灵标注助手
- 构建方法:自底向上构建,在构建过程中逐步构建整个图谱的schema
- 数据标注格式:精灵标注助手提供导出json格式,其具体形式如下所示,其中 T 和 E 分别表示标注出的实体类型和实体信息
1.4.2 存储数据
- 被标注的原始数据:deepke-master/data/vivrecard/raw/fuseki_vivrecard_sentence_item.txt
- 原始标注结果: deepke-master/data/vivrecard/annot/outputs/fuseki_vivrecard_sentence_item.json
- 将标注数据转为符合deepke项目格式的数据:deepke-master/data/vivrecard/origin 方便后续关系抽取模型处理
- train: sentence,relation,head,head_offset,tail,tail_offset 达斯琪就任上士,担任,达斯琪,0,上士,5
- valid:sentence,relation,head,head_offset,tail,tail_offset 多尔顿成为磁鼓岛民间护卫团的团长,担任,多尔顿,0,团长,14
- test: sentence,relation,head,head_offset,tail,tail_offset Dr.古蕾娃和多尔顿同行去了“世界会议”,遇见,Dr.古蕾娃,0,多尔顿,7
- relation.csv head_type,tail_type,relation,index 例如:None,None,None,0 人,事件,参与,1
1.5 实体关系知识图谱
文件名
deepke-master/utils/convert_vivrecard2deepke.py
输入
vivre card的数据 /data/vivrecard/annot/outputs/fuseki_vivrecard_sentence_item.json
处理过程
将标注的实体和关系单独导出,构建《海贼王》实体关系数据集
输出
deepke-master/data/vivrecard/summary/vizdata_vivrecard_relation.json
{
"links": [
{
"relation": "到过",
"source": "蒙其·D·路飞",
"target": "蛋糕岛",
"value": 3
}
],
"nodes": [
{
"class": "人",
"group": "0",
"id": "Baby 5",
"size": "8"
}
]
}
2.知识存储
2.1 转换为三元组
文件名
talkop/avpair2ntriples_talkop_vivre_card.py
输入
data/processed_manual_talkop_vivre_card -entities_avpair.json 等文件
处理过程
转换格式为Jena支持解析的N-Triple格式,命名空间前缀为 http://kg.course/talkop-vivre-card/
输出
talkop/data/processed_manual_talkop_vivre_card/ntriples_talkop_vivre_card.nt 注:
- 在项目构建过程中,将从CN-DBpedia获取的知识转换为 N-Triple 格式,命名空间前缀为 http://kg.course/onepiece/
- 程序:cndbpedia/avpair2ntriples_onepiece_cndbpedia.py
- 输出:cndbpedia/data/ntriples_cndbpedia_onepiece.nt
2.2 上传到Jena数据库
- 创建storeOnePiece目录
- cd apache-jena-fuseki-3.14.0
- mkdir storeOnePiece
- 运行:fuseki-server --loc=storeOnePiece --update /talkop-vivre-card
- 访问http://localhost:3030
- Manage datasets
- existing datasets:/talkop-vivre-card
- upload data
- 上传文件ntriples_talkop_vivre_card.nt
2.3 查询数据库
sparql
PREFIX : http://kg.course/talkop-vivre-card/ select ?s ?name ?zhname ?height ?o where { ?s ?height ?o . FILTER(?height in (:身高, :身长)) . OPTIONAL { ?s :名称 ?name. ?s :外文名 ?zhname.} } limit 5 PREFIX : http://kg.course/talkop-vivre-card/ select ?s ?name ?o where { ?s :生日 ?o . ?s :名称 ?name . filter(?o > '4月1日' && ?o < '5月1日') } limit 5
3.知识抽取
DeepKE 基于 Pytorch 的深度学习中文关系抽取处理套件。利用之前构建的关系抽取数据集和deepke,进行中文关系抽取实践。
3.1 数据转换与标注统计
文件名
deepke-master/utils/convert_vivrecard2deepke.py
输入
vivre card的数据 /data/vivrecard/annot/outputs/fuseki_vivrecard_sentence_item.json
处理过程
- 将标注结果转换为deepke的格式。
- 将数据随机打乱,以保证关系分布均匀。
- 划分训练集、测试集、验证集,目前按 7:2:1进行划分。
输出
deepke-master/data/vivrecard/ 中的 origin 和 summary
3.2 训练关系抽取模型
输入
train valid test relation.csv文件
输出
包含超参数的模型及字典
具体方法
- 使用deepke所提供的PCNN, rnn, gcn, capsule, transformer, bert 这些模型,epoch 设置为 50, num_relations 根据数据集的实际情况修改为19,
- 注:先在相关网页https://github.com/ymcui/Chinese-BERT-wwm下载好预训练模型,方可用基于BERT的语言模型训练
- 新的数据集有22种关系(包括None),需要通过 num_relations 来更改
- 训练1 cnn、rnn 、gcn、capsule、transformer,以下命令替换model即可
cd deepke-master
python main.py show_plot=False data_path=data/vivrecard/origin out_path=data/vivrecard/out num_relations=22 epoch=50 model=cnn
注:问题:AttributeError: module 'tensorflow_core.keras.activations' has no attribute 'swish' 解决办法:You'll need to either downgrade transformers to 3.1 or upgrade 3.1
- 训练2 bert 设置num_hidden_layers为1,2,3即可,lm_file为pretrain目录,必须包括以下3个文件config.json, pytorch_model.bin,vocab.txt
python main.py show_plot=False data_path=data/vivrecard/origin out_path=data/vivrecard/out num_relations=22 epoch=50 model=lm lm_file=/home/zenghao/ZJU_study/Knowledge_Graph/deepke/pretrained/ num_hidden_layers=1
注:运行main.py ,会在checkpoint目录生成大量文件,请注意电脑的磁盘空间,如无GPU,运行时间需20分钟左右。另外需安装以下依赖库
hydra hydra-core pytorch matplotlib tensorboard transformers
3.3 比较训练结果
基于bert的语言模型效果最好,明显优于其他模型。GCN的效果最差。说明在小规模数据上利用预训练的语言模型还是能够抽取到比较好的特征的。但是在我们后面对于实际数据的预测结果发现,语言模型的泛化效果似乎不如PCNN模型的好,猜测是由于数据存在长尾分布问题,模型可能趋向于预测某些特定关系来作弊,以便达到准确率提高的效果。
4.图计算
采用Neo4j做图计算
参考项目报告6 知识计算内容,访问链接http://openkg.cn/dataset/onepiece
5.知识推理
ToDo
6.知识应用
6.1 知识问答
工具
基于REfO 实现的KBQA系统,主要流程为:
- 解析输入的自然语言问句生成SPARQL查询,
- 请求后台基于TDB知识库的 Apache Jena Fuseki 服务, 得到结果。
代码
vivirecard-KB_query/query_main.py 直接输入问题
6.2 知识图谱可视化
- 采用的工具 d3js
- 实现的功能:对之前构建的实体关系知识图谱提供可视化交互功能,包括结点连接关系可视化、查询相关结点信息。同时在这部分也整合了之间构建的人物属性知识图谱,提供了信息框的展示过程,
- 代码:visualization/html/index.html
- 支持浏览器:Microsoft Edge
- 实体关系可视化演示页面:可以参见项目的GitHub Pages 实体关系可视化页面