schema.org

語意網基本的組成可以分成描述框架和知識本體,框架就是如 RDF 或是 N3 那樣的標準規範,我一開始看到 RDF 規範的時候其實就很納悶,說是語意網很重要的標準,怎麼一點語意的知識都沒有,後來才了解,它只是一個框架,知識是由其他地方來的,在語意網設計下的知識,可以把它分為語彙 (vocabulary) 和關係 (relation),舉例來說:相機有鏡頭,這句話之中就包含了三個語彙,分別是 相機鏡頭,相機和鏡頭都是屬於某個特定領域(相機、攝影這個領域)的語彙,會由該領域的人編撰它的相關知識,在這邊就先當他們代表某個物體,而 則是一個不同領域來的語彙,它同時也是代表一個關係,代表前者內包含後者,和相機有關的這種關係不勝枚舉,例如相機有關景窗、有快門、要裝底片、標價多少等等,W3C 有一套標準專門是用來制定這些詞彙的意義以及之間的關係,稱作 Web Ontology Language,簡稱為 OWL,應該會有人注意到它的縮寫字母順序不太對,我猜是故意取貓頭鷹的名稱來用的,因為在很多國家貓頭鷹是智慧的象徵。

OWL 要編寫起來其實很辛苦,因為即使只是一個很小很專門的領域,要把特定領域的所有語彙和他們之間的關係整理出來就很不容易了,若不是由有公信力的機構或專家背書,甚至也會被質疑這些知識的可靠度,而且 OWL 語言本身也是很複雜的 XML 語言,是複雜到不會想用純文字編輯軟體寫的程度,另外還有一個我也不想用純文字編輯器編輯的 XML 文件,叫做 XML Schema Definition(XSD),是用來定義 XML 文件格式的 XML 文件,兩者我都寧願用專門的編輯軟體來處理。

不過回來先只看語彙的部分,目前可以應用的語彙其來源上都不是 W3C,有名的像是 FOAF, Dublin Core,前者是用來描述人際關係的,FOAF 是 Friend Of A Friend 的意思,後者則是 1995 年的第一屆 Metadata Workshop 所制訂的,一整套通用性很高,專門用來描述電子資源的後設資料 (metadata) 語彙,W3C 的網站也有整理了不少現存 ontology 資源出來,不過有很多時候,即使只有語彙的定義就很有幫助了,像是 microformats 就是用了很多其他地方已經先定義好的語彙來讓結構化的資料值可以對應到不同的屬性上,而且現在的搜尋引擎不止支援 microformats 你也可以用 RDFa 來在網頁中加入結構化的語意資料,去年,三大搜尋引擎龍頭:Google, Yahoo, Bing 宣布了一個合作計畫叫 schema.org,制訂了非常多的語彙建議,像是文章、書、電影、電視、活動、聽眾、工作機會、醫療相關等等的主題都有,並且建議使用 HTML5 的 microdata 機制來內嵌在網頁內提供給搜尋引擎。

舉一個例子,以前介紹 microformats 時的範例:

<div class="hreview">
 <span><span class="rating">5</span> out of 5 stars</span>
 <h4 class="summary"><span class="item fn">Crepes on Cole</span> is awesome</h4>
 <span>Reviewer: <span class="reviewer fn">Tantek</span> - 
 <abbr class="dtreviewed" title="20050418T2300-0700">April 18, 2005</abbr></span>
 <blockquote class="description"><p>
  Crepes on Cole is one of the best little creperies in San Francisco.
  Excellent food and service. Plenty of tables in a variety of sizes 
  for parties large and small.  Window seating makes for excellent 
  people watching to/from the N-Judah which stops right outside.  
  I've had many fun social gatherings here, as well as gotten 
  plenty of work done thanks to neighborhood WiFi.
 </p></blockquote>
 <p>Visit date: <span>April 2005</span></p>
 <p>Food eaten: <span>Florentine crepe</span></p>
</div>

如果改成用 schema.org 建議的 microdata 寫法:

<div itempscope itemtype="http://schema.org/Review">
 <span><span itemprop="ratingValue">5</span> out of 5 stars</span>
 <h4 itemprop="itemReviewed" itemscope itemtype="http://schema.org/Book"><span itemprop="name">Crepes on Cole</span> is awesome</h4>
 <span itemprop="author" itemscope itemtype="http://schema.org/Person">Reviewer: <span itemprop="name">Tantek</span></span> - 
 <time itemprop="dateCreated" datetime="20050418T2300">April 18, 2005</time>
 <p itemprop="reviewBody">
  Crepes on Cole is one of the best little creperies in San Francisco.
  Excellent food and service. Plenty of tables in a variety of sizes 
  for parties large and small.  Window seating makes for excellent 
  people watching to/from the N-Judah which stops right outside.  
  I've had many fun social gatherings here, as well as gotten 
  plenty of work done thanks to neighborhood WiFi.
 </p>
 <p>Visit date: <time>April 2005</span></p>
 <p>Food eaten: <span>Florentine crepe</span></p>
</div>

用 microdata 的方法和 microformats 和 RDFa 兩種比起來,我覺得優點在:

  1. 使用的是標準,設計語意上確實描述資料的屬性來用,這是 microformats 無法辦到的,我覺得 microformats 是屬於過渡時期的規範,所以多要求了最大的相容性
  2. 撰寫起來也不會太複雜,且不要求使用 XHTML,這點則是相較於 RDFa,因為規範上,要使用 RDFa 來加註 metadata,是透過 XHTML 的擴充性達到的,如果是單純的 HTML 文件,其實是不能加入其他文件的標籤或屬性的
  3. 使用了 URI 的概念作為資料類別的值,用 URI 取代普通單純的類別值有兩個好處,一是在網路上他是絕對唯一,二是未來如果要和其他的標準、後設資料等接軌,或是有人要補上這些資訊的 OWL 文件,都不會是問題

基於這些優點,我現在也很推薦使用 schema.org 建議的格式化資料結構,然後我想說看看國內有沒有人用,發現清單上有個 食譜,就上 iCook 看看,結果發現有耶!

以下面這道食譜為例

丟進 Google 的結構化資料測試工具,會產生如下的分析結果(可以自己 試試看,看圖要看原始大小也沒比較方便):

這份結果可以很清楚的看到, Google 可以把 iCook 的食譜網頁的各項資訊包括菜名、作者、材料、步驟等都正確的抓出來。