1 前情提要
在基于规则的词匹配算法中,首先需要做的事分词,我们先要有一个覆盖内容尽可能大的词表,然后对查询Query进行拆分,然后才能使用词袋算法计算词相关性数值。
我们假设词表为V,大小假设为26000。
2 TF-IDF
Term Frequency - Inverse Document Frequency(词频-逆文档频率)
假设我们有一个查询Query:“今天天气如何”,这时候经过分词,得到Q={今天 , 天气 , 如何}
t \in Q是其中的一个词
- 那么 tf_{t,d} 表示t在文档d中的出现次数,这就是词频
- 而 idf_t 表示t在所有文档中的逆文档频率
可以发现这时候有一个问题,如果只使用词频,如果该文档很长,这个t的出现次数通常就会更多,导致tf值大,所以需要做一下归一化,即除以一个l_d,它表示d文档总词数。
还可以发现,如果只有上述的\sum_{t \in Q} \frac{tf_{t,d}}{l_d},那么又会有一个问题,比如停止词“的”,它并不重要,但是出现次数会很多,这样计算会导致这种词的得分很高,所以还要给一个权重,这个权重就是IDF。
tf_{t,d} = t词在d中出现的次数
df_t = t在多少个文档中出现过
idf_t = \log{\frac{N}{df_t}}
所以最终得到TF-IDF公式:
TF-IDF = \sum_{t \in Q} \frac{tf_{t,d}}{l_d} \cdot idf_t
3 BM25
Okapi Best Match 25
在了解了TF-IDF后,BM25就好理解了,因为它可以看作是TF-IDF的变体。
tf、df还是一样的:
tf_{t,d} = t词在d中出现的次数
df_t = t在多少个文档中出现过
BM25公式为:
BM25 = \sum_{t \in Q} \frac{tf_{t,d} \cdot (k+1)}{tf_{t,d} + k \cdot (1-b+b \cdot \frac{l_d}{mean(l_d)})} \cdot \ln(1 + \frac{N - df_t + 0.5}{df_t + 0.5})
其中,k 和 b是参数,通常设置 k∈[1.2 , 2] 和 b=0.75
4 总结
- 它们通常用于计算查询文本与文档之间的相关性,并且可以用来计算稀疏向量,比如上面说的V为词表大小,那么上面给出的例子中的“今天天气如何”,我们假设“今天”、“天气”、“如何”分别对应了词表中的100、200、300号,并且假设计算得到的BM25值分别为0.65、0.8、0.5,那么得到的稀疏向量就是{100 : 0.65, 200 : 0.8, 300 : 0.5}。
- 它们都属于是词袋模型,没有考虑上下文关系、语义问题,如果要进一步加强效果,就需要使用嵌入模型,比如基于Bert的嵌入模型等。
参考文档:Milvus 向量数据库文档
参考视频: