Owlready2 を Colaboratory と Ubuntu で利用する

本記事では、Owlready2 をお手軽に利用できる Google Colaboratory 環境と、アプリ開発での利用を想定したローカルマシン環境(Ubntu 20.04 LTS)で利用するための手順を見ていきます。

【目次】

[1]はじめに



Owlready2 を利用すると、OWL(Web Ontology Language)をはじめとするセマンティックウェブ系の技術を手軽に扱えるだけでなく、Python で活発に開発されているモダンなツール/ライブラリとの連携も可能になると思います。

加えて、一般的なアプリ開発においてもセマンティックウェブ系の技術を利用する敷居を下げてくれるものだと思っています。

そこで本記事では、Owlready2 をお手軽に利用できる Google Colaboratory 環境と、アプリ開発での利用を想定したローカルマシン環境(Ubntu 20.04 LTS)で利用するための手順を見ていきます。

[2]Google Colaboratory で使ってみる

Owlready2 をお手軽に利用するには、個人的には Google Colaboratory がお勧めです。
特に、既存のオントロジーにアクセスして、分析や実験をするような用途には最適だと思います。これは機械学習系のライブラリを試すのと同じような感覚です。

利用手順はとても簡単です。

まず、Owlready2をpipコマンドでインストールします。
!pip install owlready2

あとは、以下のように Owlready2 パッケージをインポートするだけで、Owlready2 を使ったプログラミングが可能です。
from owlready2 import *

このように簡単に Owlready2 が利用できるのは、Colaboratory が以下のような環境が整った仮想マシンを提供してくれているからです。
  • Java 環境が組み込まれている。
    • Owlready2は、OWL Reasoner として、HermiTと Pellet が内蔵されています。これらはJavaで実装されているため、実行するには Java環境 が必要ですが、Colaboratory の仮想マシンには Java 環境が組み込まれているため、JDK/JRE のインストールは不要です。
  • Cython 環境が組み込まれている。
    • Owlready2は、OWLファイルのロード高速化のため、Cython を利用したパーサーを提供していますが、これを利用する環境が組み込まれています。

動作確認については[4]を参考にしてください。

(参考)Cython

本記事では Cython については割愛しますが、リンクだけ記載しておきます。

[3]Ubuntu 上に開発/実行環境を作る

OWL データの分析などには Google Colaboratory がとても便利だと思いますが、Colaboratory が不向きな場合もあります。

例えば、以下のような場合です。
  • 大規模オントロジーを扱う場合。
  • アプリ制作など、まとまった量のコードを書く場合。
    • 特に細かいデバッグを行いたい場合など。
  • 他のコンポーネントと連携して動作させる場合など。

そこで、ローカルマシンの Ubuntu 20.04 LTS 上に、Python 仮想環境として venv を使った Owlready2 の開発/実行環境を構築することにします。

ここでは、Cython や Java などのベースとなる環境を組み込んだ後、venv 環境で Owlready2 を利用します。

(1)Python の基本的なコンポーネントのインストール

本記事では、Python 本体は、Ubuntu 20.04 LTS にプリインストールされているものを利用します。

Pythonのバージョンは、シェルから以下のコマンドで確認できます。
python3 -V

私の環境では、「Python 3.8.10」と表示されました。

PyPIのOwlready2のメタデータの項を見ると「Requires: Python >=3.6」となっているので、条件は満たしています。

それではインストールを始めます。

まず、インストールが成功することを祈念して、大切な呪文を唱えます(笑)。
sudo apt update

続いて、パッケージ python3-pip をインストールします。
sudo apt install python3-pip
Owlready2 は、Cython モジュールを含んでいるため、Owlready2 のインストール時に C言語のビルド環境が必要なのですが、python3-pip パッケージをインストールすると、build-essential(ビルド関係)や python3-dev (Python.h 他)のパッケージもインストールされますので、とても便利です。

(2)Java のインストール

オブジェクト指向を中心としたモデリングと、OWLを中心としたモデリングを考えたとき、その違いを私が一番意識するのは推論に関するところです。

Owlready2 は、HermiT と Pellet を利用した推論が可能です(Pellet を利用した SWRL のルール実行も可能です)。

Owlready2 には、HermiT と Pellet が内蔵されているので、これらを個別にインストールする必要はありませんが、HermiT と Pellet は Java 言語で実装されているため、実行には Java 実行環境が必要です。

推論を利用しない場合は Java 環境は必要ありませんが、これを利用しないのはもったいないので、JDK/JRE もインストールしておきます。

(セマンティックウェブ系のツールは Java で実装されているものが多いため、その意味でも JDK/JRE をインストールしておくとよいと思います。)

お好みで JDK か JRE をインストールします。

インストール手順(JRE)
sudo apt install default-jre

インストール手順(JDK)
sudo apt install default-jdk

(参考)
JDK / JRE がない環境で、推論を実行(sync_reasoner メソッドの呼び出しなど)を行うと、以下のようなエラーになります。
>>> sync_reasoner()
* Owlready2 * Running HermiT...

~中略~
FileNotFoundError: [Errno 2] No such file or directory: 'java'


(3)Python 仮想環境(venv)のインストール

本記事では、venv による仮想環境を利用することにします。

以下のコマンドで、venv 環境を作るために必要なコンポーネントをインストールすることができます。(このパッケージをインストールしただけで venv の仮想環境が作成されるわけではありません。)

sudo apt install python3-venv

(参考)
Python アプリ開発をローカルマシンで行う場合の流儀?というかスタイルはいろいろあるようですが、一例として、Google のドキュメントの設定をリンクしておきます。

(4)venv 仮想環境の作成と有効化

venv を使ったアプリ開発のプロジェクトレイアウトにもいろいろあると思いますが、ここでは、Python の Webアプリケーションフレームワークである Flask のドキュメントにある構成をもとにしてみます。


この場合、アプリ開発用のプロジェクトディレクトリを作成して、 その下に仮想環境 venv (ディレクトリ)を作成します。

具体的には、プロジェクトディレクトリを「myproject」とすると、以下のようにして venv の仮想環境を作成します。
mkdir myproject
cd myproject
python3 -m venv venv

これで myproject ディレクトリの下に venv ディレクトリが作成されていると思います。

ただし、これだけでは仮想環境の準備をしただけで、仮想環境が有効になっているわけではありません。

以下のコマンドを実行して仮想環境を「有効化」します。
. venv/bin/activate

  • このブログの記載では見えにくいと思いますが、行頭にドット(コマンド)があることに注意してください。activate はスクリプトです。よって上記コマンドは「source venv/bin/activate」に置き換えても問題ありません。

activate を実行すると、プロンプトの先頭に (venv) と表示されると思います。これにより、仮想環境が有効になっているかどうかが簡単に分かります。

これまでの手順では、OSにインストールされている Python を python3 コマンドで実行してきましたが、venv を有効化すると、python コマンドや pip コマンドの実行は仮想環境内に閉じた形で動作します。

具体的には、venv が有効になっている状態で pip コマンドで Python のパッケージをインストールすると、基本的には venv 以下のディレクトリにインストールされるようになります。

これにより、OSレベルの Python や他の venv 環境に影響を与えないようにパッケージを利用することができます。(逆に言えば、venv 環境ごとに必要なパッケージをインストールする必要があります。)

(参考)VSCode での venv 環境の確認

Python の開発に利用できるエディタはいろいろありますが、私が利用している Visual Studio Code について、Python 環境の確認方法についてメモしておきます。

Visual Studio Code が認識している Python 環境は、画面右下に表示されています。(Python 拡張機能をインストールしている場合)

VSCode でPython環境を確認

ここで、バージョンが表示されている領域にマウスを持っていくと、python のパスが表示されます。

もし意図した環境とは異なる場合は、バージョンの表示領域をクリックすると「インタープリターを選択」が表示されますので、ここで切り替えることができます。

(5)venv 仮想環境に Owlready2 をインストール

作成した venv 環境が有効になっている状態で、まず、以下のコマンドを実行しておきます。これを行う理由は(補足1)を参照して下さい。
pip install wheel

続いて、Cython パッケージをインストールします。(補足2
pip install cython

最後に、目的の Owlready2 をインストールします。
pip install owlready2

これで Owlready2 を利用する準備が整いました。

動作確認については[4]を参考にしてください。

(補足1)error: invalid command 'bdist_wheel'

私の環境では「pip install wheel」を実行せず、「pip install cython」と「pip install owlready2」を実行すると、以下のように「error: invalid command 'bdist_wheel'」が表示されました。しかし、最後のメッセージは成功となっています。

Building wheels for collected packages: owlready2
  Building wheel for owlready2 (setup.py) ... error
  ERROR: Command errored out with exit status 1:

~中略~
  
  error: invalid command 'bdist_wheel'
  ----------------------------------------
  ERROR: Failed building wheel for owlready2
  Running setup.py clean for owlready2
Failed to build owlready2
Installing collected packages: owlready2
    Running setup.py install for owlready2 ... done
Successfully installed owlready2-0.37

この状態でも Owlready2 の動作は問題ないように見えました。

しかし気持ち悪いので、このエラーについてネットで検索するといろいろと情報があり、「pip install wheel」とすると回避できそうでした。実際、「pip install wheel」を実行してからインストールするとエラーが無くなりました。

(補足2)Cython パッケージをインストールしない(できない)場合

Owlready2のドキュメントには以下のように書かれています。
  • Owlready2 include an optimized Cython module. This module speeds up by about 20% the loading of large ontologies, but its use is entirely optional. To build this module, you need a C compiler, and to install the ‘cython’ Python package.

つまり Cython を利用して大規模オントロジーのロードを高速にしているのですが、これはオプショナルとなっています。

Cython を利用するには C 言語のコンパイル環境が必要ですが(今回の手順では python3-pip をインストールすることで対応していますが)、状況によっては利用できない場合もあるかもしれません。

また、大規模オントロジーには高速なロードは重要ですが、(大きさの程度は難しいですが)大規模ではない(小さな)オントロジーを扱う場合は、体感的な差を感じない場合もあります。

もし、Cython 環境の利用がネックになるような場合は、Cython をインストールせず(「pip install cython」を実行しない)、「pip install owlready2」を実行して Owlready2 をインストールします。

Cython をインストールせず、Owlready2 のみインストールした場合、owlready2 パッケージをインポートすると以下の警告が表示されます。
* Owlready2 * Warning: optimized Cython parser module 'owlready2_optimized' is not available, defaulting to slower Python implementation

しかし、最適化された Cython パーサが利用できないだけで、(ロード速度以外の)機能落ちはありません。

もし大規模なオントロジを扱わない(ロード時間が問題にならない)なら、Cython 無しで Owlready2 を利用するのもアリだと思います。

[4]People Ontology を使って推論動作を確認してみる

インストールした Owlready2 が、OWL ファイルをロードして推論が正しく行えるかを確認します。

Owlready2 のサイトにあるコードや、『Pythonでオントロジー指向プログラミング(Ontologies with Python: Programming OWL 2.0 Ontologies with Python and Owlready2)』で紹介した本の内容の動作を確認するのが一番良いと思いますが、せっかくなので少し違ったもので試してみようと思いました。

そこで、一般公開されているもので、推論の動作が確認できるサンプルオントロジーはないかな?と探した結果、「People Ontology」という面白いオントロジーを見つけましたので、今回はこれを利用します。(同様のものは、オントロジエディタ Protégé の「Open from URL...」メニューからも参照できます。)
今回は上記ページから参照されているオントロジーをロードして、個体「Daily_Mirror」が「tabloid」クラスに属することが推論されることを確認します。
  • (参考)
    • 本記事では割愛しますが、興味がある方は上記サイトの中ほどにある「Instance Inferences/The Daily Mirror is a Tabloid」の項にある「Show Explanation」ボタンをクリックすると、今回の推論についての説明が表示されますので参考にしてください。
    • また、その他の推論内容の説明に加えて、オントロジに登場する「White Van Man」に関するコメント(英国文化?)もあります。

今回は(長くなるので)動作確認と割り切って、オントロジ内容やコードの意味は割愛します。

それでは、動作確認をします。
  • Colaboratory環境
    • 以下の内容をセルに入力して実行してください。
  • Ubuntu 環境の場合
    • venv 環境で python コマンドを実行してインタープリタを起動します。そして「>>>」に続いて以下の内容を入力して実行してください。

① Owlready をインポートします。

from owlready2 import *

②オントロジをネットからダウンロードします。

onto = get_ontology("http://syllabus.cs.manchester.ac.uk/pgt/2021/COMP62342/owl-examples/people.owl").load()

これでダウンロードしたオントロジに onto 変数でアクセスできます。

③ オントロジのIRIを確認してみます。

onto.base_iri

結果は「http://owl.cs.manchester.ac.uk/2009/07/sssw/people#」と表示されると思います。
(Owlready2 は自動的にセパレータを決定して、IRIの最後に「#」か「/」を追加します。)

④ 個体 Daily_Mirror が特定のクラスに所属していないことを確認します。

onto.Daily_Mirror.is_a

この段階ではオントロジーをロードしただけで推論を実行していないため、結果は [owl.Thing] と表示されると思います。(元OWLファイルには個体 Daily_Mirror が Thing で定義されています。)

ざっくりとしたもので大変恐縮ですが、少し補足します。

個体(Individual)とは、ざっくり言えば、Python や Java でいうところのオブジェクトインスタンスです。

OWLのエンティティはIRIで識別しますので、個体 Daily_Mirror もIRI(http://owl.cs.manchester.ac.uk/2009/07/sssw/people#Daily_Mirror)で識別します。

このIRIは、先のオントロジーの base_iri に Daily_Mirror を繋げたものです。

これを Owlready2 では、Pythonのオブジェクトを扱うのと同様に、「onto.Daily_Mirror」と表現できます。(オブジェクトの後にドットを書いて属性を指定するのと同じです。)

結果、「onto.Daily_Mirror」で(http://owl.cs.manchester.ac.uk/2009/07/sssw/people#Daily_Mirror)の個体オブジェクトが得られます。

また、個体オブジェクトは、所属するクラスを表す「is_a」プロパティを持っていますので、「onto.Daily_Mirror.is_a」で Daily_Mirror が所属するクラスを取得できます。

なお、結果に表示される owl.Thing は全ての個体の集合を表すもので、ざっくり言えば、Python の object、Java の Object のようなものです。

⑤ 推論を実行します。

sync_reasoner()

⑥ 個体 Daily_Mirror が「tabloid」クラスに属することを確認します。

onto.Daily_Mirror.is_a

結果は [people.tabloid] と表示されると思います。

想定通り、個体 Daily_Mirror が tabloid クラスに属することが推論されました。

⑦ (おまけ?)個体 Daily_Mirror と tabloid クラスのコメントを表示してみます。

推論とは関係ありませんが、今回利用した個体 Daily_Mirror とクラス tabloid は、元OWLファイル内にコメントがついています。それぞれの comment プロパティを表示してみます。

onto.Daily_Mirror.comment

['The paper read by Mick.'] と表示されます。

onto.tabloid.comment

['A newspaper. Tabloids are usually thought of as more "down-market" than broadsheets.'] と表示されます。

(2022/04/27追記)
同様の推論をオントロジーエディタ Protégé を使って実行した結果を、記事『オントロジーエディタ Protégé を使ってみる』に書きました。よろしければ参考にしてください。

コメント

このブログの人気の投稿

マイナンバーカードの電子証明書(公的個人認証サービス)にJava APIでアクセスする

Google Document AIで画像から表形式データを抽出する(Vision API OCRとの違い)

Vagrantfileの仮想マシン設定項目とVirtualBoxの設定画面の対応