文本相似度:TF−IDF算法和BM25算法

文本相似度:TF−IDF算法和BM25算法

1、TF−IDF算法

TF是指归一化后的词频,IDF是指逆文档频率。给定一个文档集合D,有d1,d2,d3,......,dn∈D。文档集合总共包含m个词(注:一般在计算TF−IDF时会去除如“的”这一类的停用词),有w1,w2,w3,......,wm∈W。我们现在以计算词wi在文档dj中的TF−IDF值为例。TF的计算公式为:

                                                               TF=\frac{freq(i,j)}{maxlen(j)}

  在这里freq(i,j)为wi在dj中出现的频率,maxlen(j)为dj长度。

  TF只能时描述词在文档中的频率,但假设现在有个词为”我们“,这个词可能在文档集D中每篇文档中都会出现,并且有较高的频率。那么这一类词就不具有很好的区分文档的能力,为了降低这种通用词的作用,引入了IDF。

  IDF的表达式如下:

                                                             IDF=\log\frac{len(D)}{n_{i}}

  在这里len(D)表示文档集合D中文档的总数,n(i)表示含有wi这个词的文档的数量。

  得到TF和IDF之后,我们将这两个值相乘得到TF−IDF的值:

                                                         TF−IDF=TF∗IDF

  TF可以计算在一篇文档中词出现的频率,而IDF可以降低一些通用词的作用。因此对于一篇文档我们可以用文档中每个词的TF−IDF组成的向量来表示该文档,再根据余弦相似度这类的方法来计算文档之间的相关性。

2、BM25算法

  BM25算法通常用来做搜索相关性评分的,也是ES中的搜索算法,通常用来计算query和文本集合D中每篇文本之间的相关性。我们用Q表示query,在这里Q一般是一个句子。在这里我们要对Q进行语素解析(一般是分词),在这里以分词为例,我们对Q进行分词,得到q1,q2,......,qt这样一个词序列。给定文本d∈D,现在以计算Q和d之间的分数(相关性),其表达式如下:

                                                              score(Q,d)=\sum_{i=1}^{t}w_{i}*R(q_{i},d)

  上面式子中wi表示qi的权重,R(qi,d)为qi和d的相关性,Score(Q,d)就是每个语素qi和d的相关性的加权和。

  wi的计算方法有很多,一般是用IDF来表示的,但这里的IDF计算和上面的有所不同,具体的表达式如下:

                                                        w_{i}=IDF(q_{i})=\log\frac{N-n(q_{i})+0.5}{n(q_{i})+0.5}

  上面式子中N表示文本集合中文本的总数量,n(qi)表示包含qi这个词的文本的数量,0.5主要是做平滑处理。

  R(qi,d)的计算公式如下:

                                                       R(q_{i},d)=\frac{f_{i}*(k1+1)}{f_{i}+K}*\frac{qf_{i}*(k2+1)}{qf_{i}+k2}

  其中

                                                            K=k1*(1-b+b*\frac{dl}{avgdl})

  上面式子中fi为qi在文本d中出现的频率,qfi为qi在Q中出现的频率,k1,k2,b都是可调节的参数,dl,avgdl分别为文本d的长度和文本集D中所有文本的平均长度。

  一般qfi=1,取k2=0,则可以去除后一项,将上面式子改写成:

                                                            R(q_{i},d)=\frac{f_{i}*(k1+1)}{f_{i}+K}

  通常设置k1=2,b=0.75。参数b的作用主要是调节文本长度对相关性的影响。

你可能感兴趣的:(算法)