查看原文
其他

知识表示学习神器OpenKE:快速获取KG表示

西南交一枝花 PaperWeekly 2022-07-04


©PaperWeekly 原创 · 作者|西南交一枝花
单位|西南交通大学CCIT实验室博士生
研究方向|NLP、时空数据挖掘

导读

最近使用到清华大学 NLP 组开发的知识图谱表示工具 OpenKE,论文发表在 EMNLP 2018《OpenKE: An Open Toolkit for Knowledge Embedding》。对于简单的图谱表示需求,可以快速实现。

Github地址:

https://github.com/thunlp/OpenKE


项目主页:

http://139.129.163.161//



概述

知识图谱表示任务具体指将实体、关系嵌入到连续低维空间表示,如图一所示,可类比于词的向量化表示。常用的知识表示算法如 TransE, TransH 等,OpenKE 共集成了八种知识表示方法,具体如下图二所示:

▲ 图一、知识表示图示

▲ 图二、八种知识表示方法

以 TransE 为例,对知识表示做简单介绍。TransE 属于平移模型的一种,主要思想是将实体和关系映射至同一低维空间。具体操作为,给定三元组 <h, r, t>,将关系 r 看作头实体 h 到尾实体 t 的平移向量,由此可得到 ,进而使用最大间隔衡量误差。训练时,通过采样构建负样本进行优化。
——参考《知识图谱与深度学习》
除了集成上述八种知识表示算法之外,该工作对三个大规模知识图谱做了预训练,可以通过 python 或 C++ 加载使用。

▲ 图三、WIKI&freebase&XLORE预训练

python
#Python codes to read the binary files.
import numpy as np
vec = np.memmap(filename , dtype='float32', mode='r')

C++
//C(C++) codes to read the binary files.
#include <cstring>
#include <cstdio>
#include <cstdlib>
#include <sys/mman.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/stat.h>

struct stat statbuf;
int fd;
float* vec;

int main() {
  if(stat(filename, &statbuf)!=-1) {
    fd = open("relation2vec.bin", O_RDONLY);
    vec = (float*)mmap(NULL, statbuf.st_size, PROT_READ, MAP_PRIVATE, fd, 0); 
  }
  return 0;
}
值得注意的是,这里所介绍的知识图谱表示方法都是基于静态知识图谱。相较于静态知识图谱,动态知识图谱会随着时间演化发生变化,具体表现在本体概念和实例三元组。


需求测试

笔者最近需要获取 POI 及 POI 之间关系的表示,通过观察官方文档示例,输入数据按如下形式组织。

1. 数据输入:entity2id.txt, relation2id.txt, train2id.txt.

格式说明:entity2id.txt 和 relation2id.txt
# relation2id.txt 第一行为关系总数,每行之间以制表符(\t)分隔
2
belong_to 0
locate_at 1

train2id.txt,特别注意三元组不要有重复,影响参数大小,产生意外错误。

# train2id.txt 第一行为三元组总数,每一行以制表符分隔,
2
3325  782  1
3425  712  0
2. 源码下载 直接下载文首给出的 Github 链接,为 pytorch 版本。
官方 API 文档中给出的训练样例与 Github 现在版本不同,无需参考。
3. 开始训练
import openke
from openke.config import Trainer, Tester
from openke.module.model import TransE
from openke.module.loss import MarginLoss
from openke.module.strategy import NegativeSampling
from openke.data import TrainDataLoader, TestDataLoader

# dataloader for training
train_dataloader = TrainDataLoader(
    in_path = "三个输入文件的路径"
    nbatches = 100,
    threads = 8
    sampling_mode = "normal"
    bern_flag = 1
    filter_flag = 1
    neg_ent = 25,
    neg_rel = 0)

# dataloader for test
test_dataloader = TestDataLoader("测试数据路径""link")

# define the model
transe = TransE(
    ent_tot = train_dataloader.get_ent_tot(),
    rel_tot = train_dataloader.get_rel_tot(),
    dim = 200
    p_norm = 1
    norm_flag = True)


# define the loss function
model = NegativeSampling(
    model = transe, 
    loss = MarginLoss(margin = 5.0),
    batch_size = train_dataloader.get_batch_size()
)

# train the model
trainer = Trainer(model = model, data_loader = train_dataloader, train_times = 1000, alpha = 1.0, use_gpu = True)
trainer.run()
transe.save_checkpoint('./checkpoint/transe.ckpt')
transe.save_parameters('./embed.vec'# 保存嵌入向量

# test the model
transe.load_checkpoint('./checkpoint/transe.ckpt')
tester = Tester(model = transe, data_loader = test_dataloader, use_gpu = True)
tester.run_link_prediction(type_constrain = False)

训练完成之后,得到一个 embed.vec 文件,通过 json 加载使用。样式为:

{"ent_embeddings.weight":[[],[]], "rel_embeddings.weight":[[],[]]}
其中,下标对应实体 ID 和关系 ID,可在后续任务中使用。

总结

通常情况下,不会有只获得知识表示的需求,常与后续任务一起完成,如知识图谱补全、链路预测等。笔者本次的需求不需要构建端到端的结构,可以先获得知识表示,再进行后续处理。所以调研了现有的知识表示库,发现 openKE 使用方便,能够较好地支撑需求。

该工具支持的知识表示方法论文列表如下所示:
A Three-Way Model for Collective Learning on Multi-Relational Data. Nickel et al. Proceedings of ICML 2011.
Translating Embeddings for Modeling Multi-relational Data. Bordes et al. Proceedings of NIPS 2013.
Knowledge Graph Embedding by Translating on Hyperplanes. Wang et al. Proceedings of AAAI, 2014.
Learning Entity and Relation Embeddings for Knowledge Graph Completion. Lin et al. Proceedings of AAAI, 2015.
Knowledge Graph Embedding via Dynamic Mapping Matrix. Ji et al. Proceedings of ACL 2015.
Embedding Entities and Relations for Learning and Inference in Knowledge Bases. Yang et al. Proceedings of ICLR 2015.
Holographic Embeddings of Knowledge Graphs. Nickel et al. Proceedings of AAAI 2016.
Knowledge Graph Completion with Adaptive Sparse Transfer Matrix. Ji et al. Proceedings of AAAI 2016.
Complex Embeddings for Simple Link Prediction. Trouillon et al. Proceedings of ICML 2016.

更多阅读




#投 稿 通 道#

 让你的论文被更多人看到 



如何才能让更多的优质内容以更短路径到达读者群体,缩短读者寻找优质内容的成本呢?答案就是:你不认识的人。


总有一些你不认识的人,知道你想知道的东西。PaperWeekly 或许可以成为一座桥梁,促使不同背景、不同方向的学者和学术灵感相互碰撞,迸发出更多的可能性。 


PaperWeekly 鼓励高校实验室或个人,在我们的平台上分享各类优质内容,可以是最新论文解读,也可以是学习心得技术干货。我们的目的只有一个,让知识真正流动起来。


📝 来稿标准:

• 稿件确系个人原创作品,来稿需注明作者个人信息(姓名+学校/工作单位+学历/职位+研究方向) 

• 如果文章并非首发,请在投稿时提醒并附上所有已发布链接 

• PaperWeekly 默认每篇文章都是首发,均会添加“原创”标志


📬 投稿邮箱:

• 投稿邮箱:hr@paperweekly.site 

• 所有文章配图,请单独在附件中发送 

• 请留下即时联系方式(微信或手机),以便我们在编辑发布时和作者沟通



🔍


现在,在「知乎」也能找到我们了

进入知乎首页搜索「PaperWeekly」

点击「关注」订阅我们的专栏吧



关于PaperWeekly


PaperWeekly 是一个推荐、解读、讨论、报道人工智能前沿论文成果的学术平台。如果你研究或从事 AI 领域,欢迎在公众号后台点击「交流群」,小助手将把你带入 PaperWeekly 的交流群里。



您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存