武林高手经常从山川之间顿悟,并由山川之形变化出上乘武艺。风云之间的飘渺互动,实则也为实打实的科学、工程实践提供了指引。风是客观存在的,而只有籍由云,我们才能观察到它。在技术领域的日常工作中,诸如此类的例子数不胜数。而在自然语言语义的研究中,先驱者们把这个道理总结成了一条假设——上下文假设[i]:
“实体的含义,以及实体之间语法关系的含义和这些实体与其他实体之间组合方式的限制有关。”词语作为抽象的符号,本身没有含义。词语在字典中罗列出来的“词义”,乃是它在不同的上下文语境中,对整体语义所做贡献的总结。在这里,词义是风,而语境为云。因此,在研究词语语义的时候,实际上即是要弄清楚在人们在描述客观事物、表达自己的想法的时候,是如何使用某个词语的:在哪使用,在什么时候使用,和哪些词一起使用。也就是说,如果人们要进行有意义的交流,那么在讨论、描述某个事物的时候,除事物本身以外,须另外附加上某个语境,通过事物和语境中其他元素的互动,来表达事先设定的语义[1]。
进一步地,如果两个词所指代的事物在语义上是相近的,那么在人们使用它们的时候,很可能倾向于在类似的语境中引用他们。识别两个词在语义上是否相近对多种自然语言实践任务都是有帮助的,例如本体知识库构建、语言模型构建、词义排歧、查询推荐、机器翻译等等。
那么,如何籍由语境来衡量一个词(所指代事物)的语义,及其和其他词(事物)之间的互动呢?语境的“类似”依靠什么来衡量呢?在衡量过程中,是否会遇到一些特殊情况需要处理?假使我们设计了一个统一的语境相似度衡量标准,仅靠一般意义上的语境又是否足够呢?要回答这些问题,用寥寥数页的文字自是远远不够。不过,笔者希望通过讨论下述三个问题,管中窥豹,见语义,及语义相似度计算之一斑。
问题1:如何定义语境?如何衡量两个语境是否类似?
问题2:如果一个词能够指代多个事物,如何区分对应的不同语境?
问题3:两个事物之间几乎不共享语境元素,是否代表它们没有关系?
这三个问题是以其开放程度排序的。对于第一个问题,我们可以说的细一些,因为研究的历史长了,它已经几乎成为了一个封闭的问题。而对后两个问题,目前仍旧是研究热点,这里只能简单介绍有限几种思路,在开放的问题中,还是每个人自己的思考最重要。
1.1 向量空间模型
从工程的角度来看,词语的所处语境可以用其周边上下文中的其他词,以及与这些词之间的语义关系来表示。一种直观的实践是将上述词语和/或语义关系用向量加以表示,而所有此类向量,则张成一个向量空间。这里举一个仅考虑上下文词的例子(已分好词):
武林高手1经常2从3山川4之间5顿悟6,并7由8山川之形9变化10出11上乘12武艺13。
上下文的选取是要考虑范围的,离目标词太远的词,就可以忽略不计了。如果我们考虑“山川”的上下文,且忽略距离“山川”2个词以上的词,那么“山川”的上下文就可以用下属向量表示:
(0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0)
这代表“山川”和词2、3、5、6分别共同出现一次,而和其余词共同出现0次。一般地,向量中的第i个分量,对应着字典中的第i个词。在这个例子里面,我们只有13个词,因此我们的字典规模仅为13,字典的顺序恰好是上面这句话的词语顺序,而上下文向量也只有13个分量。在真正的工程中,字典规模则是上百万的。
在数十年的研究历程中,当然存在着更加复杂的上下文表达方式,例如考虑使用,如tf-idf[ii],互信息[iii]等种种更有说服力的指标来代替共现频率;又如将词2、3、5、6和“山川”之间的语义关系考虑在内,将附加了不同语义关系的同一个词看作不同的词[iv]……幸运的是,不同的上下文表达万变不离其宗,都脱不出用周边语境元素表达语义,“云动见风”的范畴。使用上面的简单例子,已经足够我们进行下面的讨论了。
1.2 基本语义相似度计算
我们已经了解到,一个词可以用其所处语境来描述其语义,而语境又可通过向量空间来形式化。我们假设通过统计,发现一个词u在不同的地方出现过n次,进而形成了n个上下向量U1…Un,那么我们就可以用集合Su={U1…Un}来表示w的语境。
现在,我们又发现词v的语境可以用集合Sv={V1…Vm}来表示,那么接下来,如何判断u和v在语境上,进而在语义上是否相似呢?
在这个问题上,我们面临着两种选择,对应着对向量空间的两种不同的理解:
a) 欧氏向量空间
在欧氏向量空间里,向量被解释为一组坐标,标定了空间中的一个点,而向量本身,就是从空间原点指向该点的向量。
在这种设定之下,语义的相似度,亦即向量之间的相似度大多具有几何意义。例如余弦相似度:
以及欧氏距离:
其中N为字典规模。事实上,余弦相似度衡量的是两个向量的夹角,夹角越小,方向就越一致,相似度就越高;欧氏距离衡量的是两个向量终点的距离,距离越近,相似度越高。
b) 概率向量空间
在概率向量空间里,向量被解释为一个概率分布,描述了一个词以多大的概率与另一个词共同出现。
在这种设定之下,一般采用概率分布之间的差异性来衡量向量相似度。例如:K-L距离:
以及其对称平滑版本——Jensen-Shannon距离:
有了距离度量,还剩下另外一个问题:我们用了一组向量来表示一个词的语境,那么计算相似度的时候到底要用其中哪些向量,还是全部使用呢?这个问题就引出了语义相似度计算中的两种重要实践:
a) 原型(prototype)方法
对于Su={U1…Un},原型方法将所有向量取平均,形成一个向量使用。
b) 范例方法
对于Su={U1…Un}和Sv={V1…Vm}两组向量范例方法保留所有向量,两个集合Su、Sv间的相似度采用向量两两间相似度的均值,或者最小值/最大值表示。
范例方法的计算开销较大,但好处是保留了第一手的原始信息,后期则可以灵活处理,这有点像照相机的RAW格式。
其实范例方法最大的优势是在解决问题2时,更加得心应手一些,我们下面简要介绍一下面临问题2,有哪些办法可用。
所谓约束,可以这样理解:人们在讨论不同事物的时候,即使用词有重叠,使用的整个语境也是有差异的。例如人们讨论苹果手机和苹果牛仔裤,肯定不会用一套“切口”。但是如何描述其中的某一套切口呢?方法很简单,用一个关键词就可以搞定了[2]。在上面的例子中,“手机”和“牛仔裤”就是非常合适的关键词。
有了关键词,一个简单的想法就是构建一个词,如“苹果”的上下文时,只从关键词的周围选。很可惜,这样做计算开销太大了。因此,技术工作者们发展出了一系列折衷的办法。例如在范例方法中,只选择集合S中和关键词k相似度大于某个阈值的向量使用[v]:
又如对S中的向量先聚聚类,然后选择最有可能包含关键词(和关键词最相似)的聚类使用[3][2],如图1所示。
在原型方法中,则可以对目标词v的向量V和关键词k的向量K执行某种混合运算,例如分量相加,或者相乘[[vi]]。
另外一种方法是利用向量的交运算来模拟“只从关键词的周围选上下文”这一过程。定义向量的交为:
其中N为字典规模。这样一来,我们就可以利用词u、v各自的交向量来计算相似度了。
很不幸地,这个实践引出了问题3。由于求交后向量变得稀疏,使得很多本来相似的词由于共享分量太少,变得不相似了,这个时候应该怎么办呢?
图1 多原型方法示意图,摘自文献[6]。
向量的稀疏问题导致了问题3,亦即不显著共享语境元素的词语义上依旧有可能是相似的。这个问题不只存在于上述求交运算中,像语言模型一样,基于上下文统计的实践大多都可以从平滑中获益。在原形方法中,所谓平滑,是指用一个词的相似词来代表它本身[4]。具体地,对一个目标向量V,不论它是原始的上下文向量,抑或是处理(求交、聚类、筛选,等等)过的向量,如下处理:
其中Simk(V)表示V的top-k相似词集合,而sim()是当前使用的相似度度量方法。
这样做的实际效果如何呢?笔者在一个大规模网页文本(4.7T)上做过实验,实验选择了半径为5的文本窗口(见1.1节)来统计上下文,而上下文的权重(见1.1节)则使用了折扣过的点互信息[5] [3]。笔者选用了原形方法(见1.2节),使用欧氏向量空间上的余弦相似度来计算语义距离。在计算带约束的语义相似度时,使用求交运算。限于篇幅和精力,这里只给一个例子,图2显示了“刘德华”老师在不同设定下的前20相似词及相似度。
平滑算法所起到的增加召回的作用在此没有显示,但事实上很多未平滑时由于向量稀疏算不出相似度的词,平滑后变得可以计算了,有的相似度还不低。另外,我们还可以看到约束词的作用,当约束刘老师为歌手/演员时,对应的相似词结果是不同的,而且平滑的计算结果在排序上要略好于非平滑结果(噪音排下去了)。
首先,实验当然还不完备,只能够预览到预期的效果,还无法形成有说服力的结论。另外,除去向量空间模型之外,近年来研究领域也尝试使用概率模型来描述语义和语境。概率模型的基本思想是用有线的N个潜语义来代表所有日常交流中的语义,利用概率生成过程来模拟人们的语义交流过程。其中不可免俗地引入了Topic Model,感兴趣的读者,可以参考文献[7-9][[vii]][[viii]][[ix]]。
图2刘德华”老师在不同设定下的前20相似词及相似度
[1]依个人见解不同,不排除有异议的可能。
[2]当然这个词要足够关键才行,我们在这里暂不讨论这个问题。
[3]这种方法又叫做“多原型”方法。
[4]范例方法的情况留给读者自己发挥。
[5]权重计算的选择并不影响本质。