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
要素の内容を目的語とするという変換です。
Title | Author | Place | Year |
---|---|---|---|
The Original Scotch | Brander, Michael | London | 1974 |
A Guide to Scotch Whisky | Brander, Michael | Edinburgh | 1975 |
例えば上のテーブルから、例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を結びつけ、日本語もプロパティとして利用できるようにしてみます(日本語ウェブ・オントロジーの試み参照)。
書籍名 | 著者 | 出版社 | 出版年 | 書籍コード |
---|---|---|---|---|
モルトウイスキー大全 改訂版 | 土屋守 | 小学館 | 2002 | ISBN:409387364X |
ウイスキー銘酒事典 | 橋口孝司 | 新星出版社 | 2000 | ISBN:4405096635 |
スコッチ三昧(新潮選書) | 土屋守 | 新潮社 | 2000 | ISBN:4106005905 |
ブレンデッドスコッチ大全 | 土屋守 | 小学館 | 1999 | ISBN:4093872244 |
ワインと洋酒のこぼれ話 | 藤本義一 | 第三書館 | 1999 | ISBN:4807499173 |
ウイスキーシンフォニー琥珀色への誘ない | 嶋谷幸雄 | たる出版 | 1998 | ISBN: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を生成することができます。
head要素からのメタデータ抽出
XHTMLのtitle
、meta
、link
といった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
に変換してnext
はrdfs: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から異なる条件で書籍リストを抽出することができます。
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など)を抽出するという点で共通するいくつかのアプローチが見つかりました。
ダン・コノリーのHyperRDFは、
profile
属性やlink
要素を使って、例えばc:Ruleというclass
属性を持つdl
要素では、dt
要素とdd
要素が dt ⇒ ddという推論関係にあることなどを示せるようにします。a
要素ではrel
属性の値をプロパティとして用いる例も示されています。[HyperRDF]- シーン・B・パーマーのXSLT XHTML to RDF Extractorは、XHTML文書の
link
要素やmeta
要素に加えてa
要素なども素材として、文書と関連する情報のメタデータをRDFとして書き出します。[RDFEXT] オントロジーを構築、利用するシステムであるOntbrokerでは、
a
要素の拡張属性onto
によって文書内部にメタデータを埋め込むHTML-Aという言語が提案されています。[SWPORTAL]span
要素のclass
属性でプロパティを表すというアプローチは、Edd DumbillによるXML.comの記事The Semantic Web: A Primerでも取り上げられていました。[SWPORTAL]HTML文書にRDFのメタデータを埋め込む方法の可能性と問題点については、Sean B. PalmerがRDF in HTML: Approachesにおいて詳しく論じています。[RDF-HTML]
RDDLをXHTMLの拡張なしに埋め込む方法として、
profile
属性、rel
属性を用いるアイデアThe "namespace" HTML ProfileがSandro Hawkeによって示されています。いろいろ応用の利く方法だと思います[RDDLPROF]。これを拡張したのが、rdf-in-xhtmlプロファイルを使うGRDDLです。
X/HTMLをそのまま使って(あるいは少し属性を拡張して)通常のコンテンツ作成をそのままメタデータ提供につなげるというアプローチとは別に
- HTMLを大きく拡張して、本文に加えて独自のタグセットによるメタ情報を加えていくSHOEプロジェクト[SHOE]
- オリジナル文書に手を加えず、XPointerを使って文書の特定領域を指定して、注釈をRDFの形で加えていくAnnoteaプロジェクト[ANNOTEA]
といった試みもあります。これらは、いずれ稿を改めて紹介するつもりです。
参照文献
- [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]
- Associating Style Sheets with XML documents Version 1.0, , W3C Recommendation ,
- <http://www.w3.org/TR/xml-stylesheet/>
- [MEDIA-META]
- 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]
- 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]
- RDF: Inkling - an RDF SquishQL implementation, ,
- <http://ilrt.org/discovery/2001/07/inkling/>
- [HyperRDF]
- HyperRDF: Using XHTML Authoring Tools with XSLT to produce RDF Schemas, , Revision: 1.34 ,
- <http://www.w3.org/2000/07/hs78/>
- [RDFEXT]
- XSLT XHTML to RDF Extractor, ,
- <http://www.mysterylights.com/xhtmltordf/>
- [SWPORTAL]
- Semantic Community Web Portals, , 9th International WWW Conference paper ,
- <http://www9.org/w9cdrom/134/134.html>
- [SWPRIMER]
- The Semantic Web: A Primer, , XML.com article ,
- <http://www.xml.com/pub/a/2000/11/01/semantwebic/>
- [RDF-HTML]
- RDF in HTML: Approaches, ,
- <http://infomesh.net/2002/rdfinhtml/>
- [GRDDL]
- Gleaning Resource Descriptions from Dialects of Languages (GRDDL), , W3C Coordination Group Note ,
- <http://www.w3.org/TR/grddl/>
- [GRDDL-DEMO]
- Demonstration of GRDDL applied to XML, ,
- <http://www.w3.org/2004/01/rdxh/grddl-xml-demo>
- [GRDDL-BG]
- GRDDL Background: Design History and Rationale, , Revision: 1.6 ,
- <http://www.w3.org/2004/01/rdxh/specbg.html>
- [RDDLPROF]
- 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/>