ちょっとしたメモ

RSSのtaxonomyモジュール

巷で話題の朝日新聞のRSSを見ると、taxonomyモジュールの名前空間が宣言してある。この、名前は比較的知られている(かな?)のに使用例がほとんど無い珍しいモジュールは、チャンネルのアイテムを分類するために使うものだ。dc:subjectと似ているが、taxonomyではキーワードを文字列ではなくURIで示す。Asahi.comでは宣言だけでまだ実際に使われているわけではないけれど、「総合」「国際」などのジャンル目次ページのURIをRSSで提供する計画だったりして?

taxonomyモジュールでは、taxo:topicsという要素を使って、item(あるいはchannelでもいい)のトピックを列挙する。

(例)

<rdf:RDF xmlns="http://purl.org/rss/1.0/"
 xmlns:dc="http://purl.org/dc/elements/1.1/"
 xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
 xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/">
...
 <item rdf:about='http://www.kanzaki.com/memo/2004/02/28-1'>
  <title>セマンティック・ウェブ Phase 2</title>
  ...
  <taxo:topics>
   <rdf:Bag>
    <rdf:li rdf:resource="http://www.kanzaki.com/ns/topic#web.framework.rdf"/>
    <rdf:li rdf:resource="http://www.kanzaki.com/ns/topic#web.framework.owl"/>
   </rdf:Bag>
  </taxo:topics>
 </item>
 ...
</rdf:RDF>

RSSチャンネルのトピックを、items要素とrdf:Seq要素を使って列挙するのと似ている(トピックには順序はないので、rdf:Bagを用いる)。この例では、先日紹介したこのサイトの独自シソーラスのコンセプトURIを分類に使っているが、ジャンルごとのホームページがあれば、そのURIを記述してもいいだろう。あるいは、ジャンルを広く共有するなら、WordNetのクラス、Wikipedia、はてなキーワードのページなどをポイントするのもいいかも知れない。モジュール仕様文書の例では、Meerkatやdmozのディレクトリを使っている。

taxonomyモジュールには、そのトピックを(同じ文書内で)定義するためのtaxo:topicが用意されている。

(例)

 <taxo:topic rdf:about="http://www.kanzaki.com/ns/topic#web.framework.rdf">
  <taxo:link>http://www.kanzaki.com/memo/web/framework/rdf</taxo:link>
  <dc:title>Resource Description Framework</taxo:title>
  <dc:description>...</dc:description>
 </taxo:topic>

taxo:linkはモジュール仕様できちんと定義されておらず、厳密な用法がはっきりしないが、「taxo:topicrss:channelと同じような意味を持つ」という説明があるので、channelrdf:aboutlinkの関係と同じと捉えてよさそうだ。もっとも、taxo:topicはオプションだから、他の文書でトピック(コンセプト)を定義していたら、わざわざRSS内に記述しなくてもよい。同じRSS内に書いておけば、これらを理解するRSSリーダーが(あったとして)その説明をポップアップなどで利用してくれるかも知れないが。

このtaxonomyモジュールをうまく活用している例としては、XMLfr.comが挙げられる。このサイトの提供するRSSは、各itemtaxo:topicsを含んでおり、そのURIはXMLfr.comの分野別インデックスを示す。Eric van der Vlistは、この仕組みを解説したBring Metadata Back to RSSという記事でXML Topicmapとの連動の可能性も示唆しており、興味深い。

ページの分類やジャンルは、Dublin Coredc:subjectに記述することが多いだろう。これは広く使われている語彙で理解してくれるRSSリーダーも多いから便利なのだが、一般にはリテラル文字列のキーワードとして用いるので、トピックの定義や関連するホームページを示すことができない(dc:subjectでURIを示す利用例もときどき見かけるのだが、dc:creatorの場合と同じで、定義が曖昧なためにうまく働かない可能性がある)。URIであれば、異なるサイト/ページのトピックを示す共通項として、少なくともfoaf:interestと同程度には機能しそうだ。

taxonomyモジュールの難点は、これがRDFのコンテナモデル(rdf:Bag)を採用しているというところかな。RSS 1.0の仕様が、過去との互換性のためにトップレベル要素内で同じ要素の反復を認めなかった(One restriction imposed on sub-elements of top-level channel, image, item, and textinput elements is that these elements may not contain repeating sub-elements)のがその要因なのだが、このモデルは余計な手間が増える割に、トピックとして示すURIとtaxo:topicsプロパティが別々のトリプルになってしまって扱いにくい。トピックを示す目的には(この古い制約は忘れて)もっとシンプルにfoaf:topicを列挙して使った方が分かりやすいとも言える。

taxonomyモジュールでもfoaf:topicでもどちらでもいいので、コンテンツのトピックをURIに結びつけると面白くなると思うのだけれど、RSSやBlogツール作者のみなさん、検討しないかな。

〔余談〕Googleでtaxonomy名前空間を宣言しているページを検索すると1万件以上がヒットする。ところが、実際にtopicsが記述されているRSSは、ほとんど見つからない。これは、XML::RSSあたりを使うと、自動的にこの名前空間が含まれるのだろう、たぶん。Asahi.comも、ジャンルページの活用を目指しているわけではなく、たまたまこうしたツールを利用しているだけという線が濃厚だけど、ちょっとした考察の機会を与えてくれたので感謝しつつ、今後の展開に期待。

関連メモ:
map - genre: rss. at