基于Pytorch和torchtext的知识图谱深度学习框架

网友投稿 1409 2022-10-29

基于Pytorch和torchtext的知识图谱深度学习框架

基于Pytorch和torchtext的知识图谱深度学习框架

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

说明

最近忙着学别的,暂时没怎么管这个lib了,后续会持续更新的。

前言

根据知识图谱发展报告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: TextCNNsrl: BiLstm-CRFner: 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 KRLtrain_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 pprintpprint(ner_model.predict('另一个很酷的事情是,通过框架我们可以停止并在稍后恢复训练。'))

预测结果:

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

re

训练

from lightkg.ere import REre = 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 SRLsrl_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.pymodel.pymodule.pytool.py common entity.pyrelation.py ede srl, 语义角色标注 ere re, 关系抽取 erl ner, 命名实体识别 krkrl,知识表示学习 models transE utils ksqutils

架构说明

base目录

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

config

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

model

模型的实现抽象基类,包含base.model.BaseConfig和base.model.BaseModel,包含load、save等方法

module

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

tool

业务模块的数据处理抽象基类,包含base.tool.Tool,包含get_dataset、get_vectors、get_vocab、get_iterator、get_score等方法

common目录

entity

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

relation

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

util目录

放一些通用的方法

todo

业务

工程

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

功能

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

参考

Deep Learning

What's the difference between “hidden” and “output” in PyTorch LSTM?What's the difference between LSTM() and LSTMCell()?深度学习框架技术剖析[转]

NLP

基于表示学习的信息抽取方法浅析知识抽取-实体及关系抽取知识抽取-事件抽取

知识图谱

翻译模型(Trans系列)的知识表示学习知识图谱向量化表示

Pytorch教程

PyTorch 常用方法总结4:张量维度操作(拼接、维度扩展、压缩、转置、重复……)Pytorch中的RNN之pack_padded_sequence()和pad_packed_sequence()pytorch学习笔记(二):gradienttorch.multinomial()理解Pytorch 细节记录What does flatten_parameters() do?关于Pytorch的二维tensor的gather和scatter_操作用法分析Pytorch scatter_ 理解轴的含义‘model.eval()’ vs ‘with torch.no_grad()’到底什么是生成式对抗网络GAN?

torchtext介绍

torchtextA Tutorial on TorchtextTorchtext 详细介绍torchtext入门教程,轻松玩转文本数据处理

其他工具模块

python的Tqdm模块pytorch-crf

数据集

Chinese-Literature-NER-RE-DatasetChineseTextualInference

表示学习

TransE-Knowledge-Graph-EmbeddingOpenKE-PyTorch【语料】2500万中文三元组!

命名实体识别

sequence_tagging

关系抽取

ChineseNREpytorch-pcnn关系抽取(分类)总结

事件抽取

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

语义角色标注iobes_iob 与 iob_ranges 函数借鉴BiRNN-SRLchinese_semantic_role_labeling

其他

打赏

如果该项目对您有所帮助,欢迎打赏~

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Rosie是遵循Clean Architecture原则创建应用的Android框架
下一篇:基于Workerman 实现的自带http server的web开发框架
相关文章

 发表评论

暂时没有评论,来抢沙发吧~