搜索系统(二)

term weight

如何衡量一个词在一篇文档中的重要性

词频率(tf):term在文档中出现了多少次,tf越大说明越重要

逆文档频率(idf):有多少文档包含了这个term,idf越大表明越不重要

综合词频率和逆文档频率的优势,最终得到weight = tf *idf

从信息论的角度来解读tf * idf

一个query中每个词的权重应该反应这个词对查询来讲提供了多少信息,一个简单的办法就是用每个词的信息量作为它的权重

I(w) = -p(w) * log p(w) = -tf(w)/N * log tf(w)/N = tf(w)/N * log N/tf(w) 【N是整个语料库的大小,是个可以省的常数】

I(w) = tf(w) * logN/tf(w)

缺陷:两个词出现的频率tf相同,一个是某篇特定文章中的常见词,而另外一个词是分散在多篇文章中,那么显然第一个词有更高的区分度,

它的权重应该更大,更好的权重公式应该能够反映出关键词的区分度

假设:

每个文献大小基本相同,均为M个词,即 M = N/D = sum (tf(w)) / D

一个关键词在文献中一旦出现,不论次数多少,贡献都等同,这样一个词要么在一个文献中出现c(w) = tf(w)/D(w),要么是0,c(w) < M

最终变成:

I(w) = tf(w) * log N/tf(w) = tf(w) * log MD/(c(w) * D(w)) = tf(w) * log(D/D(w) * M/c(w))

I(w) = tf(w) * log N/tf(w) = tf(w) * log MD/(c(w) * D(w)) = tf(w) * log(D/D(w) * M/c(w))

因为c(w) < M,所以第二项大于0,它是c(w)的递减函数

tf(w) * idf(w) = I(w) - tf(w) * log M/c(w)

可以看出一个词的信息量I(w)越多,tf*idf值越大,同时w命中文献中w平均出现的次数越多,第二项越小,tf*idf越大

TF-IDF对于多段文本的关键词提取非常有效,但是对于单篇或者文档分割较少的文本则表现的不是很好,此处需要借助textrank来解决这个问题

TextRank是一种基于图排序的算法,其基本思想来源于google的PageRank算法,通过把文本切分为若干组成单元(单词或者短语或者句子)并建立图模型

(所谓这样的图模型,例如:今天阳光明媚,天清气爽,适合出游。所以今天去公园吧。这句话的图模型如下图所示),

利用投票机制对文本中的重要程度成分进行排序(下图中,“今天”的重要程度会比较高),仅利用单篇文档本身的信息即可实现关键词提取、做文摘

TextRank

编辑切换为居中

添加图片注释,不超过 140 字(可选)

TextRank利用投票的原理,让每一个单词给它的邻居(也即窗口)投赞成票,票的权重取决于自己的票数。所以如上所述,它是一个图排序模型,我们假设每一个词是一个顶点(Vertex),

那么所有的词就构成了一个网络,在这个网络里面每一个顶点会指向其他顶点的边,也会由其他顶点指向自己的边。通过计算每个顶点所连接的指向自己的顶点的权重和,最终得到该顶点的权重值。

初始值确定:因为目标的权重取决于自身的权重(通过计算每个顶点所连接的指向自己的顶点的权重和),所以这里的初始值为非0的值。

这里引入了阻尼系数的概念。在图模型中,该参数表示从某一个指定的顶点,到任意一个其他顶点的概率,详细公式见下图

编辑切换为居中

添加图片注释,不超过 140 字(可选)

对文本进行切分为字或词形式

对切分好的字或词构建图模型,也即构建一个字或词与字或词的连接矩阵;选择用滑动窗口的方式对每个单词取邻居:假设,我们取一个长度为k的滑动窗口,

则w_{1},w_{2},...,w_{k};w_{2},w_{3},...,w_{k+1};w_{3},w_{4},...,w_{k+2};等都是一个窗口。在一个窗口中的任两个单词对应的节点之间存在一个无向无权的边;

在这个邻居上面构成图,可以计算出每个单词节点的重要性

权重计算:

设定最大迭代次数,并依次进行逐步迭代;

按照连出矩阵,对每一个单词节点更新其排序权重;

对于连出到自身或者连出为空的单词节点不进行计算,因为这部分节点在图中属于孤立点,所以只要求保持其初始值即可;

对于连出的其他词的单词节点,则按照TextRank公式,逐步更新其排序权重;

同时根据前后两次迭代之间单词的权重变化值,来判断是否提前结束循环过程

text rank demo

编辑切换为居中

添加图片注释,不超过 140 字(可选)

tag_filter主要是用来做停用词过滤的,防止将停用词作为重要的词从图中提取出来

seg_result主要是对输入的sentence做分词

word_list里存放的是经过过滤的sentence的分词结果

编辑

添加图片注释,不超过 140 字(可选)

edge_dict = {} #记录节点的边连接字典

针对每个词,将窗口范围2n范围内的词全部输入到edge_dict中

编辑切换为居中

添加图片注释,不超过 140 字(可选)

matrix主要是通过edge_list,将每个词的出度和入度在矩阵里面表示出来

因为出度入度计算都是+1,此处需要归一化一下,变成 < 1的数

编辑切换为居中

添加图片注释,不超过 140 字(可选)

通过pagerank算法计算关键词

textrank模型缺点

TextRank算法对于一段文本中多次出现的词,赋予更大的权重,因为它连出的节点会更多,所以当各个节点的初始权重一致的时候,则最终出现次数多的词权重会更大。

这样会使类似于“的”、"你、我、他"等常用词,会出现比较大的误差,因为这些词一般没有什么特别的含义,仅仅是一个连接词或指代词。

对于这种情况,可以在对文本进行切分时,去掉里面的停用词或其他符合一定规则的词语

plsa算法原理

主题词提取

针对一篇文章,往往是有好几个主题。譬如一篇奥运会的文章,可能40%会谈论运动员比赛成绩,30%谈论运动员私人生活,20%谈论运动员感情,还有10%谈论其它主题

我们可以很自然的看到,一篇文章通常是由多个主题构成的,而每一个主题大概可以用与该主题相关的频率最高的一些词来描述。以上这种想法由Hofmann于1999年给出的pLSA模型中首先进行了明确的数学化。Hofmann认为一篇文章(Doc)可以由多个主题(Topic)混合而成,而每个Topic都是词汇上的概率分布,文章中的每个词都是由一个固定的Topic生成的

编辑切换为居中

添加图片注释,不超过 140 字(可选)

编辑切换为居中

添加图片注释,不超过 140 字(可选)

编辑

添加图片注释,不超过 140 字(可选)

倒数第二步旨在将zk暴露出来。由于likelihood function中与存在latent variable(p(zk|dm), p(wn|zk)),难以直接使用MLE求解,

很自然想到用E-M算法求解。E-M算法主要分为Expectation与Maximization两步

p(a, b) = p(a) * p(b|a) = p(b) * p(a|b) 贝叶斯

doc,N个词,K个主题、M个文档: p(w|d) = p(z|d) * p(w|z) = sum_z 【p(z, w|d)】****

p(dm), p(zk|dm), p(wn|zk)

p(wn, dm) 第m篇文档中,第n个词出现的概率

Loss function = p(w1, d1) * p(w2, d1) * ...... p(wn, d1) * p(w1, d2) * p(w2, d2) * ....... * p(wn, d2) * ........p(w1, dm) * p(w1, dm)....... p(wn, dm)

p(w1, d1) 有可能出现一次或者多次,那么假设它出现了n(d1, w1)次

log L = p

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值