2011年12月18日日曜日

AllegroGraphでSemantic Wikipediaを実装してみた

この記事は、Ariel Advent Calendar 2011 の17日目の記事です。

Semantic Wikipediaとは

Wikipediaに蓄積された多量の情報は、MediaWikiのWiki記法を用いて記述され ています。この記法は、人間が記述するのには適していますが、例えば機械に 意味を理解させるのには向いていません。実は、この問題は、もっと昔から、 さらに広い範囲で顕在化していました。つまりHTMLの問題です。

HTMLは、人間が記述したり、機械に読み取らせて、"機械的"に画面を構成する のには適していますが、その意味を機械に理解させるのには向いていません。 そこで考えられたのがSemantic Webというアイデアで、我々の意味理解の基盤 である論理言語を、メタ言語としてWebの世界に導入して、人間と機械とで"意 味"を共有しようという大きな目標が掲げられました。

このアイデアはWikipediaに対しても適用できます。例えば、もし、Wikipedia のデータベースが、人間と意味を共有しているなら、次のような質問に答える のは容易なはずです。

問: 広島県出身のテクノポップミュージシャンは?
答: Perfume

ところが、このような質問をWikipediaに問い合わせるのは現状では不可能です。 そこで、Semantic Webのアイデアを応用して作られたのが Semantic MediaWikiで、Wiki記法を厳密 化・構造化し、さらに既存の構文を適当に解釈することで、機械でも意味を理 解できるようにする拡張が加えられています。詳しく調べていないので正確で ないかも知れませんが、Semantic MediaWikiをWikipediaに導入すれば、上記し たような質問にも答えられる、Semantic Wikipediaを構築できるはずです。

この記事では、Semantic MediaWikiを使わず、AllegroGraphという永続グラフ データベースを利用して、一からSemantic Wikipediaを構築する手順と、 Semantic Wikipediaの意義について説明します。

AllegoGraphとは

実装の話に入る前にまず、AllegroGraphについて解説します。AllegroGraphは 公式には永続グラフデータベースと呼ばれていますが、より厳密に言えば、 AllegroGraphとは、トリプルストアに様々な優れた拡張を加えたデータベース と言えます。Semantic Webを勉強するにあたっては、後者の定義を利用したほ うが都合が良いでしょう。なぜなら、RDF・RDFS・OWLなどのSemantic Webに関 する重要な仕様は全て、トリプルの概念を基盤としているからです。グラフも トリプルの集合も本質的には同じですが、概念の粒度が異なりますので、分け て考えたほうが良いでしょう。

さらに厳密を期せば、トリプルストアという呼び方も正しくありません。トリ プルストアを言葉通り捉えれば、トリプルを格納(ストア)するものですが、 AllegroGraphは、トリプルを格納する機能に加えて、RDF・RDFS・OWLに基づく 推論機(RDF++ reasoner)や検索機能(SPARQL、Prolog)など、様々な重要な 機能が追加されているからです。ここで、推論機と検索機能について簡単に説 明します。

推論機とは、RDF・RDFS・OWLに基づいて、充足されるべきトリプルを自動的に 演繹する機能です。具体例を示します。OWLには、二つの対象が同じであること を宣言するowl:sameAsプロパティがありますが、このプロパティは、同じく OWLで推移律を満たすプロパティ(関係)であると言明(assert)されています。 例えば、

A owl:sameAs B
B owl:sameAs C

という二つのトリプルがあったとき、推論機はowl:sameAsが推移律を満たすプ ロパティであることを確認した上で、新しく

A owl:sameAs C

というトリプルを追加します。RDFS・OWLを使えば、他にも様々な言明が可能で すが、詳しくは仕様やAllegroGraphのドキュメントを参照してください。

検索機能には、SPARQLやPrologが挙げられますが、私はPrologを好んで使うの でこちらを紹介します。Allegro Common Lispに付属のProlog機能は、 AllegroGraphと統合して利用することが可能で、例えば次のようなクエリを書 くことができます。

;; ミケとポチを飼っている人を取得
(select ?x
  (q- ?x !rdf:type !ex:Human)
  (q- ?x !ex:has-pet !ex:Mike)
  (q- ?x !ex:has-pet !ex:Pochi))

その他にもAllegroGraphには様々な機能がありますのでドキュメントを参照し てください。

Semantic Wikipediaの実装

前述したように、Semantic Wikipediaを作る上で最大の難関はいかに関係性を 抽出するかです。一番最初に思い付くのは、あるページとそのページに含まれ る全てのリンクについて、次のようなトリプルを追加することです。

w:黒澤明 w:links-to w:七人の侍

w:links-toプロパティについてはOWLのinverseOfプロパティで逆プロパティを 定義しておくと便利でしょう。当然ながらAllegroGraphの推論機が自動的に推 論してくれます。

w:linked-by owl:inverseOf w:links-to

例えば、以下のようなクエリを発行すれば、

(select ?link (q !w:黒沢明 !w:links-to ?link))
;; 以下も同様
(select ?link (q ?link !w:linked-by !w:黒沢明))

次のような結果が得られます。

("七人の侍" "用心棒" "姿三四郎" "生きる" "白痴" "椿三十郎" ...)

なお、カテゴリ・リンクもリンクとして処理されるので、以下のようなクエリも有効です。

(select ?x (q ?x !w:linked-by !w:日本の俳優))

次に思い付くのがInfoboxなどのテンプレートの情報を利用することです。人物 や作品に関するページには、ページの右側にその人物や作品に関する情報が記 載されています。例えばPerfumeの ページには次のような記載があります。

Perfume
基本情報
出身地    日本 広島県
ジャンル    テクノポップ
活動期間    2001年 -
レーベル    徳間ジャパン
事務所   アミューズ
共同作業者 中田ヤスタカ
影響  SPEED
公式サイト Perfume Official Site
メンバー
大本彩乃(のっち)
樫野有香(かしゆか)
西脇綾香(あ〜ちゃん)

このページのソースを見れば、この記載には次のようなテンプレートが使われ ているのが分かります。

{{Infobox Musician <!--Wikipedia:ウィキプロジェクト 音楽家を参照-->
| Name = Perfume
| Img =
| Img_capt = 左より[[樫野有香]]、[[大本彩乃]][[西脇綾香]]
| Img_size = <!-- サイズが250ピクセルに満たない場合のみ記入 -->
| Landscape = yes
| Background = group
| Origin = {{JPN}} [[広島県]]
| Genre = [[テクノポップ]]
| Years_active = [[2001年]] -
| Label = [[徳間ジャパンコミュニケーションズ|徳間ジャパン]]
| Production = [[アミューズ]]
| Associated_acts = [[中田ヤスタカ]]
| Influences = [[SPEED]]
| URL = [http://www.perfume-web.jp/ Perfume Official Site]
| Current_members = [[大本彩乃]](のっち)<br />[[樫野有香]](かしゆか)<br />[[西脇綾香]](あ〜ちゃん)
| Past_members = <!-- グループのみ -->
| Notable_instruments =
}}

これを解析することで、その主体に適当な属性を付与することが出来ます。

w:Perfume w:described-as w:Musician
w:Perfume w:Name Perfume
w:Perfume w:Origin w:広島県
w:Perfume w:Genre w:テクノポップ
w:Perfume w:Production w:アミューズ
w:Perfume w:Associated_acts w:中田ヤスタカ
w:Perfume w:Current_members w:大本彩乃
w:Perfume w:Current_members w:樫野有香
w:Perfume w:Current_members w:西脇綾香

なお、テンプレートの各引数の右辺にあらわれる文字列が、構造的に記述がさ れている場合があり、例えば 三船敏郎 の家族の項目は

| 家族 = 父:三船徳造<br />妻:吉峰幸子<br />長男:[[三船史郎]]<br />妾:[[喜多川美佳]]<br />娘:[[三船美佳]]<br />孫:三船力也

となっています。これを正しく解析できれば、

(select ?x (q !w:三船敏郎 !w:娘 ?x))
=> ?x = 三船美佳

のようなクエリも可能になります。

さらに、Wikipediaでは多数のエイリアスが定義されています。例えば、 アルコール飲料 のページを開くと、 のページの内容が表示されますが、クエリを書くにあたっても、"アルコール飲 料"と"酒"は区別したくありません。具体的には、

(select ?x
  (q ?x !w:described-as !w:作家)
  (q ?x !w:links-to !w:酒))

(select ?x 
  (q ?x !w:described-as !w:作家)
  (q ?x !w:links-to !w:アルコール飲料))

を区別したくありません。そこでOWLのsameAsプロパティを使って、二つが同じ であることを言明します。

w:酒 owl:sameAs w:アルコール飲料

このトリプルを追加しておけば、あとはAllegroGraphの推論機が良きに図らっ てくれます。

他に考慮すべき点と言えば、例えば、 黒沢明の作 品一覧をトリプルに落とし込めれば嬉しいと思いますが、この記述には、テン プレートと比べて一般的なテーブル記法が用いられているため、解析が難しい という問題があります。

また、OWLの積極的に利用することで、より厳密なモデル化が可能になるでしょ うが、今回は時間の関係でかなり端折っています。

以下に、AllegroGraphを利用して実際にSemantic Wikipediaを構築する手順を 示します。まだ、おもちゃのレベルなのであまり期待しないでください。なお Allegro Common Lisp、AllegroGraphともにFree editionが用意されているので 誰でも試すことは出来ると思います。

まず、以下のURLからリポジトリをcloneして、Quicklispでロードできるように してください。

https://github.com/m2ym/semantic-wikipedia

次にAllegro Common Lispを起動し、次のように入力します。

CL-USER> (ql:quickload :semantic-wikipedia)
CL-USER> (in-package :semantic-wikipedia)
SEMANTIC-WIKIPEDIA> (create-triple-store #p"~/tmp/wikipedia")
SEMANTIC-WIKIPEDIA> (apply-rdfs++-reasoner)

続いてWikipediaのダンプXMLから、必要なトリプルをAllegroStoreにロードす るように命令します。なおダンプXMLは http://dumps.wikimedia.org/jawiki/latest/ からダウンロードできます。

SEMANTIC-WIKIPEDIA> (load-wikipedia-xml #p"~/tmp/jawiki-latest-pages-articles.xml")

これには、かなり時間がかかります。また、膨大な数のトリプルをロードする ため、トリプル数に制限のあるAllegroGraphでは途中で失敗します。ロードで きなかった情報にこだわらなければ、次の作業にそのまま進むことができます。

トリプルをロードできたら、それらのトリプルのインデックスを生成します。

SEMANTIC-WIKIPEDIA> (index-all-triples)

これでSemantic Wikipediaの構築が完了しました。

Semantic Wikipediaの実験

それでは実際にいくつかのクエリを投げてみましょう。

広島県出身のテクノポップミュージシャンは?

(select ?x
  (q ?x !w:described-as !w:Musician)
  (q ?x !w:Origin !w:広島県)
  (q ?x !w:Genre !w:テクノポップ))
=> ("Perfume")

家族に俳優/女優のいる女性モデルは?

(select (?x ?y)
  (q ?x !w:家族 ?y)
  (q ?x !w:described-as !w:ActorActress)
  (q ?y !w:described-as !w:女性モデル))
=> (("三船敏郎" "三船美佳")
    ...)

1923年生まれで芥川賞を受賞した作家は?

(select ?x
  (q ?x !w:described-as !w:作家)
  (q ?x !w:birth_date !w:1923年)
  (q ?x !w:awards !w:芥川龍之介賞))
=> ("遠藤周作")

配偶者ともに同じ職業の夫婦は?

(select (?x ?y ?z)
  (q ?x !w:described-as ?z)
  (q ?y !w:described-as ?z)
  (q ?x !w:配偶者 ?y))
=> (("ニコール・キッドマン"
     "トム・クルーズ"
     "ActorActress")
    ("ブラット・ピット"
     "アンジェリーナ・ジョリー"
     "ActorActress")
    ("市村正親"
     "篠原涼子"
     "ActorActress")
    ("山口百恵"
     "三浦友和"
     "ActorActress")
    ...)

どういう経緯で結婚したか、大体想像が付きますね。

今後の課題

今後の課題としては、

  1. より多くのテンプレートの解釈
  2. テーブルやリストの解釈
  3. 厳密なオントロジーの構築
  4. 高速化

などが考えられます。地道にやりたいと思いますが、AllegroGraphのトリプル 数制限をすでに軽く越えているので、これより先に進める気がしません。どう したらいいのだろう…

Semantic Wikipediaの今後として、WikipediaがSemantic Webに近づいてくる可 能性もないとは言えませんが、これまでのHTMLの動向を見るに、Wikipediaが Semantic Webに対応するのは未来永劫ないでしょう。人力で支えられているシ ステムである以上、人に制約を課すというのはあまりうまくいかないと思いま す。それより、既存のシステムをいかにSemantic Webに対応させていくかが今 後重要になるでしょう。Wikipediaに関して言えば、自然言語処理などの技術が 必要になると思われます。

次回は永遠の王子、@nagai_masatoさんです。

0 件のコメント:

コメントを投稿