隐性语义索引

发信人: walt@ncicbbs (瓦尔特), 信区: chinese
标  题: ◎ 隐性语义索引
发信站: 国家智能机中心曙光站 (Thu Apr 11 12:02:51 1996)
转信站: ncicbbs

                隐性语义索引

                   .Walt.

1. 引言
        

自然语言文本中的词汇(术语)具有一词多义(polysemy)和一义多词(synonymy)的特点. 
由于一词多义, 基于精确匹配的检索算法会报告许多用户不要的东西; 由于一义多词, 
基于精确匹配的检索算法又会遗漏许多用户想要的东西.

下面是一个例子:

设Doc1, Doc2, Doc3是三个文件. 一些术语在这三个文件中的出现情况如下表:


            Doc1          Doc2         Doc3
--------------------------------------------------
access       X                                          document     X
retrieval    X                          X
information                X*           X*
theory                     X
database     X
indexing     X
computer                   X*           X*
--------------------------------------------------

这里, 假定用"information" 和"computer"作为主题词进行检索, 那么Doc2和Doc3与之
精确匹配, 因而中选. 然而, Doc2是用户并不想要的文件, Doc1才是想要的查不出来, 
不想要的倒查了出来. 这说明精确匹配不能很好地反映用户的意图. 那么有没有更好的
办法呢?

当然, 如果能基于自然语言理解来做这件事, 那一切问题就都没有了. 问题是:
(1) 自然语言理解的目前水平还是有限度的; (2) 即使用自然语言理解, 效率也会很低.
 我们希望找到一种办法, 既能反映术语之间内在的相关性, 又具有较高的效率.

Bellcore以Dumais为首的研究小组提出了一种称为"隐性语义索引"的方法, 试图绕过
自然语言理解, 用统计的办法达到同样的目标. "隐性语义索引"的英文名字为
"Latent Semantic Indexing", 简称LSI.                         

2. LSI的做法

首先, 以术语(terms)为行, 文件(documents)为列做一个大矩阵(matrix). 设一共有
t行d列, 矩阵名为X. 矩阵的元素为术语在文件中的出现频度.

数学上可以证明: X可以分解为三个矩阵T0, S0, D0'(D0的转置)的积. 其中T0和D0的
列向量都是正交归一化的, S0是对角矩阵. T0是t*m矩阵, S0是m*m矩阵,D0是d*m矩阵, 
m是X的秩. 这种分解叫做单值分解(singlar value decomposition,简称SVD).

                        X=T0*S0*D0'

一般要求T0, S0, D0都是满秩的. 不难做到把S0的元素沿对角线从大到小排列.

现在, 把S0的m个对角元素的前k个保留, 后m-k个置0, 我们可以得到一个新的近似的
分解:

                        Xhat=T*S*D'                     

奇妙的是, Xhat在最小二乘意义下是X的最佳近似! 这样, 我们实际上有了一个"降维"的
途径. 下面要说明, T, S, D三个矩阵在文件检索中有重要的应用价值.

一个遗留问题是k到底取多大. k越大失真越小, 但开销越大. k的选择是按实际问题的
要求进行平衡的结果.      
                                     
给定矩阵X, 基于X可以问三类同文件检索密切有关的问题:

(1) 术语i和j有多相似?

(2) 文件i和j有多相似?

(3) 术语i和文件j有多相关?

第一类问题是术语的类比和聚类问题;

第二类问题是文件的类比和聚类问题;

第三类问题是术语和文件的关联问题.

下面我们用Xhat来进行这三类比较.

3.1 比较两个术语
                          
做"正向"乘法:

                Xhat*Xhat'=T*S*D'*D*S*T'=T*S^2*T'

(D'*D=I, 因为D已经是正交归一的). 它的第i行第j列表明了术语i和j的相似程度.

3.2 比较两个文件

做"逆向"乘法:

                Xhat'*Xhat=D*S*T'*T*S*D'=D*S^2*D'

(T'*T=I, 因为T已经是正交归一的). 它的第i行第j列表明了文件i和j的相似程度.

3.3 比较一个文件和一个术语

恰巧就是Xhat本身. 它的第i行第j列表明了术语i和文件j的相关联程度.

3.4 查询

可以把主题词的集合认为是一个虚拟的文件. 查询的任务说白了是把这个虚拟的文
件和其他文件做相似性比较, 挑选最相似的出来(挑选到什么程度打住, 要看实际问题
的要求) 

*********************


以上极简略地介绍了LSI的做法. 实验表明, 这一做法可以收到很好的效果, 在基于
内容的查询和信息过滤等方面有很好的前景.
                                                           

你可能感兴趣的:(算法,语言,任务,Matrix,曙光,Semantic)