Skip to main content

lightsmile's knowledge graph library

Project description

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

前言

根据知识图谱发展报告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。
  • [x] 重构项目结构,将相同冗余的地方合并起来,保持项目结构清晰
  • [ ] 现在模型保存的路径和名字默认一致,会冲突,接下来每个模型都有自己的name

功能

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

参考

Deep Learning

NLP

知识图谱

Pytorch教程

torchtext介绍

其他工具模块

数据集

表示学习

命名实体识别

关系抽取

事件抽取

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

其他

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Files for lightKG, version 0.1.0.1
Filename, size File type Python version Upload date Hashes
Filename, size lightKG-0.1.0.1-py3-none-any.whl (38.8 kB) File type Wheel Python version py3 Upload date Hashes View hashes
Filename, size lightKG-0.1.0.1.tar.gz (23.4 kB) File type Source Python version None Upload date Hashes View hashes

Supported by

Elastic Elastic Search Pingdom Pingdom Monitoring Google Google BigQuery Sentry Sentry Error logging AWS AWS Cloud computing DataDog DataDog Monitoring Fastly Fastly CDN SignalFx SignalFx Supporter DigiCert DigiCert EV certificate StatusPage StatusPage Status page