1. 文本相似度概述:什么是文本相似度、应用场景与挑战
大家好,我是这门课的主讲。今天咱们来聊聊文本相似度——这个在NLP领域里既基础又让人头疼的话题。
说实话,我第一次接触这个概念是在做论文查重系统的时候。当时老板丢给我一堆论文,说「你写个程序,把抄袭的找出来」。我心想,这还不简单?结果一上手就发现,事情远没那么容易。
1.1 什么是文本相似度?
文本相似度,说白了就是衡量两段文字「长得像不像」或者「意思近不近」。但这里有个坑——「像」和「近」其实是两码事。
举个例子:
- 字面相似:「我爱北京天安门」和「我爱北京天安门广场」——字面上高度重合
- 语义相似:「苹果很好吃」和「iPhone的体验不错」——字面完全不同,但意思相关
我个人习惯把文本相似度分成三个层次:
| 层次 | 名称 | 典型方法 | 我踩过的坑 |
|---|---|---|---|
| L1 | 字面相似度 | 编辑距离、Jaccard系数 | 换同义词就失效 |
| L2 | 向量相似度 | TF-IDF、Word2Vec | 词序丢失,语义模糊 |
| L3 | 语义相似度 | BERT、Sentence-BERT | 计算成本高,部署难 |
嗯,这里要注意:没有万能的相似度算法。选哪个层次,完全看你的业务场景。
1.2 应用场景:查重、搜索、推荐
文本相似度的应用场景,我归纳为三大类。每个我都亲手做过,所以能跟你聊聊里面的门道。
1.2.1 查重(抄袭检测、内容去重)
这是最经典的应用。我在项目中遇到过这样一个需求:一个新闻聚合平台,每天抓取几十万条新闻,里面大量重复内容。比如同一则「某地发生地震」,不同媒体换个标题就发出来了。
当时我用的是SimHash + 海明距离的方案。为什么选它?因为数据量太大了,用BERT算一遍,服务器得冒烟。
核心思路:把长文本压缩成64位指纹,然后比较指纹的差异位数。
我曾经犯过一个错:直接用全文做SimHash。结果发现,很多新闻正文几乎一样,但开头加了一段「欢迎收看今天的新闻」,指纹就变了。后来我加了权重过滤,把「的、了、是」这些停用词权重降为零,效果才稳定下来。
1.2.2 搜索(语义检索、问答匹配)
搜索的本质是什么?就是用户输入一段query,你从库里找出最相似的文档。
传统做法是BM25,算关键词匹配。但问题来了——用户搜「怎么修手机」,文档里写的是「手机屏幕碎了怎么办」,关键词一个都不匹配,但意思相关。这就是语义鸿沟。
我建议你在做搜索系统时,先别急着上深度学习。先用BM25跑一遍,看看bad case。如果大部分bad case都是同义词问题,那加个同义词扩展就够了。如果涉及复杂的语义理解,再考虑用向量检索。
我的经验:80%的搜索问题,用BM25 + 同义词扩展就能解决。剩下的20%,才值得用BERT。
1.2.3 推荐(相似内容推荐、用户画像)
推荐系统里,文本相似度用来做「物品的相似度计算」。比如你看了一篇「如何训练神经网络」,系统会推荐「深度学习入门指南」给你。
这里有个坑:推荐场景下的相似度,往往不是纯文本相似度。你想想看,用户看完「Python基础」后,可能更想看「数据分析实战」,而不是另一篇「Python基础」。所以,我一般会把文本相似度作为一个特征,而不是唯一依据。
1.3 相似度计算的挑战
做了这么多年文本相似度,我总结出三大挑战。每个都让我吃过亏。
挑战一:语义鸿沟
字面不同,意思相同。这是最经典的难题。
比如:
- 「这台电脑性能很强」
- 「这台机器跑分很高」
字面上「电脑」和「机器」、「性能」和「跑分」都不匹配,但意思几乎一样。传统方法直接跪了。
挑战二:长度差异
短文本 vs 长文本,怎么比?
我曾经处理过一个客服问答系统。用户问「怎么退款」,标准答案是一段300字的退款流程说明。用余弦相似度算,得分低得可怜。为什么?因为短文本的向量稀疏,长文本的向量稠密,两者不在一个量级上。
避坑指南:不要直接比较长度差异过大的文本。可以先对长文本做摘要,或者用「查询-文档」的匹配模式,而不是「文档-文档」的对称比较。
挑战三:噪声与歧义
真实世界的文本,充满了噪声。拼写错误、口语化表达、网络用语……
举个例子:用户搜「苹果手机怎么越狱」,文档里写的是「iPhone如何获取root权限」。这里「苹果手机」=「iPhone」,「越狱」=「获取root权限」。但如果你不做归一化,相似度就是0。
我个人的习惯是:先做文本预处理,再做相似度计算。预处理包括:
- 拼写纠错(比如「越狱」写成「越域」)
- 同义词替换(「苹果手机」→「iPhone」)
- 停用词过滤(去掉「的、了、是」)
- 实体识别与归一化(「北京」→「北京市」)
嗯,这里要注意:预处理不是越多越好。过度预处理会丢失信息。比如把「苹果手机」直接替换成「iPhone」,那用户搜「苹果」时就匹配不到了。所以,我一般会保留原始文本,同时生成一个预处理后的版本,两者结合使用。
小结
这一章我们聊了文本相似度的基本概念、三大应用场景和核心挑战。说白了,文本相似度就是一个「权衡」的艺术——在精度、效率、鲁棒性之间找平衡。
下一章,我会带你手撸一个最简单的相似度计算器,从编辑距离开始。到时候你会看到,看似简单的算法,在实际数据上跑起来,坑有多深。
咱们下节课见。