XHTMLからメタデータを自動抽出する

セマンティック・ウェブを実現する上で大きな鍵になるのが、どうやってメタデータを余計な負荷なしに提供してもらうかという方法論です。XHTMLで構造的な要素タイプ、class属性、id属性を適切に使用していれば、XSLTでここからメタデータを変換・抽出することが可能です。これを共通オントロジーと結びつければ、わざわざコンテンツと別にメタデータを用意しなくても、通常のコンテンツ制作がそのままセマンティック・ウェブの基礎になってくれるのです。

セマンティック・ウェブの関門:メタデータの収集

セマンティック・ウェブの実現のためには、マシンに理解可能な形でメタデータが十分提供されなければなりません。ウェブ上には数え切れない情報が存在しますが、そのほとんどは人間向けです。しかし、コンテンツの制作者が人間向けの(HTMLの)ページと合わせてメタデータを(RDFで)用意してくれることを望むのは、無理があります。それに、たとえメタデータが提供されても、それを本体と合わせて確実にメンテナンスするのはなかなか大変です。

メタデータに基づいた世界規模のデータベースがつくられ、セマンティック・ウェブの力が認識されれば、誰もがメタデータを提供するようになるかも知れません。しかし、そのためには、データベースができなければならず、そのためには正確なメタデータが提供されなければならず…と鶏と卵の関係が続きます。いかにして、コンテンツ作者の負担にならない形でメタデータを容易に確実に記述するか。これがセマンティック・ウェブへのひとつの関門となるでしょう。

当分の間は、人間が読むためのコンテンツ作成が中心でしょうから、それならコンテンツ中にマシンが理解できるメタデータを埋め込んでしまうのが早道です。そして、あまりあてにならない「スクリーン・スクレイピング(screen scraping:HTMLからニュースヘッドラインなどの情報を取り出す手法)」ではなく、X/HTMLから意味を抽出する汎用的なルールがあれば、これは最も確実で、かつ効果的なメタデータ提供の手段となり得るはずです。

XSLTとXHTMLのclass属性を活用する

より標準的で厳密なアプローチとして、「Metadata in XHTML - XSLTによる抽出」をまとめましたので、合わせてご覧下さい。

HTML/XHTMLの大部分の要素タイプにはclass属性を記述でき、作者が個々の要素に独自の定義を与えることができます。ただし、この意味は共有されたものではなく、あくまでその作者にとっての分類に過ぎません。class="date"と記述したところで、エージェントがそれを日付であると理解できるわけではないのです。

しかし、これをDublin Core[WordNet]のような共通語彙を定義したオントロジーと結びつけることができれば、"date"が日付であることは明確になります。個人的な定義であるclass属性が、マシンに理解可能なメタデータの基礎として機能するのです。

たとえば次のようなXHTMLの断片があるとします。

[例1] <p id="c01" class="Concert"><span class="title">シュトゥットガルト放送響来日公演</span>が<span class="date">2001-11-16</span>に行われた。</p>

これに、次の簡単なXSLTのテンプレートを適用してみます(rdf:dc:wn:h:はそれぞれRDF、Dublin Core、WordNet、XHTMLの名前空間に結びつけられているものとします)。

[例2]

<xsl:template match="h:p">
 <xsl:element name="wn:{@class}">
  <xsl:attribute name="rdf:ID"><xsl:value-of select="@id"/></xsl:attribute>
  <xsl:apply-templates select="h:span[@class]"/>
 </xsl:element>
</xsl:template>

<xsl:template match="h:span[@class]">
 <xsl:element name="dc:{@class}"><xsl:value-of select="."/></xsl:element>
</xsl:template>

この結果、次のようなRDFのメタデータ(の断片)が得られました。

[例3]

<wn:Concert rdf:ID="c01">
 <dc:title>シュトゥットガルト放送響来日公演</dc:title>
 <dc:date>2001-11-16</dc:date>
</wn:Concert>

p要素に設定したclass属性は、WordNetの語彙と結びついたクラス(型付きノード)となり、そこにspan要素のclass属性を、Dublin Coreの語彙と結びつけたプロパティとして表現しています(プロパティもDublin Coreでなく例5のようにWordNetに結びつければ、より汎用的にその演奏会の指揮者、オーケストラ、曲目なども表現可能になります)。演奏会情報サイトや個人の演奏会記録などで適用すれば、なかなか面白いメタデータが集まるのではないでしょうか。もちろん、p要素のclass属性を他の値にして、さまざまな情報を表現することが可能です。

この方法のポイントは、いったんXSLTを定義すれば、普通にXHTMLを書くだけでそのままメタデータが提供できるというところです。コンテンツに手を加えた時に、別途メタデータを編集する必要もありません。また、これらのclass属性は、CSSと組み合わせてページの視覚表現にも使えるので一石二鳥です。

〔補足〕もちろん、XSLTはHTMLには適用できないので、コンテンツはXHTMLで書かれていなければなりません。XHTMLへの移行のメリットが見えないとよく言われますが、セマンティック・ウェブへの第一歩は、XHTML化によって踏み出すことができるのです。従来のHTMLで書かれたページは、いったんW3Cのtidyなどで変換処理を行えば、ある程度XSLT適用が可能になります。

a要素を使ったリソースとしての目的語

上記のspan要素によるメタデータは、目的語をリテラルとして扱うことになるため、行き止まりのRDFしか生成することができません。ここで、a要素によってリンクされているリソースを目的語とすれば、RDF本来のリソースの連鎖を生み出すことができます。

[例4] <p id="c01" class="Concert"><a href="http://www.kanzaki.com/norrington/" class="conductor">ロジャー・ノリントン</a>率いる<span class="title">シュトゥットガルト放送響来日公演</span>が<span class="date">2001-11-16</span>に行われた。</p>

例1に少し手を加え、指揮者についての情報を追加するとともに、その指揮者の詳細情報がハイパーリンクで提供されているというパラグラフを考えます。単なるリテラルではない、リンクを持つ目的語の場合は、次のようなメタデータを生成することができるでしょう。

[例5]

<wn:Concert rdf:ID="c01">
 <wn:conductor
   rdf:resource="http://www.kanzaki.com/norrington/"
   rdfs:label="ロジャー・ノリントン"/>
 <wn:title>シュトゥットガルト放送響来日公演</wn:title>
 <wn:date>2001-11-16</wn:date>
</wn:Concert>

例2のスタイルシートに簡単なテンプレートを追加するだけで、こうしたリソース型のメタデータを表現することも可能です(ここでは、語彙をより一般的にするために、dc:ではなくwn:の名前空間に変更しています)。a要素の場合は、後述するlink要素と同様、rel属性を用いてプロパティを示すという方法もあります。

WordNetのRDFはクラスとして定義され、名前も大文字で始まっているので、厳密にはそのままプロパティに使うのはふさわしくないと思いますが、この点についてはもう少し研究します。

クラス名を特定の語彙に結びつけるために、最初からclass="dc:title"という接頭辞を加えてしまう手もあります。この場合、Dublin Coreで提案されているように、link要素を用いて

[例5b] <link rel="schema.dc" href="http://purl.org/dc/elements/1.1/" />

という具合に、dcという接頭辞とDC名前空間を結びつけておくとより分かりやすくなるでしょう。

メタデータ用XSLTの存在を知らせる

メタデータ用XSLTを明示する方法については、GRDDLの項目を参照してください。以下は、以前に考えていたもので、実際に機能する可能性のあまりない方法です。

メタ情報を抽出するスタイルシートを用意したら、それをエージェントに知らせて利用してもらう必要があります。一般にXMLのスタイルシートはxml-stylesheet処理命令で示すことができる([XMLSTYLE])のでこれを用いればいいわけですが、画面表示のスタイルではなくメタデータ提供用だということも明示したいところ。ひとつのアイデアとしては、次のようにmedia属性を使ってみる手がありそうです。

[例6] <?xml-stylesheet href="metastyle.xsl" type="text/xsl" media="meta"?>

media属性はHTMLのlink要素の定義に準じることになっているので、今のところ勝手にmetaという値を記述しても効果はありません。しかし、同じくlink要素で外部メタデータを参照する時にrel="meta"と記述する方法が提案されていることから、このmedia属性値も受け入れられる可能性があるのではないかと考えています[MEDIA-META]

なお、XHTML文書をtext/htmlとして提供している時はこの処理命令は通常のブラウザには影響を与えませんが、application/xhtml+xmlである場合は、原則として視覚ブラウザもこの処理命令でスタイルシートを適用することになります。ここでの混乱を避けるためには、alternate="yes"も合わせて指定する方がいいかも知れません。

より汎用的なアプローチ

XSLTによるメタデータ抽出の方法をより一般化し、XHTMLの構造そのものからメタデータを取り出す汎用的な手法を検討してみます。

テーブルデータの変換:th要素の内容を使う

XHTMLコンテンツの中でメタデータとして利用しやすいものとして、テーブルを挙げることができるでしょう。多くの企業サイトでは、製品紹介ページにスペックを記載したテーブルが掲載されています。これらから簡単にメタデータを抽出できれば、エージェントによる情報収集は飛躍的に進むはずです。

一番分かりやすい方法は、テーブルのth要素の内容をプロパティとして、対応するtd要素の内容を目的語とするという変換です。

Table 1: Whisky books
TitleAuthorPlaceYear
The Original ScotchBrander, MichaelLondon1974
A Guide to Scotch WhiskyBrander, MichaelEdinburgh1975

例えば上のテーブルから、例2を少し複雑にしたXSLTスタイルシート(サンプルXSLT参照)を使って次のようなメタデータを生成することができます。

[例7]

<rdf:RDF
  xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
  xmlns:wn="http://xmlns.com/wordnet/1.6/">
 <rdf:Description>
  <wn:title>The Original Scotch</wn:title>
  <wn:author>Brander, Michael</wn:author>
  <wn:place>London</wn:place>
  <wn:year>1974</wn:year>
 </rdf:Description>
 <rdf:Description>
  <wn:title>A Guide to Scotch Whisky</wn:title>
  <wn:author>Brander, Michael</wn:author>
  <wn:place>Edinburgh</wn:place>
  <wn:year>1975</wn:year>
 </rdf:Description>
</rdf:RDF>

span要素でclass属性を指定する代わりに、th要素の内容をrdf:Description要素のプロパティ要素名として使おうという訳です。ここで、それぞれのプロパティをwn:で修飾しているところに注目してください。データ的にはただの文字列でしかない見出し語句を、WordNetの語彙として扱うことで概念のツリーの中に位置づけ、エージェントが意味を推論できるようにしています。

日本語のプロパティ名

th要素の内容をプロパティとして扱うのは、最も手軽で既存のテーブルにも応用しやすいですが、日本語の項目名の場合はWordNetの語彙をプロパティとして利用することができません。そこで、公開されている和英辞書(EDICT)を使って日本語単語とWordNetを結びつけ、日本語もプロパティとして利用できるようにしてみます(日本語ウェブ・オントロジーの試み参照)。

Table 2: ウイスキーを知るための書籍(日本編)
書籍名著者出版社出版年書籍コード
モルトウイスキー大全 改訂版土屋守小学館2002ISBN:409387364X
ウイスキー銘酒事典橋口孝司新星出版社2000ISBN:4405096635
スコッチ三昧(新潮選書)土屋守新潮社2000ISBN:4106005905
ブレンデッドスコッチ大全土屋守小学館1999ISBN:4093872244
ワインと洋酒のこぼれ話藤本義一第三書館1999ISBN:4807499173
ウイスキーシンフォニー琥珀色への誘ない嶋谷幸雄たる出版1998ISBN:4924713511

このテーブルから、th要素をそのままプロパティとしてメタデータを抽出してみると、次のような具合になります。ここで、jp:は試験的な日本語ウェブ・オントロジーの名前空間を指します。

[例8]

<rdf:Description>
 <jp:書籍名>モルトウイスキー大全 改訂版</jp:書籍名>
 <jp:著者>土屋守</jp:著者>
 <jp:出版社>小学館</jp:出版社>
 <jp:出版年>2002</jp:出版年>
 <jp:書籍コード>ISBN:409387364X</jp:書籍コード>
</rdf:Description>
...

この日本語ウェブ・オントロジーは、たとえば"jp:著者"というプロパティwn:Authorおよびwn:Writerと派生関係にあることを示します(WordNet語彙はプロパティではなくクラスなので、同等ではなくdc:relatedとしています)。そこからエージェントはWordNetのクラス階層をさかのぼってこのプロパティの意味を理解することが可能です。

テーブルでもclass属性を使ってみる

プロパティ名に日本語を使えるのは便利ですが、アプリケーションによってはこれをうまく処理できないかも知れません。このような場合には、それぞれのth要素にWordNetの語彙に従ったclass属性を指定し、プロパティ名に要素内容ではなくclass属性値を使うことで対応できます。もう少し意味的な関連を強めたければ、col要素を置いて、そこで列ごとにclass属性を指定してもいいでしょう。

Table2は、col要素を使ってそれぞれの列にtitle, author, publisher, date, identifierというclass属性も与えています。XSLTスタイルシートに少し手を加えれば、このclass属性を用いたメタデータの生成も可能です。

テーブル以外でも、定義リスト、ハイパーリンクなど、一定の規則で記述されるXHTML部分ならば同様なXSLTスタイルシートが設計できます。汎用的なスタイルシートを複数用意し、ケースに応じて使い分けると効果的でしょう。たとえば、このページ最後の参照文献リストから、各リソースを記述したRDFを生成することができます。

XHTMLのtitlemetalinkといったhead要素内に記述する各要素はその文書自身に関する情報ですから、これを抽出することで文書のメタデータを提供することができます。基本的な戦略としては、大まかに:

  • 文書自身についてのデータなので、rdf:Description要素の主語はrdf:about=""(あるいはファイルのURI)とする
  • title要素の内容は、dc:titleのリテラル目的語とする
  • meta要素のname属性とcontent属性のペアで示されるデータは、リテラル目的語として扱う
  • link要素はhref属性で示されるURIを使ってリソース目的語とする

という方法が考えられるでしょう。たとえば、次のような要素がhead要素内に含まれている場合

[例9]

<head>
 <title>XHTMLからメタデータを自動抽出する</title>
 <meta name="author" content="神崎正英" />
 <link rel="next" href="detail.html" />
 ...
</head>

簡単なXSLTで文書のメタデータを抽出できます。

[例10]

<rdf:Description rdf:about="">
 <dc:title>XHTMLからメタデータを自動抽出する</dc:title>
 <wn:author>神崎正英</wn:author>
 <xhtml:next rdf:resource="detail.html"/>
</rdf:Description>

rdf:resourceの値に相対URIを使うべきではないので、この場合はルートのrdf:RDF要素でxml:base属性を使って元のXHTMLファイルのURIを指定しておきます。また、XSLTに少し条件分岐を加えれば、name属性値がauthorのときはプロパティをdc:creatorとするといった精密化も可能です。link要素については、(最初rdfs:seeAlsoに変換してnextrdfs:labelとしていましたが)XHTMLのリンクタイプは良く知られた関係でありプロパティと見なせるので、そのままプロパティ要素としました。

文書自身しか主語にできないので応用範囲は限定されますが、別途RDFをわざわざ用意しなくても簡単に書誌データを提供できるという意味では、便利な方法だと思います。

XHTMLの拡張によるメタデータ埋め込み

XHTMLを使う時に、特定のバージョンに厳密適合する必要がなければ、文書型宣言をせず、名前空間を使って異なる語彙を組み込んでしまうことができます。XHTMLにメタデータを埋め込むには、これがもっともシンプルで分かりやすいかも知れません。この方法については、実験的な議論であるXHTMLを拡張し、メタデータを直接記述するを参照してください。

メタデータと検索

こうやって抽出したRDFのメタデータから、特定の条件でリソースを絞り込んで表示することもできます。メタデータを専門に収集するロボットとデータベースがあれば、そこに対してプロパティを指定したクエリを行うことで、現在のサーチエンジンよりはるかに的確な検索が可能になります。つまり、単純に「山崎」というキーワードで検索するのではなく、人名(あるいは地名、製品名など)というプロパティを指定してクエリを送ることで、無駄なヒットをあらかじめ除外することができるわけです。

RDFを対象にできる問い合わせ言語はいくつか開発されていますが、ここではHP LabのAndy Seaborneによる[RDQL]を使った検索を行ってみましょう。クエリのWHERE句に検索するRDFのトリプルを(s, p, o)の形で、AND句にフィルタ条件を記述します。?で始まるトークンは変数です。

[例11]

SELECT ?title, ?author, ?year, ?isbn
FROM  <http://www.kanzaki.com/courier/lxt/docs/sw/xh2meta.html?tbl-col-meta>
WHERE
 (?x, <wn:title>, ?title),
 (?x, <wn:author>, ?author),
 (?x, <wn:date>, ?year),
 (?x, <wn:identifier>, ?isbn)
AND ?year >= 2000
USING wn for <http://xmlns.com/wordnet/1.6/>

ANDによるフィルタ部分を変更すると、Table2から異なる条件で書籍リストを抽出することができます。

AND ?year      

Libby Millerの[SquishQL]では、RDFトリプルを(p s o)の形で記述します。上記のRDQLのクエリは、SquishQLなら次のようになります。

[例12]

SELECT ?title, ?author, ?year, ?isbn
FROM http://www.kanzaki.com/courier/lxt/docs/sw/xh2meta.html?tbl-col-meta
WHERE 
  (wn::title ?x ?title) 
  (wn::author ?x ?author) 
  (wn::date ?x ?year) 
  (wn::identifier ?x ?isbn) 
AND ?year >= 2000
USING wn FOR http://xmlns.com/wordnet/1.6/

上記のサンプルクエリをSQUISH queriesのページのフォームに貼り付けて実行すると、テーブルから抽出したメタデータのうち、出版年が2000年以降であるものについて、そのタイトル、著者、出版年、ISBNを表示させることができます(ただしSQUISH queriesでは日本語が文字化けしてしまいます)。

汎用抽出法GRDDL

XSLTなどを使ってXHTMLからメタデータを抽出する汎用ルールを定めようという動きが2003年後半に活発になり、Gleaning Resource Descriptions from Dialects of Languages [GRDDL]としてまとめられつつあります。これは、ここまで述べてきたような方法を、XHTMLのプロファイル指定とlinkタイプによって具体的な抽出アルゴリズム(XSLTスタイルシート)に結びつけ、エージェントがRDFを生成できるようにしようというものです。

これを実現するためには、まずXHTMLのhead要素に"data-view"プロファイルを指定します。

[例13] <head profile="http://www.w3.org/2003/g/data-view">

このプロフィルは、特別なリンクタイプtransformationを定めており、rel属性にこのリンクタイプ、href属性にRDF抽出用XSLTのURIを記述したlink要素をhead用その中に加えてやります。たとえば次のXSLTは、RFC2731の方法でXHTMLに埋め込んだDublin Coreのmeta要素からRDFを生成するものです。

[例14]

<link rel="transformation"
       href="http://www.w3.org/2000/06/dc-extract/dc-extract.xsl" />

このlink要素は、FOAF抽出用、CCライセンス抽出用など、複数を列挙することもできます。また、href属性で指定するアルゴリズムは、利用アプリケーション(エージェント)が理解・対応していれば、XSLT以外のスクリプトなどでも構いません。

※GRDDLはhtml要素のプロファイルURIに一定の方法でXSLTを示す記述があれば、そのプロファイルを加えるだけでXHTMLからメタデータを抽出してくれるようになりました。メモ「rel="nofollow"ほかメタデータのプロファイル」を参照してください。

このアイデアをまとめるにあたっていろいろ調べていると、人間向けのコンテンツ(HTML)からセマンティックなメタ情報(RDFなど)を抽出するという点で共通するいくつかのアプローチが見つかりました。

X/HTMLをそのまま使って(あるいは少し属性を拡張して)通常のコンテンツ作成をそのままメタデータ提供につなげるというアプローチとは別に

といった試みもあります。これらは、いずれ稿を改めて紹介するつもりです。

参照文献

[WordNet]
George A. Miller, et al., WordNet - a lexical database for the English language, , Cognitive Science Laboratory at Princeton University
<http://www.cogsci.princeton.edu/~wn/>
[XMLSTYLE]
James Clark, Associating Style Sheets with XML documents Version 1.0, , W3C Recommendation
<http://www.w3.org/TR/xml-stylesheet/>
[MEDIA-META]
Masahide Kanzaki, Extracting RDF from XHTML table with XSLT, , W3C www-rdf-interest mailing list
<http://lists.w3.org/Archives/Public/www-rdf-interest/2002Sep/0076.html>
[RDQL]
Andy Seaborne, RDQL - A Data Oriented Query Language for RDF Models, HP Lab, The jena semantic web toolkit
<http://www.hpl.hp.com/semweb/rdql.html>
[SquishQL]
Libby Miller, RDF: Inkling - an RDF SquishQL implementation,
<http://ilrt.org/discovery/2001/07/inkling/>
[HyperRDF]
Dan Connolly, HyperRDF: Using XHTML Authoring Tools with XSLT to produce RDF Schemas, , Revision: 1.34
<http://www.w3.org/2000/07/hs78/>
[RDFEXT]
Sean B. Palmer, XSLT XHTML to RDF Extractor,
<http://www.mysterylights.com/xhtmltordf/>
[SWPORTAL]
S.Staab, J.Angele, S.Decker, et al., Semantic Community Web Portals, , 9th International WWW Conference paper
<http://www9.org/w9cdrom/134/134.html>
[SWPRIMER]
Edd Dumbill, The Semantic Web: A Primer, , XML.com article
<http://www.xml.com/pub/a/2000/11/01/semantwebic/>
[RDF-HTML]
Sean B. Palmer, RDF in HTML: Approaches,
<http://infomesh.net/2002/rdfinhtml/>
[GRDDL]
Dominique Haza鼠-Massieux, Dan Connolly, Gleaning Resource Descriptions from Dialects of Languages (GRDDL), , W3C Coordination Group Note
<http://www.w3.org/TR/grddl/>
[GRDDL-DEMO]
Dominique Haza鼠-Massieux, Demonstration of GRDDL applied to XML,
<http://www.w3.org/2004/01/rdxh/grddl-xml-demo>
[GRDDL-BG]
Dan Connolly, GRDDL Background: Design History and Rationale, , Revision: 1.6
<http://www.w3.org/2004/01/rdxh/specbg.html>
[RDDLPROF]
Sandro Hawke, The "namespace" HTML Profile,
<http://www.w3.org/2002/12/namespace>
[SHOE]
SHOE - Simple HTML Ontology Extensions, Parallel Understanding Systems Group, Department of Computer Science, University of Maryland
<http://www.cs.umd.edu/projects/plus/SHOE/>
[ANNOTEA]
W3C Semantic Web Activity, Annotea Project
<http://www.w3.org/2001/Annotea/>