上一篇:自然语言处理【NLP】遇上电商——专栏导读
下一篇:NLP篇【02】白话Word2vec原理以及层softmax、负采样的实现
一、tfidf介绍
词频(TF) = 某个词在文章中的出现次数 / 文章总词数,逆文档频率(IDF) = log(语料库的文章总数/包含该词的文章总数+1),tfidf=tf*idf。举个例子一下子就明白了。如语料库包含以下三篇文章(什么是语料库可百度):
第一篇:张一山与杨紫疑似相恋
第二篇:C罗又一次完成了帽子戏法,这就是足球的魅力
第三篇:恭喜TES创历史记录,在s10的世界总决赛上完成了让二追三
首先是对每篇文章进行分词且过滤停用词得doc_lis=[[张一山,...,相恋],[C罗,...,魅力],[恭喜,...,让二追三]],然后依次计算每个词的tfidf。TF(张一山)=1/4(“与”作为停用词过滤掉了所以是4) IDF(张一山)=log(3/1+1),所以tfidf=TF*IDF=1/4*log3/2=0.25*0.405=0.1,按照这个方式依次计算就能得到所有词的tfidf,最终的结果如下表:
文章\词 | 张一山 | 杨紫 | ... | 完成 | 让二追三 |
---|---|---|---|---|---|
第一篇 | 0.1 | 0.1 | 0 | 0 | |
第二篇 | 0 | 0 | 0 | 0 | |
第三篇 | 0 | 0 | tfidf值 | tfidf值 |
这张表的shape应该(总词数,总文章数),因此tfidf的应用可以有:1、文章关键词提取(可以提取tfidf值前几个作为关键词)2、文章分类,这个矩阵直接输入到项lsvm,lr等模型(当然要打好label)3、用LDA或SVD进行降维(为什么要降维,因为语料库的总词数是非常多的,所以每篇文章的向量是非常稀疏的),再当做文章的embeding 4、把tfidf或idf值当做每个词的权重
tfidf算法的优点:简单,快速,如果语料库是不变的话,可以提前离线计算好语料库中所有词的tfidf值(这在实际应用中非常重要的,后面有这个应用的举例)
缺点:1、仅以“词频”度量词的重要性,后续构成文档的特征值序列,词之间各自独立,无法反映序列信息 2、tfidf得到是一个稀疏而庞大的矩阵,需要采用降维方式,才方便做后续的文本任务,而降维可能会损失一些信息,同时降维的也会提高模型的复杂度,而失去了原本快速的优点 3、tfidf得到的embedings再输入后续的模型,做文本分类、文本匹配等任务,在效果上通常会差于采用词向量模型训练得到的embedding。
二、bm25
bm25 是一种用来评价搜索词和文档之间相关性的算法,用简单的话来描述下bm25算法:我们有一个query和一批文档Ds,现在要计算query和每篇文档D之间的相关性分数。这种场景的应用就有很多:1、电商中计算搜索词query与商品的之间的相关性 2、知乎搜索中搜索词query与回答之间的相关性 3、匹配式智能客服中,用户问题与答案之间的相关性等。那bm25算法是怎样计算query与文档之间的相关性的呢?BM25算法计算相关性的一般性公式如下:
其中,Q表示Query,qi表示Q分词之后的每个单词;d表示一个文档;Wi表示词qi的权重;R(qi,d)表示词qi与文档d的相关性得分。所以query中每个词与文档的相关性的加权和就是query与文档的相关性得分。而求query中每个词的权重就可以使用上面所讲的tfidf,但常常只用idf(后面会讲为什么只用idf的原因),而这里采用idf的公式为:
其中n(qi)是文档包含词qi的文档数,N是文档总数,和上面的idf计算公式有点不同,但思路是相同的。而求R(qi,d)的公式为如下:
其中,k1,b为调节因子,通常根据经验设置,一般k1=2,b=0.75;fi为qi在d中的出现频率,dl为文档d的长度,avgdl为所有文档的平均长度。总的来讲就是R(qi,d)与这个词在该文档中出现的频率呈正相关,与该文档的长度呈负相关。最终Score(Q,d)的公式为:
同样下面我举例计算一下,同样假如有三个文档如下:
第一篇:张一山与杨紫疑似相恋
第二篇:C罗又一次完成了帽子戏法,这就是足球的魅力
第三篇:恭喜TES创历史记录,在s10的世界总决赛上完成了让二追三
用户输入的query是“足球相关新闻”,下面我来计算一下和哪篇最相关。首先分此后query=[足球,相关,新闻]
第一篇中:idf(足球)=log(3-0+0.5)/(0+0.5),idf(相关)=log(3-0+0.5)/(0+0.5),idf(新闻)=log(3-0+0.5)/(0+0.5)
R(足球,第一篇)=0*(2+1)/(0+K)=0,R(相关,第一篇)=0,R(新闻,第一篇)=0,所以
Score(“足球相关新闻”,第一篇)=0
同理可以计算和第二篇的相似性得分,最终可以发现和第二篇相似性得分最高。
下面我就解释下只用idf做权重的原因:
写成这样Score(Q,d)=,你就会发现bm25公式的后面其实就是tfidf的一个改良版,所以不是tfidf乘后面。所以你会发现bm25其实就是把query中每个词,在每篇文档中的tfidf(改良后的)值求和即为该query与该文档的相似性得分。为什么说是改良版,后者会比传统的tfidf效果要好吗?
传统的TF值理论上是可以无限大的。而BM25与之不同,它在TF计算方法中增加了一个常量k,用来限制TF值的增长极限。下面是两种计算方法中,词频对TF Score影响的走势图。从图中可以看到,当tf增加时,TF Score跟着增加,但是BM25的TF Score会被限制在0~k+1之间。它可以无限逼近k+1,但永远无法触达它。这在业务上可以理解为某一个因素的影响强度不能是无限的,而是有个最大值,这也符合我们对文本相关性逻辑的理解。
bm25的算法的优缺点:
优点:可以方便线下做离线先计算好文档中出现的每一个词的idf并保存为一个字典,当用户搜了一个query,直接分词然后查字典就能得到这个词的idf,如果字典中没有idf值无意义,因为R=0。同于tfidf。
缺点:同于tfidf