文本相似度计算:Jaccard 和 Dice 系数介绍与示例
文本相似度
文本相似度,简单说就是量化两段文本的内容重合、语义相近程度,是 NLP 最基础、最高频的任务之一。
日常业务中随处可见:
- 文章查重、内容去重
- 问答系统:用户提问与历史问题匹配
- 搜索推荐:相似内容召回
- 评论舆情:重复言论过滤
- 短文本匹配、指令对齐
文本相似度算法主要分两类:
- 基于集合的离散匹配:Jaccard、Dice(只看词语「是否存在」,不看出现次数)
- 基于向量的语义匹配:余弦相似度、Embedding 相似度(考虑词频、语义空间)
对于短文本、口语化文本、去重场景,不需要复杂向量计算,Jaccard 和 Dice 足够好用,且速度更快、结果可解释。
Jaccard 和 Dice 系数公式
将两段文本分词、去重后得到两个词语集合 $A$、$B$。
- 交集 $A \cap B = \{a \in A \land a \in B\}$:两段文本共同包含的词语
- 并集 $A \cup B = \{a \in A \lor a \in B\}$:两段文本所有不重复词语的总和
Jaccard 系数
$$ J(A, B) = \frac{|A \cap B|}{|A \cup B|} $$即共同词语个数除以所有不重复词语个数,范围 $[0, 1]$。
特点:对文本差异更敏感,适合查重、去重、精准区分相似文本。
Dice 系数
$$ Dice(A,B) = \frac{2\cdot|A \cap B|}{|A|+|B|} $$即 2 倍共同词语个数除以所有词语总数,范围 $[0, 1]$。
特点:放大共同特征权重,弱化独有词语干扰,适合模糊匹配、相似召回、内容对齐。
文本特征提取
Jaccard、Dice 是集合算法,只能对离散、去重、标准化的词语集合计算,所以要先对文本进行分词、去重、标准化处理,步骤如下:
- 文本清洗:移除、替换特殊字符等,保留有效词语
- 分词处理:将文本转换为词语序列,去除停用词、标点符号等
- 语义归一:将词语转换为统一的表示,统一同义表述
- 集合构建:将分词后的词语转换为集合,去重
- 计算相似度:根据 Jaccard 或 Dice 系数公式,计算两段文本的相似度

代码演示
文本清洗
- 全角字符统一转为半角:消除肉眼相同但编码不同的字符变体,保障分词、过滤、同义词匹配与特征提取的准确性
- 移除特殊字符:如标点符号、特殊字符等,保留有效词语
| |
分词处理
- 调用 jieba 分词
- 移除停用词和空格
| |
语义归一
| |
系数计算
| |
调用与结果
| |
输出:
结果分析
从语义的表达来说,文本 1 和文本 2 是相近的,但 Jaccard 系数和 Dice 系数相对较低,表明它们的共同词语较少。所以除了分词技术外,还需要考虑语义归一化,将同义词转换为统一的表示,以提高相似度计算的准确性。
小结
Jaccard 和 Dice 作为轻量化文本相似度算法,不依赖大模型、无需向量训练,凭借低算力、高可解释、落地简单的优势,适用于短文本相似度计算的场景。
其缺点也足够明显,如不考虑词语频率、顺序等因素,导致无法准确评估文本的相似度。