1. 问题描述

给你若干篇文档,找出这些文档中最相似的两篇文档?

相似性,可以用距离来衡量。而在数学上,可使用余弦来计算两个向量的距离。

\[cos(\vec a, \vec b)=\frac {\vec a*\vec b}{||\vec a||*||\vec b||}\]

因此,用向量来表示文档,然后就可以用余弦来计算两篇文章之间的相似度了。

2. 词袋模型

一篇文档里面有很多很多句子,每个句子又是由一个个的词组成。词袋模型,通俗地讲,就是:把一篇文档看成词袋,里面装着一个个的词。

从而,将一篇文档转化成了一个个的词(或者称之为 term),显然地,文档转化成一个个的词之后,词与词之间的顺序关系丢失了。

3. TF-IDF

在计算文档之间相似度之前,会有一些前提条件:

  • 我们有一个文档集合C,文档集合C里面一共有N篇文档
  • 我们有一个词典D,或者叫词库(Vocabulary),词库里面一共有M个词

3.1 文档到向量的转化

向量是有长度的,向量中的每个元素是数值,比如一个三维实值向量:(1.2,2.8,4.5)

首先将文档通过词袋模型转化成一个个的词,一般地,由于文档中的词都会存在于词典D中,定义一个M维向量(M等于词典大小),若文档中的某个词在词典中出现了,就给这个词赋一个实数值。若未出现,则在相应位置处赋值为0

3.2 使用TF-IDF 衡量每个词(term)的权重

在给定的文档集合C和词典D的情况下,如何来衡量一个词(term)的权重呢?即如何计算这个实数值呢?

3.2.1 tf值

tf(term frequency),是指 term 在某篇文档中出现的频率。假设文档集合中共有10篇文章,词:''国家'',在文档1中出现了6次,那么对于文档1而言,'国家'这个词的tf值为6。因此,tf 是针对单篇文档而言的,即:某个词在这篇文档中出现了多少次。词频是计算文档得分的一个因子,因此为了计算某篇文档的得分,使用的词频指的就是term在这篇文档中出现的次数,而不是term在所有文档中出现的次数。

3.2.2 idf值

'国家'这个词在文档1中的idf值 由 词(term) 出现在各个文档中数目来决定,比如'国家'一共在8篇文档中出现了,那么对于文档1而言,'国家'这个词的idf值由如下公式计算:

\[idf_t=log\frac{N}{df_t}\]

其中,N=10 表示文档集合中共有10篇文章。\(df_t=8\),表示 term 国家 在8篇文档中出现了。因此,idf 值是针对所有文档(文档集合)而言的,即:数一数这个词都出现在哪些文档中。

而TF-IDF,就是将tf值乘以idf值:

\[TF-IDF=tf*idf\]

前面提到,将文档向量化,需要给文档中的每个词赋一个实数值,这个实数值,就是通过tf*idf得到。

4. 总结

在给定文档集合C和词典D的条件下,将某篇文档通过词袋模型表示成一个个的词,而后根据 TF-IDF 为每个词计算出一个实数值;

由于词典D的大小为M,因此将这篇文档转化成一个M维向量,如果词典中某个词未出现在文档中,则这个词的在向量中对应的元素为0,若某个词出现在文档中,则这个词在向量中对应的元素值为这个词的tf-idf值。这样,就把文档表示成向量了,而这就是 向量空间模型(vector space model)。从这里也可看出:向量空间模型并没有catch住词(term)与词(term)之间的关系,它假设各个term之间是相互独立的。即:VSM implies the assumption on the independence between terms
而有了文档向量,也就可以用余弦公式计算文档之间的相似度了。

由于词典一般比较大,比如20万个词左右的汉语词典,而一篇文档中一般只包含几百个词,因此可看出:文档向量是很稀疏的

另外,由于对于文档而言,词与词之间是有顺序的,比如文档开头是哪些词,中间有哪些词,结尾又是哪些词,但表示成向量之后,这个 顺序 信息丢失了。比如下面2篇文档,它们的文档向量是一样的。

Mary is quick than John
John is quick than Mary

总之,在我看来,向量空间模型是一种将文档转化成向量的方式,文档转化成了向量,从而可以在同一维度的空间中表示一个个的文档。向量中的每个元素是一个个的实数,每个元素对应着一个 词(term),实数 是通过tf-idf计算出来的。由此看来,tf-idf也仅仅是一种将词(term)转化成实数的方式,当然我们也可以通过其他方法将 词 转化成实数。而这里的 词 则是由词典定义的,若词典中的某个词 在文档中,则计算这个词的tf-idf值,若某个词不在文档中,则这个词对应的向量元素为0。因此,得到的文档向量是M维的,其中M就是词典的大小---词典中词的个数。

将文档转化成了向量,文档之间的比较,就可以转化成向量的比较。因此,就能回答给定若干篇文档,哪两篇文档最相关这样的问题了。在实际应用中,比如Lucene中的TF-IDF Similarity就是基于VSM来实现的。从VSM Model到Lucene Conceptual Scoring Formula 再到 Lucene Practical Scoring Formula,解释了在实际应用中,我们输入一个查询字符串,Lucene是如何计算文档的得分,从而找出与查询字符串最相关的文档的。

参考:《An Introduction to Information Retrieval》第6章

原文:http://www.cnblogs.com/hapjin/p/8687527.html

向量空间模型(Vector Space Model)的理解的更多相关文章

  1. Solr相似度名词:VSM(Vector Space Model)向量空间模型

    最近想学习下Lucene ,以前运行的Demo就感觉很神奇,什么原理呢,尤其是查找相似度最高的.最优的结果.索性就直接跳到这个问题看,很多资料都提到了VSM(Vector Space Model)即向 ...

  2. 向量空间模型(Vector Space Model)

    搜索结果排序是搜索引擎最核心的构成部分,很大程度上决定了搜索引擎的质量好坏.虽然搜索引擎在实际结果排序时考虑了上百个相关因子,但最重要的因素还是用户查询与网页内容的相关性.(ps:百度最臭名朝著的“竞 ...

  3. 转:Lucene之计算相似度模型VSM(Vector Space Model) : tf-idf与交叉熵关系,cos余弦相似度

    原文:http://blog.csdn.net/zhangbinfly/article/details/7734118 最近想学习下Lucene ,以前运行的Demo就感觉很神奇,什么原理呢,尤其是查 ...

  4. ES搜索排序,文档相关度评分介绍——Vector Space Model

    Vector Space Model The vector space model provides a way of comparing a multiterm query against a do ...

  5. 向量空间模型实现文档查询(Vector Space Model to realize document query)

    xml中文档(query)的结构: <topic> <number>CIRB010TopicZH006</number> <title>科索沃難民潮&l ...

  6. [IR课程笔记]向量空间模型(Vector Space Model)

    VSM思想 把文档表示成R|v|上的向量,从而可以计算文档与文档之间的相似度(根据欧氏距离或者余弦夹角) 那么,如何将文档将文档表示为向量呢? 首先,需要选取基向量/dimensions,基向量须是线 ...

  7. 扩展:向量空间模型算法(Vector Space Model)

  8. 12.扩展:向量空间模型算法(Vector Space Model)

  9. 向量空间模型(VSM)在文档相似度计算上的简单介绍

    C#实现在: http://blog.csdn.net/Felomeng/archive/2009/03/25/4023990.aspx 向量空间模型(VSM:Vector space model)是 ...

随机推荐

  1. 【BZOJ5288】[HNOI2018]游戏(拓扑排序)

    [BZOJ5288][HNOI2018]游戏(拓扑排序) 题面 BZOJ 洛谷 题解 去年省选的时候这题给我乱搞整过去整过去了,也是虐心了.... 所以当然是来讲正儿八经的正确做法啦. 很明显,我们需 ...

  2. AXURE 8弄一个轮播图的步骤

    这个图是网上找到,7.0可以使用. 如果是8.0.没有找到"动态面板"这个地方,如下图所示

  3. python学习day5 数据类型Ⅲ(字典)

    day5 字典 回顾&补充 面试题 #数据类型判断a = 1 #intb = (1) #intc = ('1') #strd = (1,) #tuple int py2/py3 除法 强制转换 ...

  4. C#面向对象中类的继承和扫描顺序和接口

    1.   类的分类:普通基类.抽象基类(abstract  class)1.   类的扫描顺序:a.先近后远 b.(向上扫描)以谁身份声明的变量就在谁身上开始扫描, 2.   扫描的特殊情况:普通基类 ...

  5. 在html页面通过js实现复制粘贴功能

    前言:要实现这个功能,常用的方式大概分为两类,第一种就是上插件,这个网上有大把,第二种就是直接用几行JS来实现. 这次说第二种实现方式,这方式有很大的局限性,只能用表单元素,并且不能设置disable ...

  6. 3.git 分支操作

    1.git branch 查看分支 git branch -a  查看远程仓库分支 结果显示,只有一个master分支,项目刚开始默认只有一个分支,名字叫做master,一般都不会直接在master上 ...

  7. 3 字节的 UTF-8 序列的字节 2 无效

    由于目前写完了[消息队列]模块,想做个单元测试,所以就利用spring的import标签,将mq的配置文件加入了配置.结果出现了<3 字节的 UTF-8 序列的字节 2 无效>这个问题. ...

  8. JS事件(二)事件对象

    html事件处理程序中,变量event中保存着事件对象 <button onclick="alert(ev.type)" id="btn">clic ...

  9. java的零拷贝机制

    转:https://blog.csdn.net/zhouhao88410234/article/details/77574689?fps=1&locationNum=9 为何要懂零拷贝原理?因 ...

  10. golang rpc介绍

    rpc包提供了通过网络或其他I/O连接对一个对象的导出方法的访问.服务端注册一个对象,使它作为一个服务被暴露,服务的名字是该对象的类型名.注册之后,对象的导出方法就可以被远程访问.服务端可以注册多个不 ...