我正在研究一个知识图数据集,该数据集具有格式的三倍,即主语,谓语和宾语的三倍。
说,知识图看起来如下:
X = np.array([['a', 'y', 'b'],
['b', 'y', 'a'],
['a', 'y', 'c'],
['c', 'y', 'a'],
['a', 'y', 'd'],
['c', 'y', 'd'],
['b', 'y', 'c'],
['f', 'y', 'e']])
在损失函数中,对每个三元组进行迭代:
x_pos_tf = tf.cast(dataset_iterator.get_next(), tf.int32)
(其中:
dataset_iterator = dataset.make_one_shot_iterator()
)
现在,对于每个三元组,我希望从知识图中获取与该三元组具有相同主题的所有三元组。例如:对于三元组(a,y,b),我希望获取((a,y,c),(a,y,d))。 [注意:不包括正在评估的三元组。]
通过使用如下所示的知识图字典数据结构,我使用numpy列表执行了此操作:
d = {s: [tuple(x) for x in X if x[0] == s] for s in np.unique(X[:, 0])}
这将返回以下格式的字典:
d={'f': [('f', 'y', 'e')],
'c': [('c', 'y', 'a'), ('c', 'y', 'd')],
'a': [('a', 'y', 'b'), ('a', 'y', 'c'), ('a', 'y', 'd')],
'b': [('b', 'y', 'a'), ('b', 'y', 'c')]}
然后,我对任何三元组进行如下简单查找:
return list({triple for x in x_to_score for triple in self.d[x[0]]} - set(x_to_score))
其中x_to_score
是要评估的三元组。
作为示例,这将返回示例三元组('a','y','b')的列表[('a','y','c'), ('a','y','d')]
。
但是,现在的问题是,当我遍历三元组(即一次处理一批三元组)时,它们需要作为张量传递,因此我无法执行numpy操作或列出理解来做到这一点。
我需要将要评估的三元组处理为张量,然后还返回结果的张量列表。
由于我是Tensorflow的新手,所以我不知道该怎么做。
此外,这需要评估一批三元组。
我已经尝试过tf.slice()
操作来获取主题,以及一些tf.sets()
函数,但是由于我对Tensorflow非常陌生,因此无法弄清楚。
任何帮助将不胜感激!谢谢。