DIV CSS 佈局教程網

 DIV+CSS佈局教程網 >> 網頁腳本 >> XML學習教程 >> XML詳解 >> 新機器、XML 和歧義消除
新機器、XML 和歧義消除
編輯:XML詳解     

常用縮略詞

  CSS:層疊樣式表

  Html:超文本標記語言

  IT:信息技術

  XML:可擴展標記語言

  未實現的潛能

  隨著 Amazon Kindle™ 和 Apple® iPad 平板計算機(僅舉兩例)的問世,平板計算機最近獲得了許多關注。與桌面計算機相比,它們的便攜性和易用性使其具有從傳統印刷媒體那裡搶奪更多市場份額的潛力。但這樣的工具凸顯了文本的數字呈現中的一個弱點:它們的確在顯示文本方面表現出色,但仍停留在一個膚淺的水平上。

  人們針對視覺呈現做了大量工作。CSS 已解決許多與窗口修飾相關的問題:字體、間距、填充、背景,等等 — 所有視覺呈現元素。Html 和 JavaScript 使信息對人類讀者更直觀。

  但機器還有很多潛能沒有實現,其中包括超出當前人們的要求深入理解文本的含義。眾多需要解決的問題之一 — 至少在日常搜索和寫作領域中 — 就是消除歧義:真正的上下文是什麼?更重要的是,程序員如何用一種機器能夠使用的格式使其意識到該上下文?

  歧義消除問題

  歧義是 IT 中的一個著名問題。一組數據的含義可能是這個,也可能是那個。圖像解譯時也會出現問題。假設有一組像素,那麼這些像素組成什麼圖像,從人類認知角度看它們又像什麼?盡管文本提出的問題更加容易處理,且在 Natural Language Querying 和自動(但很不准確的)消除歧義的相關研究中引起一些注意,但通常呈現的文本仍然伴隨著一些需要解析的模糊性:作者的真實含義是什麼?

  仔細研究一下下面的簡單句子:

The cow jumped over the moon. 

對於人類讀者而言,這個句子(很可能)使其回憶起一個較早的歷史時期,那時,毫無意義的押韻是生活的一個重要組成部分。奶牛跳過地球的天然衛星是個 “好主意”,但可能性非常小。但這個句子也可能有其他含義。如果 cow 是 cow moose(母駝鹿)且 moon 是安大略省的 Moon River(或者,也許是一頭母水牛跳過湄公河的一條名稱相同的支流),那麼 “奶牛的跳躍” 就更有意義了。這個 “單詞串” 的真實含義是什麼呢?答案取決於上下文,但這裡沒有上下文。人們有時可以根據前面的知識進行推斷。但機器則不能且無法幫助人類讀者 — 逝去的一個重要機遇。

  歧義問題

  對於文本,消除歧義很重要,原因有幾個,可能包括:

  搜索。主要的搜索引擎要求您消除您的請求的歧義了嗎?沒有,它們依賴您通過添加術語來提供足夠的信息,以便它們能夠做出假設,但這些假設通常是錯誤的。有時,您犯了錯誤,選擇了錯誤的術語;但有時,源文本就是模稜兩可的。但是,檢索算法可能同樣也幫不上忙。

  翻譯。不管您使用哪種語言來表達一個單詞,搜索引擎都毫無例外地將其解析為一個獨立於語言的公共根(概念)。參考一個絕對根可能有助於使翻譯更准確。

  查詢。閱讀文本時,人類讀者可以在詞典中查詢單詞,但詞典只是提供一個替代項列表,而不會告訴您作者的意圖是哪個替代項。作者可能故意模稜兩可(但通常不會這樣)。

  機器分析。假如有一些關於一個文本集的准確的、沒有歧義的信息,機器能夠根據公共標准對文本集分組並對類似信息源做出建議 — 一個關於類固醇的 Dewey Decimal System(杜威十進制系統)。

  如何消除歧義?

  要消除歧義,最明顯的方法就是提供一個直接明了的句子,該句子包含其他一些特定細節來說明上下文。提供額外的信息能夠幫助人類讀者,因為它調動讀者一生積累的知識來縮小上下文范圍。這個過程可能會成本高昂:如果您讓讀者閱讀一整段只是為了傳遞一個單詞的含義,那麼就會浪費讀者的時間,讀者本來可以將這些時間用在更好的地方。

如何為機器消除歧義?為揭示一個概念的含義,您可以:

  將參考鏈接到一個已知的絕對點 — 比如,一個完全消除了歧義的列表(比如 WordNet)中的一個條目。

  確認這個概念所屬的組(比如奶牛和母駝鹿都是動物)。

  比較一個類似的概念並注明它們之間的距離 — 即,一個相對參考(奶牛和母駝鹿在某些方面類似,但在另一些方面則不同)。

  消除歧義的基本方法

  作為程序員,您可能會對允許機器幫助讀者的諸多方式感興趣。下面是一個示例,展示如何請求機器澄清一個普通概念:

The <span title='moo-cow, milk cow, etc.' 
  style='color: blue'>cow</span> jumped over the moon. 

  在這個代碼中,Html 元素 <span> 包含一個屬性 title,當您將鼠標懸停於句子中的這個單詞上方時,該屬性將提供更具體的信息。文本以藍色向讀者顯示 — 這個標記表明它包含更多信息,如果必要的話。這樣,每當您對一個句子中的一個單詞的含義拿不准時,就可以將鼠標懸停於該單詞上方,這時靜態消除歧義信息將顯示為一個彈出窗口。這個功能在當今的浏覽器中非常普遍,這樣的功能還有 <abbr> 和 <acronym> 標記,以及特意編寫的 JavaScript onmouSEOver() 函數。所有這些功能都假定讀者熟練掌握英文。

  “多麻煩啊!”您可能會說,“消除文本歧義所花的時間可能會是作者撰寫文本的時間的 10 倍!” 我的回答是:“清晰表達之舟將撞上輕視細節的礁石而沉沒嗎?” 也許會,因為我甚至還有一個更極端的建議,那將會增加任何已覺察到的麻煩。但是,當然,那些能愉快面對繁瑣任務的人將會得到相應的回報。堅持住,還有更輕松、不太麻煩的方法。

 

 消除歧義的高級方法

  想想看,您在頁面上看到的一個單詞只是冰山一角。這個可見部分以一種特殊的形式呈現給您(一名人類讀者):您能夠識別這種形式,並能在擁有圍繞該單詞的上下文時解釋它。但是,這個可見部分下面是淹沒在頁面中的其他豐富信息,比如鏈接到當前文檔內外的相關源的鏈接。

  使用 XML 進行泛化(generalization)

  這個問題可以通過以下方法,使用 XML 解決。仔細看看 清單 1 中的 XML。

清單 1. 使用 XML 進行高級泛化

<?XML version="1.0" encoding="UTF-8" ?> 
<!-- Let's call this file myxml.XML --> 
<doc> 
 <section id='1' hr='The'>The</section> 
 <section id='2' hr='cow' wnssid='n02403454'>cow2</section> 
 <section id='3' hr='jumped' wnssid='v01963942'>jump16</section> 
 <section id='4' hr='over the'>over the</section> 
 <section id='5' hr='moon' wnssid='n09358358'>moon2</section> 
</doc> 

  清單 1 有一個根元素 doc;那個上下文中有幾個 section 元素。每個 section 元素都擁有一些可用於一個特定上下文並能夠被讀者訪問的屬性。注意,在這裡,為展示基本要點,我選擇只消除名詞和動詞的歧義。

  來自 XML 的呈現

  純 XML 對最終讀者沒有用處,因此 清單 2 是一個基本 PHP 腳本,用於將內容呈現給一個不確定的讀者。

清單 2. 純提取

<?PHP 
$xml = simplexml_load_file("myxml.XML"); 
foreach ($XML->section as $sec) { 
 echo "$sec ";          
} 
echo "\nDone\n"; 
?> 


 

這個 PHP 代碼將 XML 數據從 清單 1 讀取到一個 object 變量中。然後,使用一個 foreach 語句,列示那些 section 元素的純內容。

  這個代碼生成字符串 The cow2 jump16 over the moon2,其中,cow2、jump16 和 moon2 是既無助於機器、又無助於人類的任意標簽,這裡僅用於演示。(實際上,它們是我對我的 WordNet 數據庫本地副本的查詢返回的索引數字。)按照這種形式,The cow1 jump3 over the moon1 的含義將完全不同;但對於人類而言,它們的差別並不明顯。

  一個關鍵的呈現原則是 “調整您的消息以適應讀者”。清單 3 展示了針對人類讀者的一個可能的替代方法。

清單 3. 針對人類的提取

<?PHP 
$xml = simplexml_load_file("myxml.XML"); 
foreach ($XML->section as $sec) { 
 echo $sec['hr']." "; 
} 
echo "\nDone\n"; 
?> 

  這個代碼與 清單 2 中的代碼的區別在於只報告 hr(human reader)屬性,生成字符串 The cow jumped over the moon。這個結果很好,因為它不僅是我開始的地方,還展示了一個更普通的呈現的一個特殊示例。但它仍然不太清晰。

  最後,清單 4 展示了針對機器的代碼。

清單 4. 針對機器的提取

<?PHP 
$xml = simplexml_load_file("myxml.XML"); 
foreach ($XML->section as $sec) { 
 echo $sec['wnssid']." "; 
} 
echo "\nDone\n"; 
?> 

  這個代碼與 清單 3 中的代碼的區別在於它只提取 wnssid(WordNet synsetid)。Synsets,存儲於一個數據庫中並通過一個 annnnnnnn 形式的惟一鍵識別,是指含義相同的多個單詞的組合。輸出 n02403454 v01963942 n09358358 告知機器消除了歧義的內容。

這個信息對於人類讀者而言遠遠不夠具體,因此,假定這個上下文中的指令 echo 使該信息可用於另一個例程,該例程檢查這些 synsets 的內容並使用相關從屬信息來幫助讀者。 這樣,您就能夠將相關的富數據庫信息從 WordNet 轉至用戶。您可能會以藍色顯示 cow、jumped 和 moon,並在讀者將鼠標懸停於這些單詞上方時在一個彈出窗口中提供 WordNet 信息(就像我此前在 “消除歧義的基本方法” 部分所做的那樣)。例如,對 jumped 使用來自 ID 為 v01963942 的 synset 的信息,您可以顯示 leap, bound, spring。

  您可能已經注意到,原文中的 “The” 和 “over the” 沒有顯示在輸出中。但這些單詞不重要,因為我們假設外部例程將從它擁有的信息、按照自己的方法來重新構建這個句子:也許是通過幾張圖片,圖片之間帶有箭頭;或者是使用不使用定冠詞的語言。在這個上下文中,冠詞、介詞和連詞等虛詞可能沒有用處。

  按照相同的方法,您可以添加一些屬性,比如 roget='xxx":

清單 5. 添加另一個屬性

<section id='3' hr='jumped' 
  wnssid='v01963942' 
  roget='309'>jump16</section> 

  這個代碼使 Roget 的 Thesaurus 可用於機器 — 具體而言是項目 309,該項目單獨深入探究 “leap” 的概念,盡管 “jump” 也是列示在 Roget 中的其他位置的一個項目。您還可以添加 Wikipedia 鏈接或在您的上下文中相關的任何內容,以便讀者稍後參考,這些內容將有助於讀者准確理解文本含義。

  結束語

  顯然,您可以將 XML 用作一個工具,針對不同的讀者存儲和重新組合消除了歧義的文本。但這似乎需要完成大量工作。目前,沒有任何文本以一種沒有歧義的方式呈現,因此必須有人來做這個工作,除非發明一種方法來實時消除歧義 — 目前這個流程還遠遠談不上完美。

  然而,可能不必對整個文本消除歧義:一個完全具有代表性的摘要就足夠了。然後,在這個消除了歧義的摘要上執行一個搜索,在多數情況下,這將以更少的成本提供一個准確的結果集,因為您可以以更少的時間(假定摘要比文本更短)和相應更少的精力搜索更多文檔。要獲取一個使用這種類型的消除歧義技術的簡單搜索引擎示例,請參見 DAMSEL。

  這種努力值得嗎?從某種程度上講,我也可以執行一個帶有復雜術語的查詢,通過指定 “cow water buffalo”(如果這是我的理解)來減少歧義,然後滿懷希望地認為這就是作者最初表達這個概念的方式。但是,如果原作者用泰語寫作且沒有歧義,那麼這種搜索就會困難得多。

  據說人類只使用了其腦容量的 10%,那麼人類沒有任何理由將機器限制在同樣的范圍內。


XML學習教程| jQuery入門知識| AJAX入門| Dreamweaver教程| Fireworks入門知識| SEO技巧| SEO優化集錦|
Copyright © DIV+CSS佈局教程網 All Rights Reserved