latent semantic analysis note...3 lsa 如何解决这些问题 lsa...

16
Latent semantic analysis note By: Zhou Li ([email protected]) Blog: http://foreveralbum.yo2.cn Code&Doc: http://code.google.com/p/lsa-lda/ July 29, 2009 1 LSA Introduction LSA(latent semantic analysis)潜在语义分析,也被称为 LSI(latent semantic index),是 Scott Deerwester, Susan T. Dumais 等人在 1990 年提出来的一种新的索引和检索方法。该方法和传 统向量空间模型(vector space model)一样使用向量来表示词(terms)和文档(documents),并通 过向量间的关系(如夹角)来判断词及文档间的关系;而不同的是,LSA 将词和文档映射到潜 在语义空间,从而去除了原始向量空间中的一些“噪音”,提高了信息检索的精确度。 2 传统方法的缺点 传统向量空间模型使用精确的词匹配,即精确匹配用户输入的词与向量空间中存在的词。由 于一词多义(polysemy)和一义多词(synonymy)的存在,使得该模型无法提供给用户语义层面 的检索。比如用户搜索automobile,即汽车,传统向量空间模型仅仅会返回包含automobile单词的页面,而实际上包含car单词的页面也可能是用户所需要的。 下面是 LDA 原始 Paper [1] 里举的一个例子: 上图是一个 Term-Document 矩阵, X 代表该单词出现在对应的文件里,星号表示该词出现在 查询(Query)中,当用户输入查询IDF in computer-based information look up时,用户是希望 查找与信息检索中 IDF(文档频率)相关的网页,按照精确词匹配的话,文档 2 3 分别包 含查询中的两个词,因此应该被返回,而文档 1 不包含任何查询中的词,因此不会被返回。 但我们仔细看看会发现,文档 1 中的 access, retrieval, indexing, database 这些词都是和查询 相似度十分高的,其中 retrieval look up 是同义词。显然,从用户的角度看,文档 1 应该 是相关文档,应该被返回。再来看文档 2computer information theory,虽然包含查询中的 一次词 information,但文档 2 IDF 或信息检索无关,不是用户需要的文档,不应该被返回。 从以上分析可以看出,在本次检索中,和查询相关的文档 1 并未返回给用户,而无查询无关 的文档 2 却返回给了用户。这就是同义词和多义词如何导致传统向量空间模型检索精确度的 下降。

Upload: others

Post on 17-Apr-2020

3 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Latent semantic analysis note...3 LSA 如何解决这些问题 LSA 潜在语义分析的目的,就是要找出词(terms)在文档和查询中真正的含义,也就是潜在语

Latent semantic analysis note By: Zhou Li ([email protected])

Blog: http://foreveralbum.yo2.cn

Code&Doc: http://code.google.com/p/lsa-lda/

July 29, 2009

1 LSA Introduction

LSA(latent semantic analysis)潜在语义分析,也被称为 LSI(latent semantic index),是 Scott

Deerwester, Susan T. Dumais 等人在 1990 年提出来的一种新的索引和检索方法。该方法和传

统向量空间模型(vector space model)一样使用向量来表示词(terms)和文档(documents),并通

过向量间的关系(如夹角)来判断词及文档间的关系;而不同的是,LSA 将词和文档映射到潜

在语义空间,从而去除了原始向量空间中的一些“噪音”,提高了信息检索的精确度。

2 传统方法的缺点

传统向量空间模型使用精确的词匹配,即精确匹配用户输入的词与向量空间中存在的词。由

于一词多义(polysemy)和一义多词(synonymy)的存在,使得该模型无法提供给用户语义层面

的检索。比如用户搜索”automobile”,即汽车,传统向量空间模型仅仅会返回包含”automobile”

单词的页面,而实际上包含”car”单词的页面也可能是用户所需要的。

下面是 LDA 原始 Paper[1]里举的一个例子:

上图是一个 Term-Document 矩阵,X 代表该单词出现在对应的文件里,星号表示该词出现在

查询(Query)中,当用户输入查询”IDF in computer-based information look up” 时,用户是希望

查找与信息检索中 IDF(文档频率)相关的网页,按照精确词匹配的话,文档 2 和 3 分别包

含查询中的两个词,因此应该被返回,而文档 1 不包含任何查询中的词,因此不会被返回。

但我们仔细看看会发现,文档 1 中的 access, retrieval, indexing, database 这些词都是和查询

相似度十分高的,其中 retrieval 和 look up 是同义词。显然,从用户的角度看,文档 1 应该

是相关文档,应该被返回。再来看文档 2:computer information theory,虽然包含查询中的

一次词 information,但文档 2 和 IDF 或信息检索无关,不是用户需要的文档,不应该被返回。

从以上分析可以看出,在本次检索中,和查询相关的文档 1 并未返回给用户,而无查询无关

的文档 2 却返回给了用户。这就是同义词和多义词如何导致传统向量空间模型检索精确度的

下降。

Page 2: Latent semantic analysis note...3 LSA 如何解决这些问题 LSA 潜在语义分析的目的,就是要找出词(terms)在文档和查询中真正的含义,也就是潜在语

3 LSA 如何解决这些问题

LSA 潜在语义分析的目的,就是要找出词(terms)在文档和查询中真正的含义,也就是潜在语

义,从而解决上节所描述的问题。具体说来就是对一个大型的文档集合使用一个合理的维度

建模,并将词和文档都表示到该空间,比如有 2000 个文档,包含 7000 个索引词,LSA 使用

一个维度为 100 的向量空间将文档和词表示到该空间,进而在该空间进行信息检索。而将文

档表示到此空间的过程就是 SVD 奇异值分解和降维的过程。降维是 LSA 分析中最重要的一

步,通过降维,去除了文档中的“噪音”,也就是无关信息(比如词的误用或不相关的词偶

尔出现在一起),语义结构逐渐呈现。相比传统向量空间,潜在语义空间的维度更小,语义

关系更明确。

4 SVD 分解[2]

SVD 分解是 LSA 的数学基础,本节讨论 SVD 分解相关数学问题。本节一个分为 3 个部分,第

一部分讨论线性代数中的一些基础知识,第二部分讨论 SVD 矩阵分解,第三部分讨论低阶

近似。本节讨论的矩阵都是实数矩阵。

4.1 基础知识

1. 矩阵的秩:矩阵的秩是矩阵中线性无关的行或列的个数

2. 对角矩阵:对角矩阵是除对角线外所有元素都为零的方阵

3. 单位矩阵:如果对角矩阵中所有对角线上的元素都为零,该矩阵称为单位矩阵

4. 特征值:对一个 M x M 矩阵 C 和向量 X,如果存在 λ 使得下式成立

则称 λ 为矩阵 C 的特征值,X 称为矩阵的特征向量。非零特征值的个数小于等于矩阵的

秩。

5. 特征值和矩阵的关系:考虑以下矩阵

该矩阵特征值 λ1 = 30,λ2 = 20,λ3 = 1。对应的特征向量

假设 VT=(2,4,6) 计算 S x VT

Page 3: Latent semantic analysis note...3 LSA 如何解决这些问题 LSA 潜在语义分析的目的,就是要找出词(terms)在文档和查询中真正的含义,也就是潜在语

有上面计算结果可以看出,矩阵与向量相乘的结果与特征值,特征向量有关。观察三个

特征值 λ1 = 30,λ2 = 20,λ3 = 1,λ3 值最小,对计算结果的影响也最小,如果忽略 λ3,那

么运算结果就相当于从(60,80,6)转变为(60,80,0),这两个向量十分相近。这也表示了数

值小的特征值对矩阵-向量相乘的结果贡献小,影响小。这也是后面谈到的低阶近似的

数学基础。

4.2 矩阵分解

1. 方阵的分解

1) 设 S 是 M x M 方阵,则存在以下矩阵分解

其中 U 的列为 S 的特征向量, 为对角矩阵,其中对角线上的值为 S 的特征值,

按从大到小排列:

2) 设 S 是 M x M 方阵,并且是对称矩阵,有 M 个特征向量。则存在以下分解

其中 Q 的列为矩阵 S 的单位正交特征向量, 仍表示对角矩阵,其中对角线上的

值为 S 的特征值,按从大到小排列。最后,QT=Q-1,因为正交矩阵的逆等于其转置。

2. 奇异值分解

上面讨论了方阵的分解,但是在 LSA 中,我们是要对 Term-Document 矩阵进行分解,

很显然这个矩阵不是方阵。这时需要奇异值分解对 Term-Document 进行分解。奇异值

分解的推理使用到了上面所讲的方阵的分解。

假设 C 是 M x N 矩阵,U 是 M x M 矩阵,其中 U 的列为 CCT 的正交特征向量,V 为 N x N

矩阵,其中 V 的列为 CTC 的正交特征向量,再假设 r 为 C 矩阵的秩,则存在奇异值分解:

其中 CCT 和 CTC 的特征值相同,为

Σ 为 M X N,其中 ,其余位置数值为 0, 的值按大小降序排列。以下是

Σ 的完整数学定义:

Page 4: Latent semantic analysis note...3 LSA 如何解决这些问题 LSA 潜在语义分析的目的,就是要找出词(terms)在文档和查询中真正的含义,也就是潜在语

σi 称为矩阵 C 的奇异值。

用 C 乘以其转置矩阵 CT 得:

上式正是在上节中讨论过的对称矩阵的分解。

奇异值分解的图形表示:

从图中可以看到 Σ 虽然为 M x N 矩阵,但从第 N+1 行到 M 行全为零,因此可以表示成

N x N 矩阵,又由于右式为矩阵相乘,因此 U 可以表示为 M x N 矩阵,VT可以表示为 N x

N 矩阵

3. 低阶近似

LSA 潜在语义分析中,低阶近似是为了使用低维的矩阵来表示一个高维的矩阵,并使两

者之差尽可能的小。本节主要讨论低阶近似和 F-范数。

给定一个 M x N 矩阵 C(其秩为 r)和正整数 k,我们希望找到一个 M x N 矩阵 Ck,其秩不

大于 K。设 X 为 C 与 Ck之间的差,X=C – Ck,X 的 F-范数为

当 k 远小于 r 时,称 Ck为 C 的低阶近似,其中 X 也就是两矩阵之差的 F 范数要尽可能

的小。

SVD 可以被用与求低阶近似问题,步骤如下:

1. 给定一个矩阵 C,对其奇异值分解:

2. 构造 ,它是将 的第 k+1 行至 M 行设为零,也就是把 的最小的 r-k 个(the r-k

smallest)奇异值设为零。

3. 计算 Ck:

回忆在基础知识一节里曾经讲过,特征值数值的大小对矩阵-向量相乘影响的大小成正

比,而奇异值和特征值也是正比关系,因此这里选取数值最小的 r-k 个特征值设为零合

Page 5: Latent semantic analysis note...3 LSA 如何解决这些问题 LSA 潜在语义分析的目的,就是要找出词(terms)在文档和查询中真正的含义,也就是潜在语

乎情理,即我们所希望的 C-Ck 尽可能的小。完整的证明可以在 Introduction to Information

Retrieval[2]中找到。

我们现在也清楚了 LSA 的基本思路:LSA 希望通过降低传统向量空间的维度来去除空间

中的“噪音”,而降维可以通过 SVD 实现,因此首先对 Term-Document 矩阵进行 SVD

分解,然后降维并构造语义空间。

5 LSA 技术细节[1][3]

本节主要讨论 LSA 技术细节的理论部分,具体代码层面分析和实践在第 7 节讨论。

LSA 的步骤如下:

1. 分析文档集合,建立 Term-Document 矩阵。

2. 对 Term-Document 矩阵进行奇异值分解。

3. 对 SVD 分解后的矩阵进行降维,也就是奇异值分解一节所提到的低阶近似。

4. 使用降维后的矩阵构建潜在语义空间,或重建 Term-Document 矩阵。

下面是 Introduction to Latent Semantic Analysis 里面的一个例子,描述了完整的 LSA 步骤,例

子后面有我的补充:

假设文档集合如下:

原始的 Term-Document 矩阵如下:

对其进行奇异值分解:

Page 6: Latent semantic analysis note...3 LSA 如何解决这些问题 LSA 潜在语义分析的目的,就是要找出词(terms)在文档和查询中真正的含义,也就是潜在语

然后对分解后的矩阵降维,这里保留{S}的最大两个奇异值,相应的{W}{P}矩阵如图,注意{P}

在公式中需要转置。

到了这一步后,我们有两种处理方法,论文 Introduction to Latent Semantic Analysis 是将降维

后的三个矩阵再乘起来,重新构建了{X}矩阵如下:

Page 7: Latent semantic analysis note...3 LSA 如何解决这些问题 LSA 潜在语义分析的目的,就是要找出词(terms)在文档和查询中真正的含义,也就是潜在语

观察{X}矩阵和{X^}矩阵可以发现:

{X}中 human-C2 值为 0,因为 C2 中并不包含 human 单词,但是{X^}中 human-C2 为 0.40,表

明 human 和 C2 有一定的关系,为什么呢?因为 C2:”A survey of user opinion of computer

system response time”中包含 user 单词,和 human 是近似词,因此 human-C2 的值被提高了。

同理还可以分析其他在{X^}中数值改变了的词。

以上分析方法清晰的把 LSA 的效果显示出来了,也就是在{X^}中呈现出了潜在语义,然后希

望能创建潜在语义空间,并在该空间中检索信息。这里以比较两个单词为例:

设奇异值分解形式为:X = T S DT,T 代表 term,s 代表 single value 矩阵,D 代表 Document,

DT 表示 D 的转置。X 的两个行向量点乘的值代表了两个词在文档中共同出现的程度。比如

T1 在 D1 中出现 10 词,T2 在 D1 中出现 5 次,T3 在 D1 中出现 0 词,那么只考虑在 D1 维度

上的值,T1(dot)T2=50,T1(dot)T2=0,显然 T1 与 T2 更相似,T1 与 T3 就不那么相似。那么

用矩阵 X(dot)XT就可以求出所有词与词的相似程度。而由奇异值分解的公式的:

X(dot)XT = T(dot)S2(dot)TT = TS(dot)(TS)T

上面公式表明了,我们想求 X(dot)XT的(i,j)个元素时,可以点乘 TS 矩阵的第 i 和 j 列来表示。

因此我们可以把 TS 矩阵的行看作是 term 的坐标,这个坐标就是潜在语义空间的坐标。同理

我们还可以推出 XT(dot)X = D(dot)S2(dot)DT,从而 DS 的行表示了文档的坐标。

这样,我们就获得了所有文档和单词在潜在语义空间的坐标,这时我们就可以通过向量间的

夹角来判断两个对象的相似程度,方法和传统向量空间模型相同。接下来主要讨论下检索文

本的步骤。

用户输入的检索语句被称为伪文本,因为它也是有多个词汇构成,和文本相似。所以很自然

的想法就是将该伪文本转换为文档坐标,然后通过比较该伪文档与每个文档的空间夹角,检

索出该伪文本的相关文档。设 Xq 表示伪文本的列向量,其中该列代表文档集合的索引词,

该列的值代表伪文本中该索引词出现的次数。比如一个文档集合有索引词{T1,T2,T3},伪文

本为 t1,t3,t2,t1,则 Xq={2,1,1}。获得 Xq后,通过公式

Dq = XqT T S-1

计算伪文档的文档坐标。其中 T 和 S 分别代表奇异分解中得到的矩阵(S = T S DT).注意上面的

公式中 S-1 代表 S 的逆矩阵。

Dq 计算出来后,就可以迭代比较 Dq 和文档集合中所有所有文档,计算两者个 cosine 夹角

Page 8: Latent semantic analysis note...3 LSA 如何解决这些问题 LSA 潜在语义分析的目的,就是要找出词(terms)在文档和查询中真正的含义,也就是潜在语

6 LSA 实践

本节主要讨论 LSA的实现,编程语言使用 C++,环境 Linux gcc,使用了GNU Scientific Library[5]。

本节代码可以在 http://code.google.com/p/lsa-lda/找到。

1. 创建 Term-Document 矩阵

LSA 是基于向量空间模型的,因此首先需要创建一个 M x N 的 Term-Document 矩阵,其

中行表示每一个词,列表示每一个文档。而矩阵的值等于相应词的 TF*IDF 值。待检索

的文档集合放在程序根目录下的 corpus 文件夹,每一个文档一个文件。

首先需要创建语料的单词列表,作为 T-D 矩阵的列向量,每一个单词对应一个 id。

CreateVectorSpace.cc

Function int CreateKeyWordMap()

// 循环读入每个文档

while((ent=readdir(currentDir))!=NULL)

{

//omit . and ..

if((strcmp(ent->d_name,".")==0)||(strcmp(ent->d_name,"..")==0))

continue;

else

{

//read each file in directory 'corpus'

string filename = "./corpus/";

filename += ent->d_name;

ifstream in(filename.c_str());

// check if file open succeeded

if (!in)

{

cout<<"error, cannot open input file"<<endl;

return -1;

}

Parse(); //分析单词

Page 9: Latent semantic analysis note...3 LSA 如何解决这些问题 LSA 潜在语义分析的目的,就是要找出词(terms)在文档和查询中真正的含义,也就是潜在语

在循环的过程中,识别每一个单词,并判断该单词是否为 stop word。英文的 stop word

可以在 ftp://ftp.cs.cornell.edu/pub/smart/english.stop 找到。

CreateVectorSpace.cc

Function Parse()

// read one char each time

// then recognize a word and check if it is in the stop list

void Parse(ifstream *in,int *wordIndex)

{

string pendingWord;

char ch;

while (1)

{

……

if (!LETTER(ch)) /*after recognized a word*/

{

if (!stoplist.count(pendingWord))

{

/*if not exist in the list*/

if (wordList.find(pendingWord) == wordList.end())

{

wordList.insert(make_pair(pendingWord,*wordIndex));

(*wordIndex)++;

}

}

……

接下来需要处理单词,由于英文单词有前缀和后缀,如单词的单复数(book->books),过

去时(like->liked),这些词虽然形式不同但含义相同,因此要将它们处理为同一的形式,

也就是单词的原型。相关的算法为 Porter Stemming[6]算法。

获得单词列表后,就可以构造 T-D 矩阵了,过程是依次读入每个文档,遇到单词列表中

存在的词,相应的矩阵单元加 1。这里用到了 GSL 的几个函数,用法可参考 GSL 手册[5]。

CreateVectorSpace.cc

Function CreateMatrix()

gsl_matrix* CreateMatrix()

{

……

// 分配 T-D 矩阵空间

Page 10: Latent semantic analysis note...3 LSA 如何解决这些问题 LSA 潜在语义分析的目的,就是要找出词(terms)在文档和查询中真正的含义,也就是潜在语

gsl_matrix * mtx = gsl_matrix_alloc(wordList.size(),docList.size());

map<string, int>::const_iterator map_it = docList.begin();

// for each document

while (map_it != docList.end())

{

…..

// 如果当前单词在单词列表中存在

if (wordList.find(pendingWord) != wordList.end())

{

// 矩阵相应的单元值加 1

gsl_matrix_set (mtx, wordList[pendingWord], map_it->second,

gsl_matrix_get(mtx, wordList[pendingWord], map_it->second)+1);

wordCount[map_it->second] += 1;

}

……

现在已经创建了 T-D 矩阵,但是矩阵单元值为单词在文档中出现的频率,因此下一步是

求每个单词的 TF*IDF 值[7]。TF 代表单词在某一文档中出现的频率,IDF 为 inverse

document frequency,代表的含义是如果一个单词在很多文档中都出现了,那么用它来

区分文档的价值就降低。具体公式:

SVD.CC

Function CreateTfIdfMatrix()

gsl_matrix* CreateTfIdfMatrix()

{

……

double termfrequence = gsl_matrix_get(mtx,i,j)/wordCount[j];

double idf = log((double)docList.size()/(double)getDocumentFrequence(mtx,i));

gsl_matrix_set(mtx,i,j,termfrequence*idf);

……

至此 T-D 矩阵创建完成。

2. SVD 分解

SVD 分解使用 GSL 库中的 gsl_linalg_SV_decomp 函数

// SVD.cc

// Function CountSVD(gsl_matrix *)

Page 11: Latent semantic analysis note...3 LSA 如何解决这些问题 LSA 潜在语义分析的目的,就是要找出词(terms)在文档和查询中真正的含义,也就是潜在语

void CountSVD(gsl_matrix* mtx)

{

// S = U S V^T so first let's allocate U,S,V these three matrix

v_mtx = gsl_matrix_alloc(docList.size(),docList.size()); /*V is a N by N matrix*/

s_vct = gsl_vector_alloc(docList.size()); /*S is stored in a n-d vector*/

gsl_vector * workspace =

gsl_vector_alloc(docList.size()); /* workspace for gsl function*/

gsl_linalg_SV_decomp(mtx, v_mtx, s_vct, workspace);

}

3. 降维

降维在程序你实现十分简单,也就是给矩阵(由于是对角矩阵,因此程序里表示为向量)

赋值零。

SVD.cc

Function ReduceDim(int)

void ReduceDim(int keep)

{

for (int i=keep;i<docList.size();i++)

gsl_vector_set(s_vct,i,0);

}

4. 查询

SVD 分解完成后,我们就已经获得了潜在语义空间,接下来就可以接受用户的输入,将

伪文本转换到文档坐标,然后通过比较向量的夹角,找出相关文档。

void Query(string query)

{

// transform query into LSA space

istringstream stream(query);

string word;

//为 Xq 创建 gsl 向量, Xq 表示伪文本的列向量

gsl_vector * q_vct = gsl_vector_alloc(wordList.size());

// 为 Dq 创建 gsl 向量,Dq 表示伪文本的文档向量

gsl_vector * d_vct = gsl_vector_alloc(LSD);

// 首先计算 Xq

while (stream >> word)

{

if (wordList.count(word)!=0) /*word is in the list*/

gsl_vector_set(q_vct,wordList[word],

Page 12: Latent semantic analysis note...3 LSA 如何解决这些问题 LSA 潜在语义分析的目的,就是要找出词(terms)在文档和查询中真正的含义,也就是潜在语

gsl_vector_get(q_vct,wordList[word])+1);

}

// Dq = Xq' T S^-1

// 再求 Xq'乘 T

for (int i = 0; i < LSD; i++)

{

double sum = 0;

for (int j = 0; j < wordList.size(); j++)

sum += gsl_vector_get(q_vct,j) * gsl_matrix_get(mtx,j,i);

gsl_vector_set(d_vct,i,sum);

}

// 最后求(Xq' T) S^-1

for (int k = 0; k < LSD; k++)

gsl_vector_set(d_vct, k,

gsl_vector_get(d_vct,k) * (1/gsl_vector_get(s_vct,k)));

//用文档集合中每个文档和 Dq 比较

for (int l=0;l<docList.size();l++)

{

……

// 求两向量夹角,返回 cosine 值

relation = CompareVector(d_vct, temp_d_vct, LSD);

}

}

5. 测试

我们先用以前讨论过的文档集

将 C1~M4 分别保存到 9 个文件里,放到 corpus 文件夹

Page 13: Latent semantic analysis note...3 LSA 如何解决这些问题 LSA 潜在语义分析的目的,就是要找出词(terms)在文档和查询中真正的含义,也就是潜在语

运行程序,输入格式为 lsa.out [query]

./lsa.out human computer interaction

可以看出与主题最相关的文档是 C3,其次是 C1。C1~C5 文件是同主题文档,主题是人

机互交,而 M1~M4 的共同主题是计算机图形。而查询”human computer interaction”

显然描述的是人机互交。因此也可以从结果看到 C1~C5 的相关度全部都高于 M1~M4

文档。最后,观察 C3,C5 文档,它们并不包含任何查询中的词,而计算出的相似度却

不为 0,并且 C3 的相似度达 0.999658,这也正是 LSA 潜在语义的效果。

下面是文档两两比较后的结果表格(已导入到 Excel)

Page 14: Latent semantic analysis note...3 LSA 如何解决这些问题 LSA 潜在语义分析的目的,就是要找出词(terms)在文档和查询中真正的含义,也就是潜在语

上图 1~9 和 A~B 都分别代表文档{C1,C2,C3,C4,C5,M1,M2,M3,M4}

上图非常清晰的显示出了文档的关系:

先来看[1~5][A~E]也就是第 1~5 行,A~E 列,由于文档 C1~C5 是一个主题的文档,所以

可以看出[1~5][A~E]都大于 0.9,而[1~5][F~I]都不超过 0.5,也表明 C1~C5 文档与 M1~M4

文档主题是不相干的。

同理可以分析[6~9][F~I]。

上面的讨论表明,潜在语义分析在主题分类上效果明显。如果设定一个分类的阈值,比

如 0.8,那么上面 9 个文档就被自动分为了{C1,C2,C3,C4,C5}和{M1,M2,M3,M4}

在另一个测试中,我从 New York Times 网站收集的 6 个主题,每个主题 5 篇文章

搜索” what a great day”结果如下:

Page 15: Latent semantic analysis note...3 LSA 如何解决这些问题 LSA 潜在语义分析的目的,就是要找出词(terms)在文档和查询中真正的含义,也就是潜在语

伪文本坐标(0.00402821,-0.0183549,0.00361756),每个文档的相关度如上图。如果设定

检索阈值为 0.9,那么文档 movie2,sport4,art2 会被返回。

7 总结

LSA 通过对潜在语义空间的建模,提高的信息检索的精确度。而后又有人提出了

PLSA(Probabilistic latent semantic analysis)和 LDA(Latent Dirichlet allocation),将 LSA 的思想带

入到概率统计模型中。

LSA 对一词多义问题依然没有解决,仅仅解决了一义多词。因为 LSA 将每一个词表示为潜在

语义空间中的一个点,因此一个词的多个意义在空间中对于的是一个点,没有被区分。

8 References

[1] Deerwester, S., Dumais, S. T., Furnas, G. W., Landauer, T. K., & Harshman, R.(1990). Indexing

By Latent Semantic Analysis. Journal of the American Society For Information Science, 41,

391-407. 10

Page 16: Latent semantic analysis note...3 LSA 如何解决这些问题 LSA 潜在语义分析的目的,就是要找出词(terms)在文档和查询中真正的含义,也就是潜在语

[2] Christopher D. Manning, Prabhakar Raghavan and Hinrich Schütze, Introduction to

Information Retrieval, Cambridge University Press. 2008.

[3] Thomas Landauer, P. W. Foltz, & D. Laham (1998). "Introduction to Latent Semantic Analysis".

Discourse Processes 25: 259–284.

[4] Michael Berry, S.T. Dumais, G.W. O'Brien (1995). Using Linear Algebra for Intelligent

Information Retrieval. Illustration of the application of LSA to document retrieval.

[5] http://www.gnu.org/software/gsl/manual/html_node/

[6] http://tartarus.org/~martin/PorterStemmer/

[7] http://en.wikipedia.org/wiki/TF_IDF

9 External Link

[1] http://code.google.com/p/lsa-lda/

本文中程序的代码实现和 LSA 相关资料

[2] http://en.wikipedia.org/wiki/Latent_semantic_analysis

LSA 的 WIKI 条目,有 LSA 的大致介绍

[3] http://lsa.colorado.edu/

Colorado 大学的一个 LSA 项目,提供了基于 LSA 的 terms 比较,文本比较等

[4] http://www.bluebit.gr/matrix-calculator/

在线矩阵计算工具,可计算 SVD

10 Further Reading

[1] Thomas Hofmann, Probabilistic Latent Semantic Indexing, Proceedings of the Twenty-Second

Annual International SIGIR Conference on Research and Development in Information Retrieval

(SIGIR-99), 1999

[2] Blei, David M.; Ng, Andrew Y.; Jordan, Michael I (January 2003). "Latent Dirichlet allocation".

Journal of Machine Learning Research 3: pp. 993–1022. doi:10.1162/jmlr.2003.3.4-5.993

(inactive 2009-03-30).