タスクのフレームワーク内で論理的な結論を出すことができるプログラムは、技術的な奇跡とSkyNetの具体化のように見えるかもしれません。 しかし、以下でわかるように、セマンティックテクノロジーを使用する場合、今日このようなプログラムをPythonで作成することは難しくありません。 オントロジーの良い例-家系図-に焦点を当て、家系図の家族については、任意の複雑さの家族関係を導出できます(計算リソースによって制限されます)。 たとえば、下のロマノフ家系図には、ロシア皇帝ピーター2世のいとこいとこ(最初にいとこが2回削除された)が示されています。
したがって、実際にセマンティックWebの技術に精通したい場合は、猫にようこそ。ここでは、血統に
基づいて猫のトレーニング
を行います。
トリプレット、RDF、およびオントロジーについては、
ウィキペディアまたは
他の 投稿で読むことができます。 家系図の家族関係を説明するために、OWL 2 Family History Knowledge Base(
FHKB )
オントロジーを使用します。 FHKBの著者は、子孫を教育の良い例として認識していますが、今日の推論システムの計算の複雑さのために、実際の家系学アプリケーションでの使用にOWL 2を
推奨し
ないことに注意してください。 私たちのアプリケーションは教育的なままです:私たちは、最大100人の家族の小さな系図に自分自身を制限します。
系譜データは通常、
GEDCOM (
.ged )テキスト形式で入手できます。 一部の系図ポータルおよび血統プログラムでは、この形式でリンクグラフをアップロードできます。 Python言語の
同じ名前のライブラリを使用してGEDCOMを読み取り、FHKBオントロジーの個人のトリプレット(いわゆる
ABox )を生成します。 家族関係を導出するためのロジック(
TBox )が既にあり、このロジックを適用するデータを設定するだけです。
前述のロシア皇帝の家族を例として使用して、次の3人の個人(要約)のデータがあるとします。
I *-* I. I *-* II.
およびFHKBロジック:
*-* *-* *-*.
次に、推論システムは次の事実を確立できます。
I *-* II.
Turtle RDFの同じ情報は以下のとおりです。 コンパクトで読みやすいです:
fhkb:i1 a owl:NamedIndividual ; fhkb:isBrotherOf fhkb:i2 ; rdfs:label " I" . fhkb:i2 a owl:NamedIndividual ; fhkb:isFatherOf fhkb:i3 ; rdfs:label " I" . fhkb:i3 a owl:NamedIndividual ; rdfs:label " II" . fhkb:isFatherOf a owl:ObjectProperty ; rdfs:label "-" . fhkb:isBrotherOf a owl:ObjectProperty ; rdfs:label "-" . fhkb:isUncleOf a owl:ObjectProperty ; owl:propertyChainAxiom ( fhkb:isBrotherOf fhkb:isFatherOf ) ; rdfs:label "-" .
(注:明確にするためにここでは一部の詳細を省略しています。元のFHKBでは、論理的推論を最適化するために
isFatherOf 、
isBrotherOf 、および
isUncleOfのプロパティが多少異なって定義されています。)
そのため、個人
i1 、
i2 、および
i3 、プロパティ
isFatherOfおよび
isBrotherOfを設定し 、これらのプロパティを個人に割り当て、新しいプロパティ
isUncleOfを導入し
ました 。 接頭辞
rdfs :、
owl :および
fhkb :に注意してください-それらは知識の関与する領域を示しています。
rdfsプレフィックス:標準のRDFスキーマを指します(上記の例では、これはlabelプロパティです)。 フクロウ接頭辞:標準のオントロジー用語(個々、プロパティ、プロパティのシーケンスなど)を示します。 そして、接頭辞
fhkbは、使用する
FHKB系図オントロジーであり、関連する関係のロジックが定義されています(
isFatherOf 、
isBrotherOf 、
isUncleOf 、および他の用語
isGrandfatherOf 、
isFirstCousinOfなど)。
個人ごとに、GEDCOMから、父性(母性)、兄弟、姉妹、結婚に関する最小限の情報(実際、GEDCOMには他に何も含まれていません)、FHKBで与えられている他のすべての家族関係、システムから推論される情報のみを取得するだけで十分です推論。
したがって、この記事のリポジトリからTurtleファイル
header.ttlで論理ベース(TBox)を入手できます。 ロマノフ家の王族の系譜もGEDCOMに
存在しますが、読者は自分の興味を引くように勧められます。 GEDCOMファイルからFHKBオントロジーの個人を生成するスクリプトは次の
とおりです:
gedcom2ttl.py 。 (リポジトリを複製した後、
pip install -r requirements.txtコマンドを使用してPython依存関係をインストールする必要があります。)FHKBロジック
header.ttlを新しいファイルにコピーし、スクリプトの結果を追加します。
cp data/header.ttl romanov_family.ttl ./gedcom2ttl.py data/tsars.ged >> romanov_family.ttl
その結果、Turtle形式のオントロジー(TBox + ABox)を取得しました。これは、任意の外部エディター(
Protégéなど )で開くことができます。 必要に応じて、
ttl2owl.pyスクリプトを使用して
TurtleをOWL XML形式に変換できます。 現在、このオントロジーにおける親族関係の導出は技術の問題です。 オープンソースPython言語用の3つの最新の推論システム、
RDFClosure 、
FuXi、および
owlcppラッパーを
使用した Fact ++を
知っています。 実際、Java仮想マシンを使用してPythonを「友達にする」場合、それらの多くが存在します(歴史的に、Javaはセマンティックテクノロジーのリーダーであり、はるかに多くのツールセットを提供します)。 上記の3つは、複雑さと生産性の向上に基づいています。 1つ目は、考えられるすべてのトリプレットがブルートフォースによって生成される、単純な「ブルートフォース」アプローチです。 2番目(FuXi)は、OWLの挿入Python表記法と
Reteアルゴリズムに基づいてい
ます 。 3番目(Fact ++)は
、Tableauxアルゴリズムの低レベルで最適化された実装
です 。 一般的に、今日では最も効果的なオープンソース推論システムの1つです。 私たちのタスクでは、最初のシステム(RDFClosure)で十分です。特に、純粋なPythonで記述されており、簡単なpip installコマンドによってインストールされているためです。 ロマノフの系譜についての議論では、Intel Core i7 1.70GHzを搭載したラップトップでの
tsars.ged (41人の家族)RDFClosureには約10秒かかります。
すでに述べたように、血統に関するOWL 2の欠点は計算の複雑さです。 上の図で言及した親族関係の一部を省略し、ロマノフ家系図を王室の人とその最も近い親relativeに縮小しました。これにより、デモンストレーションの推論でコンピュータが過負荷にならないようにしました。 上記の図ですべての家族関係を設定し、家系図を少なくとも数百人の家族に拡大すると、RDFClosureは役に立たなくなります(ただし、Fact ++は引き続き機能します)。
上記で取得したオントロジーの推論を実行します。
./infer.py romanov_family.ttl
議論が進行している間に、
infer.pyスクリプトのキーポイントについて説明します。 その本質は6行に収まります。
import rdflib from RDFClosure import DeductiveClosure, OWLRL_Extension g = rdflib.Graph() g.parse("romanov_family.ttl", format="turtle") DeductiveClosure(OWLRL_Extension).expand(g) print g.serialize(format="turtle")
最初の2行では、RDFClosure推論システムとオントロジーとの相互運用性を提供するRDFLibライブラリをインポートします。 3行目と4行目-グラフを宣言し、オントロジ
romanov_family.ttlの内容を
入力します。 5行目は推論の始まりです。 この場合、それらは、OWL 2ルールに従った新しいトリプレットを備えた入力グラフの循環拡張にすぎません。第6-受信したグラフの印刷(同じTurtle形式)。
そのため、結果として
romanov_family.ttl.inferredを取得し
ました (ディスクサイズにより、入力ファイルよりも数倍大きくなります)。 視覚化のために準備しましょう。 D3.js JavaScriptライブラリーを使用して、ブラウザーで推測される家族関係のグラフを表示する単純なHTML5アプリケーション(
index.html )を作成しました。 この記事のリポジトリの
オンラインブランチで入手できます。 グラフの端は、GEDCOMから取得した情報(marriages、
isFatherOf 、
isMotherOf )に対応しており、派生メンバーは、家族を選択するときに異なる色で強調表示されます。 選択肢は、ホバーするか、タッチスクリーンに触れることです。 このアプリケーションのグラフは、非常に単純な構造を持つJSON形式で指定されています-頂点(個々)とそれらの間の接続(関係)を示すエッジのリスト。 前のステップで取得したオントロジーは、
ttl2json.pyスクリプトによってこのJSONに変換されます。
./ttl2json.py romanov_family.ttl.inferred > romanov_family.json
デフォルトでは、HTML5アプリケーションはJSONを
data / tsars.jsonにロードします。 生成した新しいJSONは、Webページ上のボタンをクリックするだけでブラウザーにダウンロードできます(サーバーなしのFile APIが使用され、視覚化はオフラインで機能します)。
上記のコマンドはすべて、シェルスクリプト
gedcom2json.shに収集されます。 これを使用すると、GEDCOMの系統を直接視覚化のために派生した家族関係を持つJSONに変換できます。 他の関連する関係の推論と視覚化の追加は比較的簡単です。 これを行うには、まず適切なロジックを
TBox FHKBに追加し、次に、新しい兄弟の識別子をTurtle-JSON
コンバーターttl2json.pyに追加し 、第三に、HTML5レンダリングコードで新しい兄弟の色、名前、および識別子を指定します。 もちろん、GEDCOMからJSONを生成する時間は多少長くなります。
さらに、(家系図だけでなく)オントロジーの入力データがマインドマップとして機能するという考えがあります。 もちろん、描画するときは、たとえばPython XMind SDKを使用してマップをABoxオントロジーに転送できるように、明確なルールに従う必要があります。 それが、たとえば、歴史的に知性カードの形をとっていた家系図の論理的な推論を始めた方法です。
要約すると、家族(兄弟姉妹、結婚、父母、母性)の最も近い家族関係のみを求め、残りの関係の論理を決定することで、セマンティックテクノロジーのおかげで他のすべての関係を推測することができました。 したがって、
Wolfram Alphaや
Googleナレッジグラフなどの製品の基礎となる強力なツールに触れました。 オントロジーと推論システムは成熟しており、今日広く使用されているテクノロジーですが、残念ながら、この領域に入るためのしきい値は決して低くはありません。
この記事のリポジトリへのリンク:
github.com/blokhin/genealogical-treesHTML5アプリ:
blokhin.imtqy.com/genealogical-trees/#ruパブリックGEDCOMファイルは、系譜ポータルからエクスポートできます。たとえば、
www.wikitree.comセマンティックテクノロジーに没頭し、Skynetが私たちを恐れないようにしましょう!