日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Latent semantic analysis note(LSA)

發(fā)布時(shí)間:2025/4/14 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Latent semantic analysis note(LSA) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

1 LSA Introduction

LSA(latent semantic analysis)潛在語義分析,也被稱為LSI(latent semantic index),是Scott Deerwester, Susan T. Dumais等人在1990年提出來的一種新的索引和檢索方法。該方法和傳統(tǒng)向量空間模型(vector space model)一樣使用向量來表示詞(terms)和文檔(documents),并通過向量間的關(guān)系(如夾角)來判斷詞及文檔間的關(guān)系;而不同的是,LSA將詞和文檔映射到潛在語義空間,從而去除了原始向量空間中的一些“噪音”,提高了信息檢索的精確度。

2 傳統(tǒng)方法的缺點(diǎn)

傳統(tǒng)向量空間模型使用精確的詞匹配,即精確匹配用戶輸入的詞與向量空間中存在的詞。由于一詞多義(polysemy)和一義多詞(synonymy)的存在,使得該模型無法提供給用戶語義層面的檢索。比如用戶搜索”automobile”,即汽車,傳統(tǒng)向量空間模型僅僅會(huì)返回包含”automobile”單詞的頁面,而實(shí)際上包含”car”單詞的頁面也可能是用戶所需要的。

下面是LDA原始Paper[1]里舉的一個(gè)例子:

上圖是一個(gè)Term-Document矩陣,X代表該單詞出現(xiàn)在對應(yīng)的文件里,星號(hào)表示該詞出現(xiàn)在查詢(Query)中,當(dāng)用戶輸入查詢”IDF in computer-based information look up” 時(shí),用戶是希望查找與信息檢索中IDF(文檔頻率)相關(guān)的網(wǎng)頁,按照精確詞匹配的話,文檔2和3分別包含查詢中的兩個(gè)詞,因此應(yīng)該被返回,而文檔1不包含任何查詢中的詞,因此不會(huì)被返回。但我們仔細(xì)看看會(huì)發(fā)現(xiàn),文檔1中的access, retrieval, indexing, database這些詞都是和查詢相似度十分高的,其中retrieval和look up是同義詞。顯然,從用戶的角度看,文檔1應(yīng)該是相關(guān)文檔,應(yīng)該被返回。再來看文檔2:computer information theory,雖然包含查詢中的一次詞information,但文檔2和IDF或信息檢索無關(guān),不是用戶需要的文檔,不應(yīng)該被返回。從以上分析可以看出,在本次檢索中,和查詢相關(guān)的文檔1并未返回給用戶,而無查詢無關(guān)的文檔2卻返回給了用戶。這就是同義詞和多義詞如何導(dǎo)致傳統(tǒng)向量空間模型檢索精確度的下降。

3 LSA如何解決這些問題

LSA潛在語義分析的目的,就是要找出詞(terms)在文檔和查詢中真正的含義,也就是潛在語義,從而解決上節(jié)所描述的問題。具體說來就是對一個(gè)大型的文檔集合使用一個(gè)合理的維度建模,并將詞和文檔都表示到該空間,比如有2000個(gè)文檔,包含7000個(gè)索引詞,LSA使用一個(gè)維度為100的向量空間將文檔和詞表示到該空間,進(jìn)而在該空間進(jìn)行信息檢索。而將文檔表示到此空間的過程就是SVD奇異值分解和降維的過程。降維是LSA分析中最重要的一步,通過降維,去除了文檔中的“噪音”,也就是無關(guān)信息(比如詞的誤用或不相關(guān)的詞偶爾出現(xiàn)在一起),語義結(jié)構(gòu)逐漸呈現(xiàn)。相比傳統(tǒng)向量空間,潛在語義空間的維度更小,語義關(guān)系更明確。

4?SVD分解[2]

SVD分解作為掌握LSA的基礎(chǔ)知識(shí),我單獨(dú)把它作為一篇文章,可以在這里找到。

5 LSA技術(shù)細(xì)節(jié)[1][3]

本節(jié)主要討論LSA技術(shù)細(xì)節(jié)的理論部分,具體代碼層面分析和實(shí)踐在第7節(jié)討論。

LSA的步驟如下:

1. 分析文檔集合,建立Term-Document矩陣。

2. 對Term-Document矩陣進(jìn)行奇異值分解。

3. 對SVD分解后的矩陣進(jìn)行降維,也就是奇異值分解一節(jié)所提到的低階近似。

4. 使用降維后的矩陣構(gòu)建潛在語義空間,或重建Term-Document矩陣。

下面是Introduction to Latent Semantic Analysis里面的一個(gè)例子,描述了完整的LSA步驟,例子后面有我的補(bǔ)充:

假設(shè)文檔集合如下:

原始的Term-Document矩陣如下:

對其進(jìn)行奇異值分解:

然后對分解后的矩陣降維,這里保留{S}的最大兩個(gè)奇異值,相應(yīng)的{W}{P}矩陣如圖,注意{P}在公式中需要轉(zhuǎn)置。

到了這一步后,我們有兩種處理方法,論文Introduction to Latent Semantic Analysis是將降維后的三個(gè)矩陣再乘起來,重新構(gòu)建了{(lán)X}矩陣如下:

觀察{X}矩陣和{X^}矩陣可以發(fā)現(xiàn):

{X}中human-C2值為0,因?yàn)镃2中并不包含human單詞,但是{X^}中human-C2為0.40,表明human和C2有一定的關(guān)系,為什么呢?因?yàn)镃2:”A survey of user opinion of computer system response time”中包含user單詞,和human是近似詞,因此human-C2的值被提高了。同理還可以分析其他在{X^}中數(shù)值改變了的詞。

以上分析方法清晰的把LSA的效果顯示出來了,也就是在{X^}中呈現(xiàn)出了潛在語義,然后希望能創(chuàng)建潛在語義空間,并在該空間中檢索信息。這里以比較兩個(gè)單詞為例:

設(shè)奇異值分解形式為:X = T S DT,T代表term,s代表single value矩陣,D代表Document,DT表示D的轉(zhuǎn)置。X的兩個(gè)行向量點(diǎn)乘的值代表了兩個(gè)詞在文檔中共同出現(xiàn)的程度。比如T1在D1中出現(xiàn)10詞,T2在D1中出現(xiàn)5次,T3在D1中出現(xiàn)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)個(gè)元素時(shí),可以點(diǎn)乘TS矩陣的第i和j列來表示。因此我們可以把TS矩陣的行看作是term的坐標(biāo),這個(gè)坐標(biāo)就是潛在語義空間的坐標(biāo)。同理我們還可以推出XT(dot)X = D(dot)S2(dot)DT,從而DS的行表示了文檔的坐標(biāo)。

這樣,我們就獲得了所有文檔和單詞在潛在語義空間的坐標(biāo),這時(shí)我們就可以通過向量間的夾角來判斷兩個(gè)對象的相似程度,方法和傳統(tǒng)向量空間模型相同。接下來主要討論下檢索文本的步驟。

用戶輸入的檢索語句被稱為偽文本,因?yàn)樗彩怯卸鄠€(gè)詞匯構(gòu)成,和文本相似。所以很自然的想法就是將該偽文本轉(zhuǎn)換為文檔坐標(biāo),然后通過比較該偽文檔與每個(gè)文檔的空間夾角,檢索出該偽文本的相關(guān)文檔。設(shè)Xq表示偽文本的列向量,其中該列代表文檔集合的索引詞,該列的值代表偽文本中該索引詞出現(xiàn)的次數(shù)。比如一個(gè)文檔集合有索引詞{T1,T2,T3},偽文本為t1,t3,t2,t1,則Xq={2,1,1}。獲得Xq后,通過公式

Dq?= XqT?T S-1

計(jì)算偽文檔的文檔坐標(biāo)。其中T和S分別代表奇異分解中得到的矩陣(S = T S DT).注意上面的公式中S-1代表S的逆矩陣。

Dq計(jì)算出來后,就可以迭代比較Dq和文檔集合中所有所有文檔,計(jì)算兩者個(gè)cosine夾角

6 LSA實(shí)踐

本節(jié)主要討論LSA的實(shí)現(xiàn),編程語言使用C++,環(huán)境Linux gcc,使用了GNU Scientific Library[5]。本節(jié)代碼可以在http://code.google.com/p/lsa-lda/找到。

1. 創(chuàng)建Term-Document矩陣

LSA是基于向量空間模型的,因此首先需要?jiǎng)?chuàng)建一個(gè)M x N的Term-Document矩陣,其中行表示每一個(gè)詞,列表示每一個(gè)文檔。而矩陣的值等于相應(yīng)詞的TF*IDF值。待檢索的文檔集合放在程序根目錄下的corpus文件夾,每一個(gè)文檔一個(gè)文件。

首先需要?jiǎng)?chuàng)建語料的單詞列表,作為T-D矩陣的列向量,每一個(gè)單詞對應(yīng)一個(gè)id。

[code=cpp]

CreateVectorSpace.cc

Function int CreateKeyWordMap()

// 循環(huán)讀入每個(gè)文檔

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

{

//omit . and ..

if((strcmp(ent->d_name,".&quot??==0)||(strcmp(ent->d_name,"..&quot??==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(); //分析單詞

[/code]

在循環(huán)的過程中,識(shí)別每一個(gè)單詞,并判斷該單詞是否為stop word。英文的stop word可以在ftp://ftp.cs.cornell.edu/pub/smart/english.stop找到。

[code=cpp]

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)++;

}

}

……

[/code]

接下來需要處理單詞,由于英文單詞有前綴和后綴,如單詞的單復(fù)數(shù)(book->books),過去時(shí)(like->liked),這些詞雖然形式不同但含義相同,因此要將它們處理為同一的形式,也就是單詞的原型。相關(guān)的算法為Porter Stemming[6]算法。

獲得單詞列表后,就可以構(gòu)造T-D矩陣了,過程是依次讀入每個(gè)文檔,遇到單詞列表中存在的詞,相應(yīng)的矩陣單元加1。這里用到了GSL的幾個(gè)函數(shù),用法可參考GSL手冊[5]

[code=cpp]

CreateVectorSpace.cc

Function CreateMatrix()

gsl_matrix* CreateMatrix()

{

……

// 分配T-D矩陣空間

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())

{

…..

// 如果當(dāng)前單詞在單詞列表中存在

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

{

// 矩陣相應(yīng)的單元值加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;

}

……

[/code]

現(xiàn)在已經(jīng)創(chuàng)建了T-D矩陣,但是矩陣單元值為單詞在文檔中出現(xiàn)的頻率,因此下一步是求每個(gè)單詞的TF*IDF值[7]。TF代表單詞在某一文檔中出現(xiàn)的頻率,IDF為inverse document frequency,代表的含義是如果一個(gè)單詞在很多文檔中都出現(xiàn)了,那么用它來區(qū)分文檔的價(jià)值就降低。具體公式:

[code=cpp]

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);

……

[/code]

至此T-D矩陣創(chuàng)建完成。

2. SVD分解

SVD分解使用GSL庫中的gsl_linalg_SV_decomp函數(shù)

[code=cpp]

SVD.cc

Function CountSVD(gsl_matrix *)

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);

}

[/code]

3. 降維

降維在程序你實(shí)現(xiàn)十分簡單,也就是給矩陣(由于是對角矩陣,因此程序里表示為向量)賦值零。

[code=cpp]

SVD.cc

Function ReduceDim(int)

void ReduceDim(int keep)

{

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

gsl_vector_set(s_vct,i,0);

}

[/code]

4. 查詢

SVD分解完成后,我們就已經(jīng)獲得了潛在語義空間,接下來就可以接受用戶的輸入,將偽文本轉(zhuǎn)換到文檔坐標(biāo),然后通過比較向量的夾角,找出相關(guān)文檔。

[code=cpp]

void Query(string query)

{

// transform query into LSA space

istringstream stream(query);

string word;

//為Xq創(chuàng)建gsl向量, Xq表示偽文本的列向量

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

// 為Dq創(chuàng)建gsl向量,Dq表示偽文本的文檔向量

gsl_vector * d_vct = gsl_vector_alloc(LSD);

// 首先計(jì)算Xq

while (stream >> word)

{

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

gsl_vector_set(q_vct,wordList[word],

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)));

//用文檔集合中每個(gè)文檔和Dq比較

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

{

……

// 求兩向量夾角,返回cosine值

relation = CompareVector(d_vct, temp_d_vct, LSD);

}

}

[/code]

5. 測試

我們先用以前討論過的文檔集

將C1~M4分別保存到9個(gè)文件里,放到corpus文件夾

運(yùn)行程序,輸入格式為lsa.out [query]

./lsa.out human computer interaction

可以看出與主題最相關(guān)的文檔是C3,其次是C1。C1~C5文件是同主題文檔,主題是人機(jī)互交,而M1~M4的共同主題是計(jì)算機(jī)圖形。而查詢”human computer interaction”顯然描述的是人機(jī)互交。因此也可以從結(jié)果看到C1~C5的相關(guān)度全部都高于M1~M4文檔。最后,觀察C3,C5文檔,它們并不包含任何查詢中的詞,而計(jì)算出的相似度卻不為0,并且C3的相似度達(dá)0.999658,這也正是LSA潛在語義的效果。

下面是文檔兩兩比較后的結(jié)果表格(已導(dǎo)入到Excel)

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

上圖非常清晰的顯示出了文檔的關(guān)系:

先來看[1~5][A~E]也就是第1~5行,

A~E列,由于文檔C1~C5是一個(gè)主題的文檔,所以可以看出[1~5][A~E]都大于0.9,而[1~5][F~I]都不超過0.5,也表明C1~C5文檔與M1~M4文檔主題是不相干的。

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

上面的討論表明,潛在語義分析在主題分類上效果明顯。如果設(shè)定一個(gè)分類的閾值,比如0.8,那么上面9個(gè)文檔就被自動(dòng)分為了{(lán)C1,C2,C3,C4,C5}和{M1,M2,M3,M4}

在另一個(gè)測試中,我從New York Times網(wǎng)站收集的6個(gè)主題,每個(gè)主題5篇文章

搜索” what a great day”結(jié)果如下:

偽文本坐標(biāo)(0.00402821,-0.0183549,0.00361756),每個(gè)文檔的相關(guān)度如上圖。如果設(shè)定檢索閾值為0.9,那么文檔movie2,sport4,art2會(huì)被返回。

7 總結(jié)

LSA通過對潛在語義空間的建模,提高的信息檢索的精確度。而后又有人提出了PLSA(Probabilistic latent semantic analysis)和LDA(Latent Dirichlet allocation),將LSA的思想帶入到概率統(tǒng)計(jì)模型中。

LSA對一詞多義問題依然沒有解決,僅僅解決了一義多詞。因?yàn)長SA將每一個(gè)詞表示為潛在語義空間中的一個(gè)點(diǎn),因此一個(gè)詞的多個(gè)意義在空間中對于的是一個(gè)點(diǎn),沒有被區(qū)分。

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

[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 (199??. "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/

本文中程序的代碼實(shí)現(xiàn)和LSA相關(guān)資料

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

LSA的WIKI條目,有LSA的大致介紹

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

Colorado大學(xué)的一個(gè)LSA項(xiàng)目,提供了基于LSA的terms比較,文本比較等

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

在線矩陣計(jì)算工具,可計(jì)算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).

Posted in?信息檢索,?機(jī)器學(xué)習(xí)|?Tagged?latent semantic analysis,?lsa,?信息檢索,?機(jī)器學(xué)習(xí),?潛在語義分析|?Leave a comment

總結(jié)

以上是生活随笔為你收集整理的Latent semantic analysis note(LSA)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。