使用张量表示两个RDF三元组。如何使用Python编程这个建模过程?

使用张量表示两个RDF三元组。如何使用Python编程这个建模过程?,python,string,rdf,triples,Python,String,Rdf,Triples,关于用张量表示两个RDF三元组的问题 情景: A用于表示有关资源、格式(主语、谓语、宾语)的简单语句 假设我有两个谓词,一个是play_for,另一个是race_for,每个谓词包含n个三元组,如下所示: 第一谓词:play_for;n个三元组: (雷·艾伦,为波士顿凯尔特人队效力),(科比·布莱恩特,为湖人队效力)。。。 简而言之,(A_i,play For,T_i)For i=1到n 第二谓词:race_for;n个三元组: (波士顿凯尔特人队,争夺NBA总冠军),(湖人队,争夺NBA总冠军

关于用张量表示两个RDF三元组的问题

情景:

A用于表示有关资源、格式(主语、谓语、宾语)的简单语句

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

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

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

张量表示是对2n三元组建模的一种方法。 我正在研究使用张量分解来发现数据集的潜在语义结构。第一步是用张量表示数据集

张量条目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三元组(主语i、谓语k、宾语j),都有一个坐标(i、j、k)来描述X_ijk=1在张量中的位置。例如,现有RDF三元组(a_i,play For,T_i)的坐标是(5,1,13),这意味着在第一个切片矩阵中X(5,13)=1。然而,我不知道如何得到这个坐标。我应该用字典来存储三元组吗

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


编辑:为了简洁易懂,我删除了对RDF的描述

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

与其解释什么是rdf,不如解释为什么需要n阶张量,以及为什么另一种表示法不适合你的需要


如果你需要张量运算,使用张量是有意义的。如果是的话,你应该研究一下,如果不是的话,你应该考虑另一个解决方案。如果希望保留创建对象的顺序,则词典可能不是您要查找的。也许您正在寻找的是OrderedDict from collections(python>=2.7)。但是,也许从集合中命名为tuple也可以做到这一点。

pythons用于rdf的最佳库工具是一个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包,了解将从triples查询返回的主题和对象“分解”的最佳方法。应该很简单。在中有用于此功能的库,但我猜您将拥有大型稀疏矩阵,并且使用此模块会更好。

我曾尝试使用rdflib和pandas来解决此问题,但我失败了,谢谢所有这些。这让我想起了HDT it工具。你应该通过看屏幕来了解这种关系