知识表示Trans系列之TransE、TransH、TransR以及PTransE算法的JAVA实现
- 代码大部分内容参考KE2G
- 实验使用的中文数据源自网上一份三国演义人物关系图,对其进行了整理得到相应的三元组。
- 实验的效果根据自己需要进行相应的调参,主要的参数放在GlobalValue.java 文件中。
- 代码复现过程中,我根据自己的理解对源C++代码进行了部分修改,剔除了一些冗余和不合理的代码
- Mean-Rank和Hits@10采用了Raw和Filter两种评价方式。关于TransE评测指标更详细的介绍可参考这篇文章 TransE评测方法
jdk-1.8.0
-
TransH/TransR/TransE/PTransE文件夹
-
GlobalValue.java:训练参数内容
-
Gradient.java:梯度下降,以及知识表示的向量更新的过程
-
Pair.java:自定义的数据结构,实现类似C++中Pair数据结构
-
TrainPrepare.java/TestPrepare.java:读取训练文件/测试文件
-
Train.java:训练过程,依次为参数初始化、梯度下降迭代、写实体、关系的表示向量
-
Test.java:实体链接、关系链接的测试过程,依次为读取向量文件、测试实体链接性能、测试关系链接性能
-
-
Main.java:选择训练还是测试,输入“y”则训练,输入“n”为测试
-
resource文件夹
- data文件夹:输入文件,包含实体集合文件entity2id.txt,关系集合文件relation2id.txt,三元组训练、测试文件train.txt和test.txt
- result文件夹:知识表示向量输出文件夹,包含实体向量entity2vec.bern、关系向量relation2vec.bern,变换矩阵Wr_vec.bern(TransH、TransR才拥有)
entity2id.txt中,输入格式为:
{实体名称} \t {id}
relation2id.txt中,输入格式为:
{关系名称} \t {id}
train.txt\test.txt 格式为:
{head} \t {tail} \t {relaiton}