您的位置:首页 > 其它

使用向量空间模型(df-idf)计算搜索文档与查询词的相关性

2015-07-19 01:44 459 查看
如果要实现一个搜索引擎,当搜索到与用户查询相关的文档后,需要按照搜索文档与查询词相关性的先后顺序显示文章标题与概要,所以需要一种办法计算用户查询和搜索文档的相关性,然后按照相关性由高到低进行排序。

那如何计算用户查询和搜索文档的相关性呢?在解决这个问题之前,需要先解决如何计算两篇文档的相关性,因为我们可以把用户查询看做一个特殊的文档,如果把“计算两篇文档的相关性”这个问题解决了,“计算查询词与搜索文档的相关性”也就迎刃而解了。

方法之一就是使用向量空间模型,向量空间模型它作为文档表示和相似性计算的工具,不仅仅在搜索领域,在自然语言处理、文本挖掘等其他领域也是普遍采用的有效工具。

[b](1)文档表示[/b]

向量空间模型把每个文档看做是由t维特征组成的一个向量,特征的定义可以采用不同方式,可以是单词、词组、N-gram片段等多种形式,最常用的还是以单词作为特征。其中每个特征会根据一定依据计算其权重,这t维带有权重的特征共同构成一个文档,以此来表示文档的主体内容。

也就是说我们要从一篇文档中找出最能代表该篇文档的特征词,然后根据每个特征词的重要性赋予不同的权重。在向量空间模型里,特征权重的计算框架一般被称做Tf*IDF框架,它基于如下思想:在一篇文章中某个单词出现的次数越多并且它在其他文章中出现的次数越少,它越能代表该篇文档的内容,权重越大。所以这一计算框架主要考虑两个计算因子:词频Tf和逆文档频率IDF。

[b](2)中文分词和停用词[/b]

在介绍TF和IDF之前先介绍一下中文分词和停用词。因为由(1)知,每篇文档的主体内容可以由最能代表它内容的特征词表示,但是对于中文文档来说,文档是由句子组成的,所以首先需要把句子分成一个个单词,比如句子“我是中国人”需要分成“我/是/中国/人”,才能计算这些分好单词的权值,我用过的中文分词有中科院NLPIR系统结巴分词

文档总有一些比如”的”、”是”、”在”这一类最常用的词,它们叫做”停用词”(stop words),对找到结果毫无帮助,所以计算特征词权重时需要把它们过滤掉。实际操作中通常会有一个停用词文件,事先需要读取该文件获取所有停用词,判断一个词是否是停用词,只需要在停用词表查找即可。

[b](3)词频因子TF[/b]

TF计算因子代表了词频,即一个单词在文档中出现的次数,一般来说,在某个文档中反复出现的单词,往往能够表征文档的主题信息,即Tf值越大,越能代表文档所反映的内容,那么应该给于这个单词更大的权值。

具体计算词频因子的时候,基于不同的出发点,可以采用不同的计算公式。

最直接是使用词频数作为TF。

一种词频因子的变体计算公式是:WTf=1+log(Tf),即将词频数值Tf取log值作为词频权值,比如单词在文档中出现过4次,则它的词频因子权值为3。公式中加1是为了考虑词频等于1的情况,如果不加1只计算log(TF),那么WTf就等于0了。之所以要对词频取log,是基于如下考虑:如果一个单词出现了10次,也不应该在计算特征权值时,比出现1次的情况权值大10倍,所以加入log抑制这种过大的差异。

另外一种单词词频因子的变体计算公式是:WTf=α+(1−α)∗Tf/max(Tf),α是调节因子,过去经验取值0.5,新的研究表明取值为0.4效果最好。公式中的Tf代表这个单词的实际词频数目,而max(Tf)代表了文档中所有单词出现次数最多的那个单词对应的词频数目。之所以要如此操作,主要出于对长文档的一种抑制,因为如果文档较长,与短文档相比,则长文档中所有单词的Tf值会普遍比短文档的值高,但是这并不意味着长文档与查询更相关。用单词实际词频除以文档中最高词频,等于将绝对的数值进行了规范化转换,公式的含义就转换为:同一个文档内单词之间的相对重要性。即使一个文档很长,单词词频普遍很高,但是除以文档最高词频,那么通过这种计算方式得出的数值比短文档来说并不一定就大。这样就剔除了文档长度因素的影响,长文档和短文档的词频因子就成为可比的了。

[b](4)逆文档频率因子(IDF)[/b]

IDF的计算公式为:IDFk=log(N/nk),其中N代表文档集合(包含不相关和相关文档的总和)中总共有多少个文档,而nk代表特征单词k在其中多少个文档中出现过,即文档频率。由公式可知,文档频率nk越高,其IDF值越小,即越多的文档包含某个单词,那么其IDF权值越小。IDF反映了一个特征词在整个文档集合中的分布情况,特征词出现在其中的文档数目越多,IDF值越低,这个词区分不同文档差异的能力越差,所以IDF衡量了单词对不同文档内容差异的区分能力。

[b](5)TF*IDF框架[/b]

TF*IDF框架是结合了词频因子和逆文档频率因子的计算框架,一般是将两者相乘作为特征权值,特征权值越大,则越可能是好的关键词,即:Weight(word) = TF * IDF

[b](6)使用TF*IDF框架提取文档和用户查询的特征词及其权重[/b]

使用TF*IDF我们可以获取文档中所有单词的特征词和权重,但是如果单词数目太大,我们不可能使用所有单词作为表示文档的特征词,可以选取权重值最大的几个单词(比如10个或20个)作为特征词,用由这几个特征词的权重组成的向量来表示这篇文档。

使用TF*IDF框架我们可以获取某篇文档的特征向量,对于用户查询来说,我们也可以把它看作一个特殊的文档,可以用同样的方式,获得用户查询的特征词和权重。

[b](7)余弦相似性计算[/b]

对于搜索排序这种任务来说,给定用户输入的查询,理论上应该计算查询和文档之间的相关性,即文档是否和用户需求相关,之后按照相关程度由高到低排序。向量空间模型将问题做了转换,即以查询和文档之间的内容相似性来作为相关性的替代,但是要注意,两者并非等同的概念。

从文档中提取了特征词,并获取了由用户查询特征词权重和搜索文档特征词权重组成的特征向量,如何计算两者的相似性呢?首先需要对用户查询和文档的特征词求交集,然后把交集特征词在用户查询和文档的权重作为两篇文档的特征向量,然后使用余弦相似性公式计算两个文档的相似性。

余弦相似性计算定义如下:

cos(Q,Di)=∑tj=1wij∗qj∑tj=1w2ij∗∑tj=1q2j−−−−−−−−−−−−−−−√

其中qj代表用户查询第j个特征词的权重。Wij代表第i篇文档第j个关键词的权重。

这个公式计算用户查询Q和第Di篇文档的相似性。它的原理是:将每个文档及查询看做是t维特征空间中的一个数值点,每个特征形成t维空间中的一个维度,连接特征空间原点和这个数值点形成一个向量,而cos相似性就是计算特征空间中两个向量之间的夹角,夹角越小,说明两个特征向量内容越相似,夹角越大,说明两个向量内容越不同。

[b](8)一种简化的方法[/b]

由于用户查询的关键词数量一般不是很多,可以直接使用由用户查询提取的关键词而不使用交集关键词在用户查询和搜索文档的权重作为两者的特征向量,这样操作起来更加方便。

[b](9)总结[/b]

计算用户查询和搜索文档的相似性计算步骤总结如下:

1)计算文档集合共有多少文档,这个会在计算TF*IDF权重时用到。

2)读取停用词文档,获取停用词

3)对用户查询和搜索文档进行中文分词,并计算除停用词外所有分词的词频。

4)利用TF*IDF框架计算用户查询除停用词外所有分词的权重,提权权重词最大的若干词作为特征词。由特征词权重组成的向量就是用户查询的特征向量。

5)利用TF*IDF框架计算用户查询特征词在所有相关文档的权重。由关键词权重组成的向量就是搜索文档的特征向量。

6)利用余弦相似性公式计算用户查询和所有搜索文档的相似性,按照相似性高低进行排列。

参考:《这就是搜索引擎–核心技术详解5.2》

《TF-IDF与余弦相似性的应用(一):自动提取关键词》

《TF-IDF与余弦相似性的应用(二):找出相似文章》
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  搜索 tf-idf