使用OpenKE预训练的freebase关系向量

最近做实验要用到使用TransE等知识表示工具训练出的freebase向量,本来以为需要自己训练,恰好发现清华大学的团队已提供了训练好的freebase、wikidata等开放知识图谱向量。下载地址为http://139.129.163.161/index/toolkits#pretrained-embeddings

但是下载之后发现保存关系向量的文件relation2vec.bin是2进制的,需要自己把它解析出来

参考了一篇python 二进制文件解析的博客 https://blog.csdn.net/lovelyaiq/article/details/81988185,了解到需要用struct.unpack函数来解析

unpack()函数是这样的:

unpack(fmt, string),其中string是你每次想解析的二进制流字符串,fmt是对解析内容的描述,具体规则参见上面的博客!

然后统计了一下,relation2vec.bin整个文件的长度是2964800,freebase中一共有14824种关系,所以每个关系的向量占用2964800/14824=200字节;而OpenKE团队已告知向量维度是50维,所以说明每个数字占用4字节,也就是float格式

所以如果想把整个向量文件一次性解析,数字总数是14824*50,格式为‘float',fmt就应该是‘741200f’

这样把整个文件解析成一个(741200,)的tuple,就可以进一步转化为(14824,50)格式的numpy.array来用了

具体函数为:

import codecs as cs
from struct import unpack
def Load_RelationEmbedding(path):
    with cs.open(path,"rb+") as fp:
        buf = fp.read()
        numbers = unpack('741200f', buf)
    table = []
    for i in range(0,741200,50):
        rvec = [numbers[j] for j in range(i,i+50)]
        table.append(rvec)
    return table
relation_embedding = Load_RelationEmbedding('../freebase/relation2vec.bin')

 

你可能感兴趣的:(深度学习)