NLP篇【01】tfidf与bm25介绍与对比

上一篇:自然语言处理【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.10.100
第二篇0000
第三篇00tfidf值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做权重的原因:

        tfidf=idf*fi/dl

写成这样Score(Q,d)=\sum tfidf=\sum IDF*fi/dl,你就会发现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

在Python中安装BM25(Best Match 25)算法,通常用于信息检索文本相似度计算,你需要安装一个名为`gensim`的库,它包含了一个实现BM25算法的功能。`gensim`是一个强大的自然语言处理工具包,除了BM25外,还支持词嵌入、主题模型等多种文本分析技术。 下面是安装`gensim`以及使用其中BM25功能的基本步骤: 1. **首先确保你已安装了Python**。你可以从Python官网下载最新版本,并按照指示完成安装。 2. **使用pip安装gensim**: 打开终端(Windows用户是命令提示符或PowerShell),运行以下命令来安装`gensim`: ``` pip install gensim ``` 如果你使用的是Anaconda环境,可以使用`conda install -c conda-forge gensim`。 3. **安装完成后**,就可以在Python脚本中导入`gensim`并利用`models.TfidfModel``models.BM25OkapiSimilarity`来应用BM25了。例如,创建一个TF-IDF模型并转换文本: ```python from gensim import corpora, models # 创建词汇表并转换文本 texts = ... # 你的文本列表 dictionary = corpora.Dictionary(texts) corpus = [dictionary.doc2bow(text) for text in texts] # 训练TF-IDF模型 tfidf = models.TfidfModel(corpus) # 使用BM25相似度计算 index = models.BM25OkapiIndex(tfidf[corpus]) similarity = models.MatrixSimilarity(index) ``` 4. **使用相似度函数**,比如查询某个文档整个索引中最相似的文档: ```python query = dictionary.doc2bow(... your query ...) sims = similarity[query] ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值