我正在研究一个知识图数据集,它具有格式的三元组,即主语、谓语和宾语的三元组。
比如说,知识图如下所示:
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','c'), ('a','y','d')]
样本三元组 ('a','y','b') 的列表。
但是,现在的问题是,当我遍历三元组(即一次性处理一批三元组)时,它们需要作为张量传递,因此我不能执行 numpy 操作或列表推导来做到这一点。
我需要处理要作为张量评估的三元组,然后也返回结果的张量列表。
由于我是 tensorflow 的新手,所以我无法弄清楚如何去做。
此外,这需要用于评估一批三元组。
我已经尝试过tf.slice()
获取主题的操作和一些tf.sets()
功能,但无法弄清楚,因为我对 tensorflow 很陌生。
任何帮助将不胜感激!谢谢你。