使用张量表示一对RDF三元组.如何使用Python对建模过程进行编程



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

场景:

RDF三元组用于表示关于资源、格式(主语、谓语、宾语)的简单语句。

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

第一谓词:play_for;n个三元组:(雷·艾伦,play_for,波士顿凯尔特人队),(科比,play_foer,湖人队)。。。简而言之,(A_i,play For,T_i)对于i=1到n。

第二谓词:race_fo;n个三元组:(波士顿凯尔特人队,race_fo,NBA总冠军),(湖人队,race-fo,NBA冠军)。。。简而言之,(T_i,种族,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三元组的坐标,该坐标对应于张量中非零的位置。首先,这里有一个包含所有实体的列表:

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

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

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

EDIT:为了简洁易读,我删除了RDF的描述。

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

与其解释rdf是什么,不如解释为什么你需要一个n级张量,以及为什么另一个表示不符合你的需求。

如果你需要张量运算,那么使用张量是有意义的。如果是这样,您应该研究numpy。如果不是,您应该考虑其他解决方案。如果您希望保留创建对象的顺序,则字典可能不是您要查找的。也许集合中的OrderedDict(python>=2.7)就是您想要的。但也许从收藏品中命名的双胞胎也能做到这一点。

Python最好的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中,您应该调用稀疏,并将其用于稀疏二进制数组。

查看numpy包,找到"分解"三元组查询返回的主题和对象的最佳方法。应该非常简单。Panda中有这样的库,但我猜您将拥有大型稀疏矩阵,最好使用scipy.sparse模块。

最新更新