文本相似度计算

  1. 基准方法:文本->词->嵌入->平均池化->余弦相似度
  2. Word Mover’s Distance
  3. rank_bm25

无监督短文本匹配

1. TF-IDF Term Frequency-Inverse Document Frequency

TF-IDF(Term Frequency-Inverse Document Frequency)是一种在信息检索和文本挖掘中广泛使用的加权技术,用于评估一个词在一个文档或语料库中的重要性。TF-IDF算法结合了两个统计测量:词频(TF)和逆文档频率(IDF),来计算一个词的权重。

词频(TF, Term Frequency)

词频是指一个词在文档中出现的频率。一个词在文档中出现得越频繁,其TF值就越高,表明这个词对该文档的内容可能越重要。然而,仅仅使用词频作为权重是有缺陷的,因为常见的词汇(如冠词、介词等)会获得较高的权重,尽管它们对于文档的主题贡献不大。

TF的计算公式可以表示为:
$$ \text{TF}(t, d) = \frac{\text{词 } t \text{ 在文档 } d \text{ 中出现的次数}}{\text{文档 } d \text{ 中的总词数}} $$

逆文档频率(IDF, Inverse Document Frequency)

逆文档频率是用来反映一个词的普遍重要性,即一个词在文档集合中的罕见程度。一个词如果在许多文档中都出现,则其IDF值较低;反之,如果一个词只在少数文档中出现,则其IDF值较高,表明这个词可能具有很好的区分度,是文档的关键特征。

IDF的计算公式可以表示为:
$$ \text{IDF}(t) = \log\left(\frac{\text{文档总数} + 1}{\text{包含词 } t \text{ 的文档数} + 1}\right) $$
这里加1是为了避免分母为0的情况。

TF-IDF

TF-IDF是词频和逆文档频率的乘积,它反映了词在文档中的重要性。TF-IDF值越高,说明词对文档的重要性越大。

TF-IDF的计算公式可以表示为:
$$ \text{TF-IDF}(t, d) = \text{TF}(t, d) \times \text{IDF}(t) $$

实际应用

  • 关键词提取:识别出文档中最重要的词汇。
  • 文档相似度计算:比较两份文档之间的相似性,经常用于信息检索和推荐系统。
  • 文本分类:在机器学习中作为特征向量,帮助分类器理解文档内容。

TF-IDF的一个常见变体是在计算TF时使用词频的对数形式,以减少极高词频的影响,有时也会对IDF进行平滑处理,确保数值的稳定性。在Python的Scikit-learn库中,TfidfVectorizer类提供了实现TF-IDF算法的功能,可以方便地应用于文本数据的预处理和特征工程中。

BM25 Best Match 25

BM25(Best Match 25)是一种广泛用于信息检索的评分函数,它基于概率模型,用于评估文档与给定查询的相关性。BM25算法考虑了词频(词项在文档中的频率)、逆文档频率(IDF,衡量词项的普遍重要性)、文档长度以及一些调整参数。下面详细介绍BM25算法的原理:

  • 词频(Term Frequency, TF):某个词项在文档中出现的次数。
  • 逆文档频率(Inverse Document Frequency, IDF):衡量词项的普遍重要性,常见词项的IDF较低,而罕见词项的IDF较高。
  • 文档长度:文档的长度会影响词项的TF,BM25通过调整参数来校正这一点,防止过长的文档仅因为含有更多词项而获得过高评分。

对于查询(Q)中的每一个词项(t),文档(D)的BM25得分由以下公式给出:

$$ \text{score}(D, Q) = \sum_{t \in Q} w_t \cdot \frac{(k_1 + 1) \cdot f(t, D)}{k_1 \cdot \left(1 - b + b \cdot \frac{|D|}{\bar{D}}\right) + f(t, D)} \cdot \text{IDF}(t) \cdot \frac{k_2 + 1}{k_2 + qf(t, Q)} $$

其中:

  • (f(t, D))是词项(t)在文档(D)中的频率。
  • (qf(t, Q))是词项(t)在查询(Q)中的频率。
  • (\text{IDF}(t))是词项(t)的逆文档频率。
  • (k_1)和(k_2)是调整参数,用于平衡词项频率和文档长度的影响。
  • (b)是另一个调整参数,用于控制文档长度对得分的影响。
  • (|D|)是文档(D)的长度。
  • (\bar{D})是文档集合中文档的平均长度。
  • (k_1)和(k_2):常数,通常(k_1)设置为1.2至2.0,(k_2)设置为100,用于调整词频和查询词频对得分的影响。
  • (b):介于0和1之间的常数,用于调整文档长度对词频的影响。当(b=0)时,文档长度不产生影响;当(b=1)时,文档长度完全影响词频的权重。

BM25算法通过计算查询中每个词项在文档中的得分,然后将这些得分相加以得到文档的总得分。得分高的文档被认为与查询更相关。BM25的核心在于它能够有效地平衡词频、逆文档频率和文档长度等因素,使得结果更加合理和准确。

在实际应用中,BM25常常作为基础的文档排名算法,尤其在全文搜索引擎中被广泛应用,因为它能提供较为准确的文档相关性排序。

词向量+sif或者usif或者TFIDF权重平滑

词向量(Word Vectors)结合SIF(Smoothed Inverse Frequency)、USIF(Unigram SIF)或TF-IDF(Term Frequency-Inverse Document Frequency)权重平滑是一种用于生成文档或句子向量的有效方法。这种方法的主要目的是利用词向量捕捉单词的语义信息,并通过权重平滑技术增强模型对高频和低频词的处理能力,以生成更具有语义一致性的文本表示。

SIF (Smoothed Inverse Frequency)

SIF旨在减少向量表示中频繁词汇的影响,同时保留稀有词汇的信息。SIF使用平滑的逆频率(a smoothed inverse frequency)来加权每个词的词向量,公式如下:

$$ v_d = \sum_{w \in d} \frac{r(w)}{r(w) + a} \cdot v_w $$

其中,

  • (v_d)是文档的向量表示。
  • (v_w)是词(w)的词向量。
  • (r(w))是词(w)的逆频率,即文档中不包含词(w)的比例。
  • (a)是平滑参数,通常设为常数。

USIF (Unigram SIF)

USIF是SIF的一个变体,它使用词频而不是逆频率来加权词向量。这样可以进一步调整权重,以更好地反映词在文本中的实际重要性。

TF-IDF 权重平滑

在生成文本向量时,每个词的词向量可以乘以其TF-IDF值作为权重。TF-IDF权重平滑可以防止文档长度和高频词对向量表示的过度影响。

结合词向量和上述权重平滑方法的基本思路是,首先对文档中的每个词使用预训练的词向量模型(如Word2Vec、GloVe或FastText)来获取词向量,然后根据SIF、USIF或TF-IDF计算权重,最后将所有词的加权词向量求和或平均,得到整个文档或句子的向量表示。

这种方法的优点是它能够利用词向量的强大语义表示能力,同时通过权重平滑技术调整高频词和低频词的影响,使文档向量更接近人类的理解方式。然而,这种方法也有其局限性,比如它可能无法很好地处理多义词和上下文依赖性。

Bert-flow

为了解决BERT句向量分布不平整的问题,作者认为可以利用标准化流(Normalizing Flows)将BERT句向量分布变换成一个光滑的,各向同性的标准高斯分布。

https://github.com/bohanli/BERT-flow

将预训练BERT迁移到文本语义相似度计算任务上大致有两种思路:

「交互编码:」 这是BERT原文给出的微调方法,也就是把两个需要计算语义相似度的文本用[SEP]拼接起来,将其作为输入来微调BERT。虽然BERT的cross-attention可以让两个文本得到充分的信息交互,在一些对文本交互要求较高的任务上表现得很好(比如需要模型具备句间推理能力的AFS数据集[3])

「向量空间模型:」 利用预训练BERT生成的句向量(sentence embeddings)作为文本的整体表示,比如取[CLS]对应的hidden state或对最后一层或几层的hidden states做average pooling(后者更好),然后用句向量的cosine相似度来表示文本的语义相似度。这种方式没有利用句子对相似度标签来微调BERT,因此是无监督的,因此非常适用于大规模文本检索的应用场景,「但奇怪的是,实验表明BERT句向量的表现有时候还不如non-contextualized的GloVe句向量。」

  1. Bert-whitening

去除特征间的相关性和让所有特征具有相同的均值和方差

  1. SimCSE和ESimCSE

通过对比学习, 进行自监督的方法, 使用计算交叉熵为loss通过softmax分类来学习正负样本相似度。ESimCSE是SimCSE升级版。

有监督短文本匹配

表示型短文本匹配模型(经典双塔模型DSSM)

优点: 
  性能好, 可以对离线计算句向量, 大幅度降低在线计算耗时
  能学习到深层语义
缺点: 
  对各文本抽取的仅仅是最后的语义向量, 其中的(词层面的细节)信息损失难以衡量
  缺乏对文本pair间词法、句法信息的比较;
  会导致会失去语义焦点, 易语义漂移(没有关注重要的点)。
  可能准确率不如交互型模型;

一些关键步骤和方法:

词嵌入(Word Embeddings)
这是将文本转换为数值向量的初步步骤。词嵌入能够捕捉词汇的语义和上下文信息,常见的词嵌入模型包括Word2Vec、GloVe和FastText。

句子表示(Sentence Representation)
平均池化:将句子中所有词的嵌入向量取平均。
LSTM 或 GRU:使用长短时记忆网络(LSTM)或门控循环单元(GRU)来捕捉序列中的依赖关系。
Transformer:基于注意力机制的模型,如BERT,可以生成更复杂的句子表示。

相似度计算
在得到两个文本的向量表示后,可以使用以下方法计算它们的相似度:

余弦相似度:测量两个向量之间的角度,范围在-1到1之间。
欧氏距离:计算两个向量之间的直线距离。

交互型(单塔模型)

优点:
  准确率更好;
  更好地把握了语义焦点;
  可以对上下文重要性进行合理的建模。
缺点:
  耗时长;
  忽视了句法、句间对照等全局性信息, 无法由局部匹配信息刻画全局匹配信息。

传统方法(词汇层面)

主要解决词汇层面的匹配问题, 或者说词汇层面的相似度问题。而实际上, 基于词汇的匹配算法有很大的局限性。不能理解同义词和近义词

距离度量算法

最小编辑距离,Levenshtein距离
设(d[i][j])表示A的前i个字符到B的前j个字符的最小编辑距离。则动态规划的递推方程如下:
$$ d[i][j] = \min \begin{cases}
d[i-1][j] + 1 & \text{(删除A的第i个字符)} \
d[i][j-1] + 1 & \text{(在A的末尾插入B的第j个字符)} \
d[i-1][j-1] + \mathbb{1}_{(A_i \neq B_j)} & \text{(替换A的第i个字符或保持不变)}
\end{cases} $$

simhash和海明距离

$L_p$距离

余弦距离

杰卡德相似度

深度语义匹配模型(语义层面)