Skip to content
基于Pytorch和torchtext的知识图谱深度学习框架,包含知识表示学习、实体识别与链接、实体关系抽取、事件检测与抽取、知识存储与查询、知识推理六大功能模块,已实现了命名实体识别、关系抽取、事件抽取、表示学习等功能。框架功能丰富,开箱可用,极易上手!基本都是学习他人实现然后自己修改融合到框架中,没有细致调参,且有不少Bug~
Branch: master
Clone or download
Latest commit 8e38a30 May 15, 2019

README.md

lightKG,lightsmile个人的知识图谱技术框架

2019.5.15说明

鄙人正在准备考研,另外用于开发的Manjaro系统于5月初崩了暂时没精力修复,所以在今后2019年不再更新此项目,考研结束后会永久跟进,并不是被作者弃用了,望周知~。

另开发这个框架的初心:

  1. 以练代学,之前迷迷茫茫各种找资源学习基于深度学习的kg,然而更多的是一些重复的理论知识,即只是“朦胧的感知”,严重缺乏各项目任务的实战经验,所以从github上找各任务的基础模型实现代码来学习。
  2. 以一种比较统一的形式把这些kg基础任务的(目前是非常基础的)深度学习实现集成到一起,方便开发者(主要是我自己)使用,同时在这个过程中提升自己的开发能力,同时也能方便初学者对号入座,即了解这些任务的对应实现代码大概应该长成什么样子。
  3. 我的理想之一是今后开发一款知识管理系统,里面会用到大量NLP和知识图谱的相关技能,而在接触和了解nlp领域以及用了一些开源或收费的nlp工具之后发现当前技术(无论是效果还是技术面)还不能满足我的需求,所以我打算自己去实现应用框架,这也是我对nlp以及kg领域感兴趣并专注奉献于此的根本原因,飞蛾扑火蜉蝣撼树亦不悔。

ps:

  1. 之所以选择Pytorch而不是TensorFlow或者Keras只是单纯出于个人喜好,觉得Keras抽象层面太高,觉得TensorFlow的代码太丑,没有什么形式美~
  2. 个人coding能力有限,当前里面有不少bug和可优化之处,还请各位看官谅解~
  3. 我是故意不加注释的
  4. 目前也不打算公开数据集
  5. 不喜勿喷
  6. 很忙,勿扰!

前言

根据知识图谱发展报告2018相关介绍,框架主要设计为有以下五大功能:

  • 知识表示学习, Knowledge Representation Learning
  • 实体识别与链接, Entity Recognition and Linking
  • 实体关系抽取, Entity Relation Extraction
  • 事件检测与抽取, Event Detection and Extraction
  • 知识存储与查询, Knowledge Storage and Query
  • 知识推理, Knowledge Reasoning

因此将有六个主要的功能模块:krl(知识表示学习)、erl(实体识别与链接)、ere(实体关系抽取)、ede(实体检测与抽取)、ksq(知识存储与查询)、kr(知识推理)以及其他功能模块。

当前已实现的功能

知识表示学习

  • 基于翻译模型(Trans系列)的知识表示学习, TransE

实体识别与链接

  • 命名实体识别, ner

实体关系抽取

  • 关系抽取, re

事件检测与抽取

  • 语义角色标注, srl

知识存储与查询

知识推理

安装

本项目基于Pytorch1.0

pip install lightKG

建议使用国内源来安装,如使用以下命令:

pip install -i https://pypi.douban.com/simple/ lightKG

安装依赖

由于有些库如pytorch、torchtext并不在pypi源中或者里面只有比较老旧的版本,我们需要单独安装一些库。

安装pytorch

具体安装参见pytorch官网来根据平台、安装方式、Python版本、CUDA版本来选择适合自己的版本。

安装torchtext

使用以下命令安装最新版本torchtext:

pip install https://github.com/pytorch/text/archive/master.zip

模型

  • krl:TransE等
  • re: TextCNN
  • srl: BiLstm-CRF
  • ner: BiLstm-CRF

训练数据说明

krl

csv格式

共三列,依次为头实体关系尾实体, 示例如下:

科学,包涵,自然、社会、思维等领域
科学,外文名,science
科学,拼音,kē xué
科学,中文名,科学
科学,解释,发现、积累的真理的运用与实践
语法学,外文名,syntactics
语法学,中文名,语法学
物理宇宙学,对象,大尺度结构和宇宙形成
物理宇宙学,时间,二十世纪
物理宇宙学,所属,天体物理学

ner

BIO

训练数据示例如下:

清 B_Time
明 I_Time
是 O
人 B_Person
们 I_Person
祭 O
扫 O
先 B_Person
人 I_Person
, O
怀 O
念 O
追 O
思 O
的 O
日 B_Time
子 I_Time
。 O

正 O
如 O
宋 B_Time
代 I_Time
诗 B_Person
人 I_Person

srl

CONLL

训练数据示例如下,其中各列分别为词性是否语义谓词角色,每句仅有一个谓语动词为语义谓词,即每句中第三列仅有一行取值为1,其余都为0.

宋浩京  NR      0       O
转达    VV      0       O
了      AS      0       O
朝鲜    NR      0       O
领导人  NN      0       O
对      P       0       O
中国    NR      0       O
领导人  NN      0       O
的      DEG     0       O
亲切    JJ      0       O
问候    NN      0       O
,      PU      0       O
代表    VV      0       O
朝方    NN      0       O
对      P       0       O
中国    NR      0       B-ARG0
党政    NN      0       I-ARG0
领导人  NN      0       I-ARG0
和      CC      0       I-ARG0
人民    NN      0       E-ARG0
哀悼    VV      1       rel
金日成  NR      0       B-ARG1
主席    NN      0       I-ARG1
逝世    VV      0       E-ARG1
表示    VV      0       O
深切    JJ      0       O
谢意    NN      0       O
。      PU      0       O

re

训练数据示例如下,其中各列分别为实体1实体2关系句子

钱钟书	辛笛	同门	与辛笛京沪唱和聽钱钟书与钱钟书是清华校友,钱钟书高辛笛两班。
元武	元华	unknown	于师傅在一次京剧表演中,选了元龙(洪金宝)、元楼(元奎)、元彪、成龙、元华、元武、元泰7人担任七小福的主角。

使用

krl

训练

from lightkg.krl import KRL

train_path = '/home/lightsmile/NLP/corpus/kg/baike/train.sample.csv'
dev_path = '/home/lightsmile/NLP/corpus/kg/baike/test.sample.csv'
model_type = 'TransE'

krl = KRL()
krl.train(train_path, model_type=model_type, dev_path=train_path, save_path='./krl_{}_saves'.format(model_type))

测试

krl.load(save_path='./krl_{}_saves'.format(model_type), model_type=model_type)
krl.test(train_path)

预测

根据头实体、关系、尾实体,预测其概率
print(krl.predict(head='编译器', rel='外文名', tail='Compiler'))

输出为:

0.998942494392395
根据头实体和关系,预测训练集词表中topk(默认为3)个可能尾实体
print(krl.predict_tail(head='编译器', rel='外文名'))

输出为:

[('Compiler', 0.998942494392395), ('20世纪50年代末', 0.3786872327327728), ('译码器', 0.3767447769641876)]
根据头实体和尾实体,预测训练集词表中topk(默认为3)个可能关系
print(krl.predict_rel(head='编译器', tail='Compiler'))

输出为:

[('外文名', 0.998942494392395), ('英译', 0.8240533471107483), ('拼音', 0.4082326292991638)]
根据尾实体和关系,预测训练集词表中topk(默认为3)个可能头实体
print(krl.predict_head(rel='外文名', tail='Compiler'))

输出为:

[('编译器', 0.998942494392395), ('译码器', 0.36795616149902344), ('计算机,单片机,编程语言', 0.36788302659988403)]

ner

训练

from lightkg.erl import NER

# 创建NER对象
ner_model = NER()

train_path = '/home/lightsmile/NLP/corpus/ner/train.sample.txt'
dev_path = '/home/lightsmile/NLP/corpus/ner/test.sample.txt'
vec_path = '/home/lightsmile/NLP/embedding/char/token_vec_300.bin'

# 只需指定训练数据路径,预训练字向量可选,开发集路径可选,模型保存路径可选。
ner_model.train(train_path, vectors_path=vec_path, dev_path=dev_path, save_path='./ner_saves')

测试

# 加载模型,默认当前目录下的`saves`目录
ner_model.load('./ner_saves')
# 对train_path下的测试集进行读取测试
ner_model.test(train_path)

预测

from pprint import pprint

pprint(ner_model.predict('另一个很酷的事情是,通过框架我们可以停止并在稍后恢复训练。'))

预测结果:

[{'end': 15, 'entity': '我们', 'start': 14, 'type': 'Person'}]

re

训练

from lightkg.ere import RE

re = RE()

train_path = '/home/lightsmile/Projects/NLP/ChineseNRE/data/people-relation/train.sample.txt'
dev_path = '/home/lightsmile/Projects/NLP/ChineseNRE/data/people-relation/test.sample.txt'
vec_path = '/home/lightsmile/NLP/embedding/word/sgns.zhihu.bigram-char'

re.train(train_path, dev_path=dev_path, vectors_path=vec_path, save_path='./re_saves')

测试

re.load('./re_saves')
re.test(dev_path)

预测

print(re.predict('钱钟书', '辛笛', '与辛笛京沪唱和聽钱钟书与钱钟书是清华校友,钱钟书高辛笛两班。'))

预测结果:

(0.7306928038597107, '同门') # return格式为(预测概率,预测标签)

srl

训练

from lightkg.ede import SRL

srl_model = SRL()

train_path = '/home/lightsmile/NLP/corpus/srl/train.sample.tsv'
dev_path = '/home/lightsmile/NLP/corpus/srl/test.sample.tsv'
vec_path = '/home/lightsmile/NLP/embedding/word/sgns.zhihu.bigram-char'


srl_model.train(train_path, vectors_path=vec_path, dev_path=dev_path, save_path='./srl_saves')

测试

srl_model.load('./srl_saves')

srl_model.test(dev_path)

预测

word_list = ['代表', '朝方', '', '中国', '党政', '领导人', '', '人民', '哀悼', '金日成', '主席', '逝世', '表示', '深切', '谢意', '']
pos_list = ['VV', 'NN', 'P', 'NR', 'NN', 'NN', 'CC', 'NN', 'VV', 'NR', 'NN', 'VV', 'VV', 'JJ', 'NN', 'PU']
rel_list = [0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0]

print(srl_model.predict(word_list, pos_list, rel_list))

预测结果:

{'ARG0': '中国党政领导人和人民', 'rel': '哀悼', 'ARG1': '金日成主席逝世'}

项目组织结构

项目架构

  • base
    • config.py
    • model.py
    • module.py
    • tool.py
  • common
    • entity.py
    • relation.py
  • ede
    • srl, 语义角色标注
  • ere
    • re, 关系抽取
  • erl
    • ner, 命名实体识别
  • kr
  • krl,知识表示学习
    • models
      • transE
    • utils
  • ksq
  • utils

架构说明

base目录

放一些基础的模块实现,其他的高层业务模型以及相关训练代码都从此module继承相应父类。

config

存放模型训练相关的超参数等配置信息

model

模型的实现抽象基类,包含base.model.BaseConfigbase.model.BaseModel,包含loadsave等方法

module

业务模块的训练验证测试等实现抽象基类,包含base.module.Module,包含trainload_validatetest等方法

tool

业务模块的数据处理抽象基类,包含base.tool.Tool,包含get_datasetget_vectorsget_vocabget_iteratorget_score等方法

common目录

entity

实体基类, 所有需要使用实体对象的使用此类或从此类继承子类

relation

关系基类, 所有需要使用关系对象的使用此类或从此类继承子类

util目录

放一些通用的方法

todo

业务

工程

  • 重构项目结构,将相同冗余的地方合并起来,保持项目结构清晰
  • 增加断点重训功能。
  • 增加earlyStopping。
  • 现在模型保存的路径和名字默认一致,会冲突,接下来每个模型都有自己的name

功能

  • 增加关系抽取相关模型以及训练预测代码
  • 增加事件抽取相关模型以及训练预测代码
  • 增加命名实体识别相关模型以及预测训练代码
  • 增加基于翻译模型的知识表示学习相关模型以及训练预测代码
  • 增加实体链接的知识表示学习相关模型以及训练预测代码

参考

Deep Learning

NLP

知识图谱

Pytorch教程

torchtext介绍

其他工具模块

数据集

表示学习

命名实体识别

关系抽取

事件抽取

这里暂时粗浅的将语义角色标注技术实现等同于事件抽取任务。

其他

You can’t perform that action at this time.