Pythonでprontoを使用してオントロジー解析を行う

Pythonを用いて、オントロジーファイルの用語抽出と、その用語の親子関係の把握を行いました。

使用パッケージ

pronto (python frontend to Ontologies) (Package Index, Github

prontoの他に RDFlib も使用パッケージの候補として考えましたが、prontoの方がシンプルで使いやすそうと感じたためprontoを選択肢ました。今後、prontoを使用していって機能不足を感じたらRDFlibの使用も考えます。

インストール

pipでのインストールに対応しています。(condaではインストール出来ませんでした。)

pip install pronto

使用法

データの読み込み

ローカルまたはweb上で公開されているオントロジーファイル(.owl, .ont, .obo)を読み込むことが可能です。ファイルは、prontoで定義されている ontology クラスとして読み込まれます。

import pronto
# ローカルファイルの読み込み
ont = pronto.Ontology('path/to/file.obo')

# web上のファイル読み込み
ont_web = pronto.Ontology('https://net.path.should/work/tooo.owl')

オントロジーの表示

読み込んだオントロジーはoboフォーマットとjsonフォーマットで表示させることが出来ます。

# オントロジーの取得(NMR controlled vocabulary)
nmr = pronto.Ontology('http://nmrml.org/cv/v1.1.0/nmrCV.owl')

print(nmr.obo)
print(nmr.json)

obo形式は以下のような、人の可読性の高い形式です。

[Term]
id: NMR:1000000
name: integer32
is_a: NMR:1000336 ! byte format

[Term]
id: NMR:1000001
name: sample number
def: "A reference number relevant to the sample under study." [MSI:NMR]
xref: value-type:xsd:string
is_a: NMR:1000548 ! sample attribute

用語の取得

オントロジーの用語は以下のように、IDを指定します。ここで得られる用語はprontoで指定されている Term クラスとして取得できます。

# 用語の取得
term = ont['REF:XXXXXXX']

Termクラス

Term クラスは以下の属性を持ちます。

属性 形式 説明
id str 用語のID (例: NMR:1000000)
name str 用語の名前
desc str 用語の説明
relations (optional) dict この用語と関係のある用語の辞書形式
other (optional) dict その他の情報
synonyms (optional) set 同義語

Term クラスは以下のメソッドを持ちます。

メソッド(引数) 説明
parents(self) 親関係にある用語の TermList を返す
children(self) 子関係にある用語の TermList を返す
obo(self) oboフォーマット(str形式)で表示
rparents(self, level=-1, intermediate=True) 親関係にある用語の再帰的な TermList を返す
rchildren(self, level=-1, intermediate=True 子関係にある用語の再規定な TermList を返す

TermListprontoで定義されれているクラスで、詳しくは後述します。

rparentsrchildren について少し補足します。 rparents メソッドは parents メソッドの拡張版です。 parents メソッドは一世代上の親のみを返しましたが、 rparents ではさらにその親(親の親)やさらにその上の世代(親の親の親など)を返すメソッドです。デフォルト( level=1 )では、遡れる全ての親を返し、その途中に含まれる親も返します( intermediate=True )。 intermediate=False 最も上の世代の親のみが返されます。

TermListクラス

TermListPythonの通常のlistとよく似ていますが、 TermList に含まれる用語の属性リストを作成できます。

例:

>>> nmr['NMR:1000031'].children.id
['NMR:1000122', 'NMR:1000156', 'NMR:1000157', 'NMR:1000489']

TermList クラスでは、 Term クラスがもつ全ての属性のリストを作成することが出来ます。

まとめ

prontoTerm クラスを使用すれば、用語についての情報と他の用語との親子関係を簡単に把握できるようになります。

prontoの機能としてはまだまだありますが、他の機能についてはまた機会があればまとめたいと思います。

参考

prontのPyPI prontのGithub RDFlibドキュメント