知识表示学习神器OpenKE:快速获取KG表示
导读
最近使用到清华大学 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 的平移向量,由此可得到 ,进而使用最大间隔衡量误差。训练时,通过采样构建负样本进行优化。
——参考《知识图谱与深度学习》
笔者最近需要获取 POI 及 POI 之间关系的表示,通过观察官方文档示例,输入数据按如下形式组织。
1. 数据输入:entity2id.txt, relation2id.txt, train2id.txt.
# relation2id.txt 第一行为关系总数,每行之间以制表符(\t)分隔
2
belong_to 0
locate_at 1
train2id.txt,特别注意三元组不要有重复,影响参数大小,产生意外错误。
# train2id.txt 第一行为三元组总数,每一行以制表符分隔,
2
3325 782 1
3425 712 0
官方 API 文档中给出的训练样例与 Github 现在版本不同,无需参考。
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":[[],[]]}
通常情况下,不会有只获得知识表示的需求,常与后续任务一起完成,如知识图谱补全、链路预测等。笔者本次的需求不需要构建端到端的结构,可以先获得知识表示,再进行后续处理。所以调研了现有的知识表示库,发现 openKE 使用方便,能够较好地支撑需求。
更多阅读
#投 稿 通 道#
让你的论文被更多人看到
如何才能让更多的优质内容以更短路径到达读者群体,缩短读者寻找优质内容的成本呢?答案就是:你不认识的人。
总有一些你不认识的人,知道你想知道的东西。PaperWeekly 或许可以成为一座桥梁,促使不同背景、不同方向的学者和学术灵感相互碰撞,迸发出更多的可能性。
PaperWeekly 鼓励高校实验室或个人,在我们的平台上分享各类优质内容,可以是最新论文解读,也可以是学习心得或技术干货。我们的目的只有一个,让知识真正流动起来。
📝 来稿标准:
• 稿件确系个人原创作品,来稿需注明作者个人信息(姓名+学校/工作单位+学历/职位+研究方向)
• 如果文章并非首发,请在投稿时提醒并附上所有已发布链接
• PaperWeekly 默认每篇文章都是首发,均会添加“原创”标志
📬 投稿邮箱:
• 投稿邮箱:hr@paperweekly.site
• 所有文章配图,请单独在附件中发送
• 请留下即时联系方式(微信或手机),以便我们在编辑发布时和作者沟通
🔍
现在,在「知乎」也能找到我们了
进入知乎首页搜索「PaperWeekly」
点击「关注」订阅我们的专栏吧
关于PaperWeekly
PaperWeekly 是一个推荐、解读、讨论、报道人工智能前沿论文成果的学术平台。如果你研究或从事 AI 领域,欢迎在公众号后台点击「交流群」,小助手将把你带入 PaperWeekly 的交流群里。