はじめに
複数の異種ソースに含まれるデータを全体的に統合して利用すること、そこにセマンティックWebの基本的な考え方があります。RDF/RDFSやSPARQLクエリ言語などのセマンティックWebテクノロジーを用いて異種ソースのデータを統合して利用するという方法には、標準的なリレーショナルデータベースを用いる方法と比べていくつかのメリットがあります。
Resource Description Framework(RDF)では述語(predicate)でデータオブジェクト間の関係を定義し、RDFで記述したRDFスキーマ(RDFS)によって知識表現とオントロジーを開発するためのモデリング言語を提供します(補足説明:「セマンティックWebにおけるRDF/RDFSの位置づけ」を参照)。これらのテクノロジーを組み合わせて用いることで、フォーマット/スキーマの異なる複数の異種ソースに含まれる情報を、リレーショナルデータベースのときのように「標準フォーマット」に変換しなくても、そのまま利用することが可能です。
本稿ではJava開発者を対象に、JavaとJRubyによるセマンティックWebアプリケーションの開発について紹介します。セマンティックWebの機能を具体的にどう利用するか示すため、あるサンプルアプリケーションでニュース記事を処理し、業界用語と人および場所の名前を特定して(RDFリポジトリに)保存します。RDFストレージとRDFS推論、それにSPARQLクエリの実行に関する部分についてはSesameライブラリを利用し、Sesameを使うための簡単なラッパーAPIと、サンプルのRDFデータに対するサンプルクエリが本稿のサンプルソース内に含まれています。
セマンティックWebはソフトウェアシステムでの自動処理を想定しているため、RDFとしてエンコードされます。RDFで情報をエンコードすることで、データフォーマットを変換しなくてもさまざまなRDFエンコーディングのデータをRDFSで簡単に利用できます。
しかし、ここに根本的な問題が生じます。セマンティックWebのデータを公開する人は誰もが、データを格納するための独自のRDFスキーマを自由に作成します。例えば、ニュース記事、医療文書、株価データ、顧客プロファイル、その他さまざまなデータについて、標準となるRDFスキーマの定義なるものは存在しません。
セマンティックWebに対してRDFが取った設計上の選択は、さまざまなRDFスキーマを用いて作成されたデータは(普通は存在しないような)標準フォーマットに変換しなくても利用できなければならないということであり、上述の問題の意味を知ることはRDFの設計概念の理解を深めるのに役立ちます。
RDFSはWeb Ontology Language(OWL)によってさらに拡張され、より一層表現力のあるモデリングおよびオントロジー開発のための言語が提供されます(OWLとオントロジー開発の話題は本稿の範囲を超えますが、筆者が2004年にニュース記事のモデリングのために開発したオントロジーが参考になるでしょう。ここでモデリングのためにOWLを使用しています)。
準備
セマンティックWebテクノロジーを利用するためのライブラリやフレームワークは、さまざまなプログラミング言語にいくつもあります。しかし、本稿では紙面の都合上、私の好みを優先してSesameライブラリというツールを使うことにします。Sesameについては、いずれ時間を取ってAPI、システム構成、および詳細な解説に目を通すことをお勧めしますが、本稿に関する限りサンプルソースだけ押さえておけば十分です。このソースコードはSesameを使うためのラッパーAPIであり、そこでサンプルの実行に必要なSesameを初めとするすべてのライブラリがインクルードされます。このソースコードの具体的な内容は次のとおりです。
- サンプルのJavaおよびJRubyプログラムに必要なものをすべて含む1つの大きなJARファイル
- ロイター(Reuters)の何件かのニュース記事から抜粋した未加工のテキストファイル
- ユーティリティ「ruby_utilities/raw_data_to_rdf.rb」によって生成されたRDFデータファイル(ユーティリティ「raw_data_to_rdf.rb」は、サンプルのニュース記事からセマンティック情報を抽出し、サンプルプログラムで使用されるデータファイルにRDFトリプルを書き込む)
- より可読性の高いN3フォーマットで記述されたRDF
- JRubyによるサンプルプログラム
- 実験用のRDFデータ
サンプルプログラムはいずれもデュアルライセンスで提供されます。上述のサンプルソースは、LGPLライセンスもしくはApache 2ライセンスのもとで使用できます。Sesame自体と、そこで必要とされるライブラリは、BSDスタイルのライセンスとLGPLライセンスのもとで提供されます。
本稿の例では、目的語の値としてURIと文字列リテラルの2つのデータ型を使用します。RDFは当初は、XMLデータファイルとして表現されていました。XMLフォーマットは自動処理のために今も広く使われていますが、この例では可読性がずっと高く理解しやすいことから、2つの代替フォーマットとしてN-TriplesとNotation3(N3)を使用します。Sesameを使えば、すべてのRDFフォーマットの間での変換が可能なので、より可読性が高く理解しやすいフォーマットを使わない理由はありません。
RDFデータは、次の3つの値の組(トリプル)で構成されます。
- 主語(subject)
- 述語(predicate)
- 目的語(object)
本稿のコンテキストでは、トリプルで次のようなデータを表します。
- 主語: ニュース記事のURL(またはURI)
- 述語: 「containsCity」(都市を含む)のような関係
- 目的語: 「Burlington」(バーリントン)のような値
図1は、本稿のサンプルアプリケーションの概念図です。これが概念的であるというのは、Webスクレイピング用のコードを含んでいないからです。その代わり、ここでは数件のニュース記事から手作業でコピーしたテキスト(人の名前、場所の名前、重要語)をエンティティ抽出ユーティリティ「raw_data_to_rdf.rb」の入力として使用しています。図1に示すように、Rubyスクリプト「ruby_utilities/raw_data_to_rdf.rb」とファイル「rdf_files/news.nt」が作成されると、その後はJavaおよびJRuby用のラッパーAPIによってSesameのみを使えば済みます。このラッパーライブラリでは、N-Tripleデータをより使いやすいN3フォーマットに変換できます(後ほど、N3の例もいくつか示します)。
本稿の例に基づいて完全な本番システムを構築するためには、選出したいくつかのニュースWebサイトをWebスクレイプするRubyスクリプトを作成する必要があります。これらのスクリプトを書くのは難しくありませんが、広告やナビゲーションHTMLのようなものを無視する一般的なWebスクレイパーを書くのは簡単でありません。この話題は本稿の範囲を超えます。
このシステムを簡略化し、RDF/RDFSの使用にのみ注意を集中するため、ニュース記事がRailsアプリケーションディレクトリ内の「raw_data」ディレクトリに存在するものと仮定し、Webサイト固有のWebスクレイピングコードは提供しないものとします。このディレクトリには、テスト用の4件のロイターニュース記事があります。これらのファイルを他の情報ソースのデータ(ワープロ文書、PDFファイル、データベースなど)と置き換えてもかまいません。ユーティリティ「ruby_utilities/raw_data_to_rdf.rb」は、ディレクトリ「raw_data」内のデータを読み取り、ロイターのOpenCalais Webサービスを使用して各記事からエンティティを検索し、RDFトリプルデータをファイル「rdf_files/news.nt」に書き出します。OpenCalais Webサービスは、無料で使用できます(1日最大20KのWebサービスコールまで無料)。私は、自分の仕事のために、OpenCalaisと筆者独自のシステムの両方を使用してテキストから情報を抽出しています。