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 を返す |
※ TermList はprontoで定義されれているクラスで、詳しくは後述します。
※ rparents と rchildren について少し補足します。 rparents メソッドは parents メソッドの拡張版です。 parents メソッドは一世代上の親のみを返しましたが、 rparents ではさらにその親(親の親)やさらにその上の世代(親の親の親など)を返すメソッドです。デフォルト( level=1 )では、遡れる全ての親を返し、その途中に含まれる親も返します( intermediate=True )。 intermediate=False 最も上の世代の親のみが返されます。
TermListクラス
TermList はPythonの通常のlistとよく似ていますが、 TermList に含まれる用語の属性リストを作成できます。
例:
>>> nmr['NMR:1000031'].children.id ['NMR:1000122', 'NMR:1000156', 'NMR:1000157', 'NMR:1000489']
TermList クラスでは、 Term クラスがもつ全ての属性のリストを作成することが出来ます。
まとめ
prontoの Term クラスを使用すれば、用語についての情報と他の用語との親子関係を簡単に把握できるようになります。
prontoの機能としてはまだまだありますが、他の機能についてはまた機会があればまとめたいと思います。