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