回顾TF-IDF
TF-IDF 算法我们之前已经有过详细的介绍了,这里就不再赘述。有疑问的朋友可以回头看一下这篇笔记:TF-IDF的原理及代码实现。这篇文章中有一点理解,我么先搬过来:
IDF表征的是区分度、稀缺性,用以评估一个单词在语料库中的重要程度,一个词在少数几篇文档中出现的次数越多,它的IDF值越高,如果这个词在大多数文档中都出现了,这个值就不大了。从公式也可以看出来,由于log函数是单增函数,当文档总数固定时,包含该词的文档数越少,IDF值越大,稀缺性越强。背后的思想是某个词或者短语在一篇文章中出现的频率高(TF大),并且在其他文档中很少出现(IDF也大),则认为该词或短语具备很好的类别区分能力(TF-IDF 也就越大)。
TF刻画了词语w对某篇文档的重要性,IDF刻画了w对整个文档集的重要性。TF与IDF没有必然联系,TF低并不一定伴随着IDF高。实际上我们可以看出来,IDF其实是给TF加了一个权重。
为什么要引出BM25
可插拔的相似度算法提到:因为在TF-IDF 中去停用词被认为是一种标准实践,故TF-IDF没有考虑词频上限的问题(因为高频停用词已经被移除了)。而在某些频率较高的停用词不被去除的情况下,停用词的权重会被无意义地放大。比如文中提到的:
Elasticsearch 的
standard
标准分析器(string
字段默认使用)不会移除停用词,因为尽管这些词的重要性很低,但也不是毫无用处。这导致:在一个相当长的文档中,像the
和and
这样词出现的数量会高得离谱,以致它们的权重被人为放大。
这就是所谓的词频饱和度,TF-IDF的词频饱和度是线性的,而BM25的词频饱和度是非线性的:
【通俗地总结就是:我们之前默认了要去停,但实际好多地方是不去停用词的,所以会有停用词词频贼大的问题,我们想要一个算法,不受停用词影响,也就是亟需图像中下面那样的曲线,这是BM25出现的初衷之一。】
还有一个问题,那就是文档长度的问题:
1000词的文章出现100个W词,和一篇200词的文章出现100个W词,显然重要性不同。(如果TF计算是利用文档全词长度做分母做的归一化,就会有这个问题,原有情况下对长文本不友好,因为分母比较大)
Lucence(或 Elasticsearch)对传统的TF-IDF做了改进,给他加了一个字段长度归一化值【这是BM25之前做的优化】:
即改进后的TF-IDF,可以看出改进后的TF-IDF给了长文本给了更多的厚爱:
其中TF值的算法:
IDF算法不变:
但是BM25针对上述问题做了更多的改进。
BM25
BM25对之前的方法做了更细致的改进,主要是引入参数k来控制TF值的上下限、引入b来控制文本长度归一化的程度:
由此得到最终的BM25算法的公式:
再次说明其中L的算法:
总结
BM25主要针对词频饱和度和文档归一化长度做了两点改进”
k
这个参数控制着词频结果在词频饱和度中的上升速度。默认值为1.2
。值越小饱和度变化越快,值越大饱和度变化越慢。【思考:如果没有去停用词的情况下,k应该大一点】b
这个参数控制着字段长归一值所起的作用,0.0
会禁用归一化,1.0
会启用完全归一化。默认值为0.75
。【思考:长文本b应该小一点,短文本可以大一点】此外还有一个区别就是:BM25源自概率相关模型,而TF-IDF 源自向量空间模型。
此文完。
参考文章: