潜在语义分析Latent semantic analysis note(LSA)原理及代码实现

文章参考: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的核心。

  1. fromnumpy importzeros
  2. from scipy.linalgimport svd

Stopwords 是停用词 ignorechars是无用的标点

  1. titles =
  2. [
  3. "The Neatest Little Guide to Stock MarketInvesting",
  4. "Investing For Dummies, 4thEdition",
  5. "The Little Book of Common SenseInvesting: The Only Way to Guarantee Your Fair Share of StockMarket Returns",
  6. "The Little Book of ValueInvesting",
  7. "Value Investing: From Graham to Buffettand Beyond",
  8. "Rich Dad‘s Guide toInvesting: What the Rich Invest in, That the Poor and the MiddleClass Do Not!",
  9. "Investing in Real Estate, 5thEdition",
  10. "Stock Investing ForDummies",
  11. "Rich Dad‘s Advisors: The ABC‘s of RealEstate Investing: The Secrets of Finding Hidden Profits MostInvestors Miss"
  12. ]
  13. stopwords = [‘and‘,‘edition‘,‘for‘,‘in‘,‘little‘,‘of‘,‘the‘,‘to‘]
  14. ignorechars = ‘‘‘‘‘,:‘!‘‘‘

这里定义了一个LSA的类,包括其初始化过程wdict是词典,dcount用来记录文档号。

  1. classLSA(object):
  2. def__init__(self,stopwords, ignorechars):
  3. self.stopwords =stopwords
  4. self.ignorechars =ignorechars
  5. self.wdict ={}
  6. self.dcount =0

这个函数就是把文档拆成词并滤除停用词和标点,剩下的词会把其出现的文档号填入到wdict中去,例如,词book出现在标题3和4中,则我们有self.wdict[‘book‘]= [3, 4]。相当于建了一下倒排。

  1. defparse(self,doc):
  2. words = doc.split(); for w inwords:
  3. w = w.lower().translate(None, self.ignorechars)
  4. if win self.stopwords:
  5. continue
  6. elif win self.wdict:
  7. self.wdict[w].append(self.dcount)
  8. else:
  9. self.wdict[w] =[self.dcount]
  10. self.dcount+= 1

所有的文档被解析之后,所有出现的词(也就是词典的keys)被取出并且排序。建立一个矩阵,其行数是词的个数,列数是文档个数。最后,所有的词和文档对所对应的矩阵单元的值被统计出来。

  1. defbuild(self):
  2. self.keys =[k for kinself.wdict.keys()iflen(self.wdict[k]) >1]
  3. self.keys.sort()
  4. self.A =zeros([len(self.keys),self.dcount])
  5. for i, kin enumerate(self.keys):
  6. for din self.wdict[k]:
  7. 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()

程序运行结果:


潜在语义分析Latent semantic analysis note(LSA)原理及代码实现,布布扣,bubuko.com

时间: 2024-12-26 13:24:32

潜在语义分析Latent semantic analysis note(LSA)原理及代码实现的相关文章

潜在语义分析Latent semantic analysis note(LSA)原理及代码

文章引用:http://blog.sina.com.cn/s/blog_62a9902f0101cjl3.html Latent Semantic Analysis (LSA)也被称为Latent Semantic Indexing(LSI),理解就是通过分析文档去发现这些文档中潜在的意思和概念. 如果每一个词仅表示一个概念.而且每一个概念只被一个词所描写叙述.LSA将很easy(从词到概念存在一个简单的映射关系) 不幸的是,这个问题并没有如此简单.由于存在不同的词表示同一个意思(同义词).一个

Latent semantic analysis note(LSA)

1 LSA Introduction LSA(latent semantic analysis)潜在语义分析,也被称为LSI(latent semantic index),是Scott Deerwester, Susan T. Dumais等人在1990年提出来的一种新的索引和检索方法.该方法和传统向量空间模型(vector space model)一样使用向量来表示词(terms)和文档(documents),并通过向量间的关系(如夹角)来判断词及文档间的关系:而不同的是,LSA将词和文档映射

Latent Semantic Analysis(LSA)

背景:什么是LSA? Latent Semantic Analysis(LSA)中文翻译为潜语义分析,也被叫做Latent Semantic Indexing ( LSI ).意思是指通过分析一堆(不止一个)文档去发现这些文档中潜在的意思和概念,什么叫潜在的意思?我第一次看到这个解释,直接懵逼.其实就是发现文档的中心主题吧?假设每个词仅表示一个概念,并且每个概念仅仅被一个词所描述,LSA将非常简单(从词到概念存在一个简单的映射关系). 根据常识我们知道两个很常见的语言现象:1. 存在不同的词表示

主题模型之概率潜在语义分析(Probabilistic Latent Semantic Analysis)

上一篇总结了潜在语义分析(Latent Semantic Analysis, LSA),LSA主要使用了线性代数中奇异值分解的方法,但是并没有严格的概率推导,由于文本文档的维度往往很高,如果在主题聚类中单纯的使用奇异值分解计算复杂度会很高,使用概率推导可以使用一些优化迭代算法来求解. Thomas Hofmann 于1998年根据似然原理定义了生成模型并由此提出了概率潜在语义分析模型(Probabilistic Latent Semantic Analysis),简称PLSA. PLSA属于概率

主题模型之潜在语义分析(Latent Semantic Analysis)

主题模型(Topic Models)是一套试图在大量文档中发现潜在主题结构的机器学习模型,主题模型通过分析文本中的词来发现文档中的主题.主题之间的联系方式和主题的发展.通过主题模型可以使我们组织和总结无法人工标注的海量电子文档.较早的主题模型有混合语言模型(Mixture of Unigram),潜在语义索引(Lantent Semantic Index,LSI),概率潜在语义索引(Probabilistic Latent Semantic Indexing,PLSI).主题模型中文档是由主题组

Latent Semantic Analysis (LSA) 模型 学习笔记

Latent Semantic Analysis (LSA) 模型 学习笔记 Latent Semantic Analysis 模型,隐性语义分析,也就是我们常说的LSA模型.后面还有他的兄弟PLSA和LDA模型,这个我们后面再说.这几个都是NLP中比较经典的模型!学习这个模型,主要总结到了三个方面:LSA模型可以应用在哪儿?LSA的理论部分,以及LSA的优缺点分析. 1. LSA的应用 LSA可以在VSM中降低样本的维度,并且可以从文本中发现隐含的语义维度. 在VSM中,文档被表示成由特征词出

Probability Latent Semantic Analysis (PLSA) 模型 学习笔记

Probability Latent Semantic Analysis (PLSA) 模型 学习笔记 PLSA是前面LSA的兄弟版,相比于LSA而言,PLSA定义了概率模型,而且每个变量以及相应的概率分布和条件概率分布都有明确的物理解释了.这篇博文我们分三部分来说PLSA:基本思想,EM算法推导,以及优缺点分析. 1.  PLSA的基本思想 PLSA是一种主题模型topic model,是针对文本中隐含的主题来建模的方法.PLSA就是给定了文档d之后,需要以一定的概率选择与文档相对应的主题z,

PLSA(Probabilistic Latent Semantic Analysis)模型

对于上次说的LSA模型,它能解决多个单词一个意义,但是不能解决多个意义一个单词,就是多义词的问题,而PLSA模型能较好的解决这个问题,首先说下,这个模型的假设: 1 假设生成一个单词的过程是这样的:首先选择一篇文章di,然后再次基础上选择一个潜变量zk(可以理解为主题),最后在此基础上再在生成一个单词.如果p(di,wj)表示第i个文本中有第j个单词的概率,根据假设有: 2 另外一个非常重要的假设是,单词wj和文本di是基于潜变量条件独立的,即: 与LSA模型相似,我们首先得到了一个加权词频矩阵

备注词条:潜在语义分析(lsa)

潜在语义分析Latent Semantic Analysis (LSA)也被叫做Latent Semantic Indexing(LSI),是通过分析文档去发现这些文档中潜在的意思和概念,即建立语义(词汇族)与文档潜在含义的关系判别,它把词和文档都映射到一个'概念'空间并在这个空间内进行比较(注:也就是一种降维技术). 潜在语义分析(Latent Semantic Analysis),是语义学的一个新的分支.传统的语义学通常研究字.词的含义以及词与词之间的关系,如同义,近义,反义等等.潜在语义分