内容


新机器、XML 和歧义消除

帮助机器解析上下文信息

Comments

未实现的潜能

随着 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,其中,cow2jump16moon2 是既无助于机器、又无助于人类的任意标签,这里仅用于演示。(实际上,它们是我对我的 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 转至用户。您可能会以蓝色显示 cowjumpedmoon,并在读者将鼠标悬停于这些单词上方时在一个弹出窗口中提供 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%,那么人类没有任何理由将机器限制在同样的范围内。


相关主题


评论

添加或订阅评论,请先登录注册

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=XML
ArticleID=505644
ArticleTitle=新机器、XML 和歧义消除
publish-date=08092010