0

テンソルを使用していくつかのRDFトリプルを表現することについての質問。

シナリオ:

RDFトリプルは、リソース、フォーマット(主語、述語、目的語)に関する単純なステートメントを表現するために使用されます。

次のように、2つの述語があります。1つはplay_for、もう1つはrace_forで、それぞれにn個のトリプルが含まれています。

1番目の述語:play_for; nトリプル:(Ray Allen、play_for、Boston Celtics)、(Kobe Bryant、play_for、Lakers)、...略して、(A_i、play for、T_i)for i=1からn。

2番目の述語:race_for; nトリプル:(ボストンセルティックス、race_for、NBAチャンピオンシップ)、(レイカーズ、race_for、NBAチャンピオンシップ)、...略して、(T_i、レースフォー、NBA)for i=1からn。

テンソル表現は、この2nトリプルをモデル化する1つの方法です。テンソル分解を使用してデータセットの潜在意味構造を見つけるために、マクシミリアンニッケルの論文を研究しています。そして最初のステップは、テンソルを使用してデータセットを表現することです。

テンソルエントリ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)に対して、テンソル内のX_ijk = 1の位置を表す座標(i、j、k)があります。たとえば、既存のRDFトリプル(A_i、play for、T_i)の座標は(5、1、13)です。これは、最初のスライス行列でX(5,13)=1であることを意味します。しかし、この座標を取得する方法がわかりません。トリプルを保存するために辞書を使用する必要がありますか?

私はPythonにあまり詳しくなく、解決策を見つけようとしましたが、それを解決する方法がわかりません。どんな助けでも大歓迎です。

編集:簡潔さと読みやすさのために、RDFの説明を削除しました。

4

2 に答える 2

1

rdf 用の pythons の最適なライブラリ ツールは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 などの他の言語の他のライブラリにもある 2 番目の構文

scipy 内で sparse を呼び出し、それをスパース バイナリ配列に使用する必要があります。

トリプルクエリから返されるサブジェクトとオブジェクトを「因数分解」する最良の方法については、numpy パッケージを参照してください。かなり単純なはずです。パンダにはこれのためのライブラリがありますが、私の推測では、大きな疎行列があり、scipy.sparseモジュールを使用したほうがよいでしょう。

于 2012-07-12T20:20:59.970 に答える
1

あなたの問題を解決する可能性はたくさんありますが、あなたの質問にはさらに大きなアンビバレンスがあります。より正確に定式化して、何を取得したいのか、その理由を示し、これまでに試したことを示します。

rdf とは何かを説明する代わりに、なぜ n 年生の Tensor が必要なのか、および別の表現がニーズに合わない理由を説明した方がよかったでしょう。

テンソル操作が必要な場合、テンソルを使用することは理にかなっています。そうであれば、numpyを調べる必要があります。そうでない場合は、別の解決策を検討する必要があります。オブジェクトを作成した順序を保持したい場合、辞書は探しているものではないかもしれません。おそらく、コレクション (python >= 2.7) の OrderedDict が探しているものです。しかし、コレクションのnamedtupleでも同様に機能する可能性があります。

于 2012-07-12T14:53:24.367 に答える