0

关于使用张量表示几个 RDF 三元组的问题。

设想:

RDF-triple用于表达关于资源、格式(主语、谓语、宾语)的简单陈述。

假设我有两个谓词,一个是play_for,另一个是race_for,每个谓词包含n个三元组,如下:

第一个谓词:play_for;n个三人组:(Ray Allen, play_for, Boston Celtics), (Kobe Bryant, play_for, Lakers), ... 简而言之,(A_i, play for, T_i) for i =1 to n。

第二个谓词:race_for;n 三元组:(波士顿凯尔特人队,race_for,NBA 总冠军),(湖人队,race_for,NBA 总冠军),...简而言之,(T_i,race_for,NBA)对于 i=1 到 n。

张量表示是对这 2n 个三元组建模的一种方法。我正在研究Maximilian Nickel 的论文以使用张量分解来查找数据集的潜在语义结构。第一步是使用张量表示数据集。

张量条目 X_ijk = 1 表示存在关系(第 i 个实体,第 k 个谓词,第 j 个实体)。否则,对于不存在和未知的关系,条目设置为零。例如,这 2n 个三元组可以用张量建模为:

 One slice:  (A_i, play for, T_i)

       A1, A2,...,An, T1, T2,...,Tn, NBA
 A1    0    0      0   1   0      0    0
 A2    0    0      0   0   1      0    0
 :
 An    0    0      0   0   0      1    0
 T1    0    0      0   0   0      0    0
 T2    0    0      0   0   0      0    0
 :
 Tn    0    0      0   0   0      0    0
 NBA   0    0      0   0   0      0    0

 The other slice: (T_i, race for, NBA)

      A1,  A2,...,An, T1, T2,...,Tn, NBA
 A1    0    0      0   0   0      0    0
 A2    0    0      0   0   0      0    0
 :
 An    0    0      0   0   0      0    0
 T1    0    0      0   0   0      0    1
 T2    0    0      0   0   0      0    1
 :
 Tn    0    0      0   0   0      0    1
 NBA   0    0      0   0   0      0    0

假设 RDF 三元组存储在“test.txt”中。我的问题是如何使用 Python 对这个建模过程进行编程。

这是我的想法:

最困难的事情是如何获得与张量中非零位置对应的RDF-triple的坐标。首先,这是一个包含所有实体的列表:

T = ['A1',...,'An','T1',...'Tn','NBA']

对于数据集中的每个 RDF-triple (Subject_i, Predicate_k, Object_j),都有一个坐标 (i,j,k) 描述 X_ijk = 1 在张量中的位置。例如,现有的 RDF-triple (A_i, play for, T_i) 的坐标是 (5, 1, 13),这意味着在第一个切片矩阵中 X(5,13) = 1。但是,我不知道如何获得这个坐标。我应该使用字典来存储三元组吗?

我对 Python 不是很熟悉,我已经尝试过解决方案,但我不知道如何解决它。任何帮助将不胜感激。

编辑:为了简洁和可读性,我删除了 RDF 的描述。

4

2 回答 2

1

pythons rdf 的最佳库工具是rdflib一个 rdflib 图有一个方法

lst = myGraph.subject_objects(MyNS.race_for)
# which is just syntactic sugar for:
lst = myGraph.triples((None,MyNS.race_for,None))

您还可以在其他语言(如 Java-jena 等)的其他库中找到第二种语法

在 scipy 中,您应该调用 sparse 并将其用于稀疏二进制数组。

查看 numpy 包,了解从三元组查询返回的“分解”主题和对象的最佳方法。应该很简单。pandas中有用于此的库,但我的猜测是您将拥有大型稀疏矩阵,并且使用scipy.sparse模块会更好。

于 2012-07-12T20:20:59.970 回答
1

解决您的问题有很多可能性,但您的问题中存在更大的矛盾心理。更精确地表述它,展示你想要得到的东西以及为什么,并展示你迄今为止尝试过的东西。

最好解释一下为什么需要 n 级张量以及为什么另一种表示不适合您的需求,而不是解释 rdf 是什么。

如果您需要张量操作,则使用张量才有意义。如果是这样,你应该看看numpy如果不是,你应该考虑其他解决方案。如果您想保留创建对象的顺序,字典可能不是您要查找的。也许集合中的 OrderedDict (python >= 2.7) 是您正在寻找的。但也许集合中的 namedtuple 也会这样做。

于 2012-07-12T14:53:24.367 回答