微信小程序本地存储与登录页面处理实例详细讲解
1409
2022-10-29
基于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小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~