文章参考:http://blog.sina.com.cn/s/blog_62a9902f0101cjl3.html
Latent Semantic Analysis (LSA)也被叫做Latent Semantic Indexing(LSI),从字面上的意思理解就是通过分析文档去发现这些文档中潜在的意思和概念。假设每个词仅表示一个概念,并且每个概念仅仅被一个 词所描述,LSA将非常简单(从词到概念存在一个简单的映射关系)
不幸的是,这个问题并没有如此简单,因为存在不同的词表示同一个意思(同义词),一个词表示多个意思,所有这种二义性(多义性)都会混淆概念以至于有时就算是人也很难理解。
例如,银行这个词和抵押、贷款、利率一起出现时往往表示金融机构。但是,和鱼饵,投掷、鱼一起出现时往往表示河岸。
潜语义分析工作原理
潜语义分析(Latent SemanticAnalysis)源自问题:如何从搜索query中找到相关的文档。当我们试图通过比较词来找到相关的文本时,存在着难以解决的局限 性,那就是在搜索中我们实际想要去比较的不是词,而是隐藏在词之后的意义和概念。潜语义分析试图去解决这个问题,它把词和文档都映射到一个‘概念’空间并 在这个空间内进行比较(注:也就是一种降维技术)。
当文档的作者写作的时候,对于词语有着非常宽泛的选择。不同的作者对于词语的选择有着不同的偏好,这样会导致概念的混淆。这种对于词语的随机选择在 词-概念 的关系中引入了噪音。LSA滤除了这样的一些噪音,并且还能够从全部的文档中找到最小的概念集合(为什么是最小?)。
为了让这个难题更好解决,LSA引入一些重要的简化:
1. 文档被表示为”一堆词(bags of words)”,因此词在文档中出现的位置并不重要,只有一个词的出现次数。
2.概念被表示成经常出现在一起的一些词的某种模式。例如“leash”(栓狗的皮带)、“treat”、“obey”(服从)经常出现在关于训练狗的文档中。
3.词被认为只有一个意思。这个显然会有反例(bank表示河岸或者金融机构),但是这可以使得问题变得更加容易。(这个简化会有怎样的缺陷呢?)
接下来看一个LSA的小例子,Next Part:
一个简单的小例子
一个小例子,我在amazon.com上搜索”investing”(投资) 并且取top10搜索结果的书名。其中一个被废弃了,因为它只含有一个索引词(indexword)和其它标题相同。索引词可以是任何满足下列条件的词:
1. 在2个或者2个以上标题中出现 并且
2. 不是那种特别常见的词例如 “and”, ”the” 这种(停用词-stopword)。这种词没有包含进来是因为他们本身不存在什么意义。
在这个例子中,我们拿掉了如下停用词:“and”, “edition”, “for”, “in”,“little”, “of”, “the”, “to”.
下面就是那9个标题,索引词(在2个或2个以上标题出现过的非停用词)被下划线标注:
1. The Neatest Little Guide toStock Market Investing
2. Investing For Dummies, 4th Edition
3. The Little Book of Common SenseInvesting: The OnlyWay to Guarantee Your Fair Share ofStock Market Returns
4. The Little Book ofValue Investing
5. ValueInvesting: From Graham to Buffett and Beyond
6. RichDad's Guide toInvesting: What theRich Invest in,That the Poor and the Middle Class Do Not!
7. Investing in Real Estate, 5th Edition
8. StockInvesting ForDummies
9. RichDad's Advisors: The ABC's ofReal Estate Investing: TheSecrets of Finding Hidden Profits Most Investors Miss
在这个例子里面应用了LSA,我们可以在XY轴的图中画出词和标题的位置(只有2维),并且识别出标题的聚类。蓝色圆圈表示9个标题,红色方块表示11个 索引词。我们不但能够画出标题的聚类,并且由于索引词可以被画在标题一起,我们还可以给这些聚类打标签。例如,蓝色的聚类,包含了T7和T9,是关于 realestate(房地产)的,绿色的聚类,包含了标题T2,T4,T5和T8,是讲valueinvesting(价值投资)的,最后是红色的聚 类,包含了标题T1和T3,是讲stockmarket(股票市场)的。标题T6是孤立点(outlier)
LSA的第一步是要去创建词到标题(文档)的矩阵。在这个矩阵里,每一个索引词占据了一行,每一个标题占据一列。每一个 单元(cell)包含了这个词出现在那个标题中的次数。例如,词”book”出现在T3中一次,出现在T4中一次,而”investing”在所有标题中 都出现了一次。一般来说,在LSA中的矩阵会非常大而且会非常稀疏(大部分的单元都是0)。这是因为每个标题或者文档一般只包含所有词汇的一小部分。更复 杂的LSA算法会利用这种稀疏性去改善空间和时间复杂度。
在这篇文章中,我们用python代码去实现LSA的所有步骤。我们将介绍所有的代码。Python代码可以在这里被下到(见上)。需要安装NumPy和 SciPy这两个库。
NumPy是python的数值计算类,用到了zeros(初始化矩阵),scipy.linalg这个线性代数的库中,我们引入了svd函数也就是做奇异值分解,LSA的核心。
- fromnumpy importzeros
- from scipy.linalgimport svd
Stopwords 是停用词 ignorechars是无用的标点
- titles =
- [
- "The Neatest Little Guide to Stock MarketInvesting",
- "Investing For Dummies, 4thEdition",
- "The Little Book of Common SenseInvesting: The Only Way to Guarantee Your Fair Share of StockMarket Returns",
- "The Little Book of ValueInvesting",
- "Value Investing: From Graham to Buffettand Beyond",
- "Rich Dad's Guide toInvesting: What the Rich Invest in, That the Poor and the MiddleClass Do Not!",
- "Investing in Real Estate, 5thEdition",
- "Stock Investing ForDummies",
- "Rich Dad's Advisors: The ABC's of RealEstate Investing: The Secrets of Finding Hidden Profits MostInvestors Miss"
- ]
- stopwords = ['and','edition','for','in','little','of','the','to']
- ignorechars = ''''',:'!'''
这里定义了一个LSA的类,包括其初始化过程wdict是词典,dcount用来记录文档号。
- classLSA(object):
- def__init__(self,stopwords, ignorechars):
- self.stopwords =stopwords
- self.ignorechars =ignorechars
- self.wdict ={}
- self.dcount =0
这个函数就是把文档拆成词并滤除停用词和标点,剩下的词会把其出现的文档号填入到wdict中去,例如,词book出现在标题3和4中,则我们有self.wdict['book']= [3, 4]。相当于建了一下倒排。
- defparse(self,doc):
- words = doc.split(); for w inwords:
- w = w.lower().translate(None, self.ignorechars)
- if win self.stopwords:
- continue
- elif win self.wdict:
- self.wdict[w].append(self.dcount)
- else:
- self.wdict[w] =[self.dcount]
- self.dcount+= 1
所有的文档被解析之后,所有出现的词(也就是词典的keys)被取出并且排序。建立一个矩阵,其行数是词的个数,列数是文档个数。最后,所有的词和文档对所对应的矩阵单元的值被统计出来。
- defbuild(self):
- self.keys =[k for kinself.wdict.keys()iflen(self.wdict[k]) >1]
- self.keys.sort()
- self.A =zeros([len(self.keys),self.dcount])
- for i, kin enumerate(self.keys):
- for din self.wdict[k]:
- self.A[i,d]+= 1
把矩阵打印出来并作图
def printA(self):
print self.A
#奇异值分解矩阵为u,s,vt
u,s,vt = svd(self.A)
print """\r"""
print u
print """\r"""
print s
print """\r"""
print vt
print """\r"""
#画图的标题和x轴和y轴的维度名称
plt.title("LSI")
plt.xlabel(u'dimention2')
plt.ylabel(u'dimention3')
#画文档标题
titles = ['T1','T2','T3','T4','T5','T6','T7','T8','T9']
vdemention2 = vt[1]
vdemention3 = vt[2]
for j in range(len(vdemention2)):
text(vdemention2[j],vdemention3[j],titles[j])
plot(vdemention2, vdemention3, '.')
#画词语
ut = u.T
demention2 = ut[1]
demention3 = ut[2]
for i in range(len(demention2)):
text(demention2[i],demention3[i],self.keys[i])
plot(demention2, demention3, '.')
程序入口:
mylsa = LSA(stopwords, ignorechars)
for t in titles:
mylsa.parse(t)
mylsa.build()
mylsa.printA()
代码使用winPython自带spyder运行,以下部分是源代码:
- # -*- coding: utf-8 -*-
- """
- Created on Wed Jun 11 17:02:39 2014
- @author: modified by zhouxu,add plot
- """
- from numpy import zeros
- import numpy as np
- from scipy.linalg import svd
- titles =[
- "The Neatest Little Guide to Stock Market Investing",
- "Investing For Dummies, 4th Edition",
- "The Little Book of Common Sense Investing: The Only Way to Guarantee Your Fair Share of Stock Market Returns",
- "The Little Book of Value Investing",
- "Value Investing: From Graham to Buffett and Beyond",
- "Rich Dad's Guide to Investing: What the Rich Invest in, That the Poor and the Middle Class Do Not!",
- "Investing in Real Estate, 5th Edition",
- "Stock Investing For Dummies",
- "Rich Dad's Advisors: The ABC's of Real Estate Investing: The Secrets of Finding Hidden Profits Most Investors Miss"
- ]
- stopwords = ['and','edition','for','in','little','of','the','to']
- ignorechars = ''''''',:'!'''
- class LSA(object):
- def __init__(self, stopwords, ignorechars):
- self.stopwords = stopwords
- self.ignorechars = ignorechars
- self.wdict = {}
- self.dcount = 0
- def parse(self, doc):
- words = doc.split();
- for w in words:
- #print self.dcount
- w = w.lower().translate(None, self.ignorechars)
- if w in self.stopwords:
- continue
- elif w in self.wdict:
- self.wdict[w].append(self.dcount)
- else:
- self.wdict[w] = [self.dcount]
- self.dcount += 1
- def build(self):
- self.keys = [k for k in self.wdict.keys() if len(self.wdict[k]) > 1]
- self.keys.sort()
- print self.keys
- self.A = zeros([len(self.keys), self.dcount])
- for i, k in enumerate(self.keys):
- for d in self.wdict[k]:
- self.A[i,d] += 1
- def printA(self):
- print self.A
- u,s,vt = svd(self.A)
- print """\r"""
- print u
- print """\r"""
- print s
- print """\r"""
- print vt
- print """\r"""
- plt.title("LSA")
- plt.xlabel(u'dimention2')
- plt.ylabel(u'dimention3')
- titles = ['T1','T2','T3','T4','T5','T6','T7','T8','T9']
- vdemention2 = vt[1]
- vdemention3 = vt[2]
- for j in range(len(vdemention2)):
- text(vdemention2[j],vdemention3[j],titles[j])
- plot(vdemention2, vdemention3, '.')
- ut = u.T
- demention2 = ut[1]
- demention3 = ut[2]
- for i in range(len(demention2)):
- text(demention2[i],demention3[i],self.keys[i])
- plot(demention2, demention3, '.')
- mylsa = LSA(stopwords, ignorechars)
- for t in titles:
- mylsa.parse(t)
- mylsa.build()
- mylsa.printA()
程序运行结果:
http://blog.csdn.net/bob007/article/details/30496559
相关推荐
Latent Semantic Analysis, Thomas K Landauer, Susan T. Dutnais, 1997; A Solution to Plato's Problem: The Latent Semantic Analysis Theory of Acquisition, Induction, and Representation of Knowledge
潜在语义分析(Latent Semantic Analysis,简称LSA),也被称作潜在语义索引(Latent Semantic Indexing,简称LSI),是一种由Scott Deerwester、Susan T. Dumais等研究者在1990年提出的信息检索技术。它主要应用于...
《概率潜在语义分析》(Probabilistic Latent Semantic Analysis,简称PLSA)是一项在信息检索、自然语言处理、文本挖掘等领域具有广泛应用前景的技术。它由Thomas Hofmann提出,作为对传统潜在语义分析(LSA)的一种...
### 潜在语义分析(Latent Semantic Analysis, LSA)简介 #### 一、潜在语义分析的概念与背景 潜在语义分析是一种理论和技术,通过统计计算应用于大规模文本语料库来提取和表示词语的上下文用法含义。其核心思想是...
**Latent Semantic Analysis (LSA) 是一种在信息检索和自然语言处理领域广泛使用的文本分析技术。它通过奇异值分解(Singular Value Decomposition, SVD)来挖掘文本语料库中的潜在语义结构,从而改善传统基于词频的...
潜在语义分析(Latent Semantic Analysis, LSA)是一种理论与方法,它通过统计计算来提取并表示词语在文本中的上下文使用意义。这种方法的基础理念是:一个词出现或不出现的所有上下文集合共同构成了该词意义相似性...
潜在语义分析(Latent Semantic Analysis)或者潜在语义索引(Latent Semantic Index),是1988年S.T. Dumais等人提出的一种新的信息检索代数模型,是用于知识获取和展示的计算理论和方法,它使用统计计算的方法对...
**Probabilistic Latent Semantic Analysis** is a technique that builds upon the foundations of Latent Semantic Analysis (LSA) but offers a more principled approach based on statistical inference....
这篇硕士论文《基于潜在语义分析的大学概况中文问答系统》是大连理工大学2004年的一份学术成果,主要探讨了如何运用自然语言处理技术,特别是潜在语义分析(Latent Semantic Analysis, LSA),来构建一个有效的中文...
针对这些问题,提出了一种基于潜在语义分析(latent semantic analysis,LSA)的文本相似矩阵构造方法,利用奇异值分解(singular value decomposition,SVD)降维,在低维的语义空间表示文本,以此来提高同类文本间...
1. **潜在语义分析(Latent Semantic Analysis, LSA)**:LSA是一种经典的文本分析技术,通过降维处理来揭示文本中的隐藏主题。它基于奇异值分解(Singular Value Decomposition, SVD)将高维词频矩阵转化为低维空间...
潜在语义分析(Latent Semantic Analysis,LSA)是一种用于理解和表示文档集合的技术,它通过数学手段揭示文本中的语义关系,从而帮助我们理解文档之间的相似性和关联性。 在这一章中,李航老师可能会涵盖以下几个...
本文介绍了一种新的自动化文档索引方法——概率潜在语义索引 (Probabilistic Latent Semantic Indexing),该方法基于统计潜在类模型(factor analysis of count data)。 #### 概率潜在语义索引原理 **概率潜在语义...
"SVD and LSI Tutorial 4: Latent Semantic Indexing (LSI) How-to Calculations" 指的是该文档是一篇教程,涵盖了如何进行奇异值分解(SVD)和潜在语义索引(LSI)的计算。 【描述】 在描述中提到,这篇教程会指导...
潜在语义分析(Latent Semantic Analysis,简称 LSA)是一种在文本挖掘和信息检索领域广泛应用的技术,它通过数学方法揭示文本集合中隐藏的语义结构。lsa 在 Java 中的实现通常涉及多个步骤,包括预处理、词频统计、...
潜在语义分析 潜在思维分析(LSA)是一种理论和自然语言处理方法,用于分析一组文档与文档中包含的术语之间的关系。 一种称为“奇异值分解(SVD)”的数学技术用于检查非结构化数据,以查找术语和概念之间的隐藏关系...
潜在语义分析(LSA)就是一种用来揭示这种话题结构的无监督学习技术。LSA的核心在于对单词-文本矩阵进行奇异值分解(Singular Value Decomposition, SVD),以此来捕获文本数据中的隐藏模式。 在LSA中,我们首先...
用于文本语义分析的潜在语义分析算法LSA(Latent Semantic Analysis),包含详细的函数说明,原理分析及数据。相比原来版本的LSA,增加了文件demo.m以增加可视化效果,更有利于读者使用。