lightsmile's knowledge graph library
Project description
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: 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
- models
- ksq
- utils
架构说明
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
知识图谱
Pytorch教程
- PyTorch 常用方法总结4:张量维度操作(拼接、维度扩展、压缩、转置、重复……)
- Pytorch中的RNN之pack_padded_sequence()和pad_packed_sequence()
- pytorch学习笔记(二):gradient
- torch.multinomial()理解
- Pytorch 细节记录
- What does flatten_parameters() do?
- 关于Pytorch的二维tensor的gather和scatter_操作用法分析
- Pytorch scatter_ 理解轴的含义
- ‘model.eval()’ vs ‘with torch.no_grad()’
- 到底什么是生成式对抗网络GAN?
torchtext介绍
其他工具模块
数据集
表示学习
命名实体识别
关系抽取
事件抽取
这里暂时粗浅的将语义角色标注技术实现等同于事件抽取任务。
其他
打赏
如果该项目对您有所帮助,欢迎打赏~
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
File details
Details for the file lightKG-0.1.0.3.tar.gz
.
File metadata
- Download URL: lightKG-0.1.0.3.tar.gz
- Upload date:
- Size: 21.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/2.0.0 pkginfo/1.5.0.1 requests/2.22.0 setuptools/44.0.0.post20200106 requests-toolbelt/0.9.1 tqdm/4.28.1 CPython/3.6.8
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | c09265077dedb6905d6906c2fd4062f2ad2eae2e6c022dd7ecb998f3eff91f82 |
|
MD5 | bd5b6bac68cc19c713e2138d28f224a4 |
|
BLAKE2b-256 | 0e31f680391ebb5798c1fae155cdc7edfbd566c7faac9623ce052abd276bc577 |
File details
Details for the file lightKG-0.1.0.3-py3-none-any.whl
.
File metadata
- Download URL: lightKG-0.1.0.3-py3-none-any.whl
- Upload date:
- Size: 38.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/2.0.0 pkginfo/1.5.0.1 requests/2.22.0 setuptools/44.0.0.post20200106 requests-toolbelt/0.9.1 tqdm/4.28.1 CPython/3.6.8
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 08cc2ca3688e758fd2741e3d313c43c5800ff021fcc989cd11689c5e373aaf21 |
|
MD5 | 7e166af10293e4cae786bd768e109ab7 |
|
BLAKE2b-256 | 2f415478cf11a4c6a4b5adb97da77b24967dd9800849d8906df0b0fcfbcfbe13 |