在自然语言处理NLP和信息检索领域文本相似度计算是一项核心任务广泛应用于搜索引擎、推荐系统、抄袭检测、智能客服等场景。本文将介绍如何使用Python计算文本相似度涵盖基础方法如Jaccard相似度、编辑距离到高级方法如TF-IDF、余弦相似度、预训练模型并提供完整代码示例。1. 为什么需要文本相似度计算文本相似度计算的核心目标是衡量两段文本在语义或结构上的相似程度。常见应用场景包括搜索引擎返回与查询最相关的文档。推荐系统推荐与用户历史行为相似的内容。抄袭检测判断两篇文章的相似性。智能问答匹配用户问题与知识库中的答案。2. 基础文本相似度计算方法2.1 Jaccard相似度基于集合Jaccard相似度通过计算两个集合的交集与并集的比值来衡量相似性适用于短文本或关键词匹配场景。公式[J(A, B) \frac{|A \cap B|}{|A \cup B|}]Python实现defjaccard_similarity(str1,str2):set1set(str1.split())set2set(str2.split())intersectionlen(set1set2)unionlen(set1|set2)returnintersection/unionifunion!0else0text1Python is a programming languagetext2Python is used for data scienceprint(jaccard_similarity(text1,text2))# 输出: 0.375适用场景短文本、关键词匹配、简单分类。2.2 Levenshtein距离编辑距离Levenshtein距离衡量将一个字符串转换为另一个字符串所需的最少编辑操作插入、删除、替换次数适用于拼写纠错、DNA序列比对等。Python实现deflevenshtein_distance(s1,s2):iflen(s1)len(s2):returnlevenshtein_distance(s2,s1)iflen(s2)0:returnlen(s1)prev_rowrange(len(s2)1)fori,c1inenumerate(s1):curr_row[i1]forj,c2inenumerate(s2):insertionsprev_row[j1]1deletionscurr_row[j]1substitutionsprev_row[j](c1!c2)curr_row.append(min(insertions,deletions,substitutions))prev_rowcurr_rowreturnprev_row[-1]defnormalized_levenshtein(s1,s2):distancelevenshtein_distance(s1,s2)max_lenmax(len(s1),len(s2))return1-distance/max_lenifmax_len!0else0text1kittentext2sittingprint(normalized_levenshtein(text1,text2))# 输出: 0.571适用场景拼写纠错、短文本相似度如用户名匹配。3. 基于词向量的文本相似度计算3.1 TF-IDF 余弦相似度TF-IDF词频-逆文档频率将文本转换为向量通过计算向量间的余弦相似度衡量相似性。步骤使用TfidfVectorizer将文本转换为TF-IDF向量。计算向量间的余弦相似度。Python实现fromsklearn.feature_extraction.textimportTfidfVectorizerfromsklearn.metrics.pairwiseimportcosine_similarity texts[Python is a programming language,Python is used for data science,Java is another programming language]vectorizerTfidfVectorizer()tfidf_matrixvectorizer.(texts)# 计算两两之间的相似度similarity_matrixcosine_similarity(tfidf_matrix)print(similarity_matrix)# 计算text1和text2的相似度text1texts[0]text2texts[1]vec1vectorizer.transform([text1])vec2vectorizer.transform([text2])print(cosine_similarity(vec1,vec2)[0][0])# 输出: 0.5适用场景长文本相似度、文档检索。3.2 Word2Vec 余弦相似度Word2Vec将单词映射为低维向量通过计算词向量的平均值得到句子向量再计算余弦相似度。Python实现使用Gensimfromgensim.modelsimportWord2Vecfromsklearn.metrics.pairwiseimportcosine_similarityimportnumpyasnp# 训练Word2Vec模型示例数据sentences[Python is a programming language.split(),Python is used for data science.split(),Java is another programming language.split()]modelWord2Vec(sentences,vector_size100,window5,min_count1,workers4)defsentence_vector(sentence,model):vectors[model.wv[word]forwordinsentenceifwordinmodel.wv]returnnp.mean(vectors,axis0)ifvectorselsenp.zeros(model.vector_size)vec1sentence_vector(Python is a programming language.split(),model)vec2sentence_vector(Python is used for data science.split(),model)print(cosine_similarity([vec1],[vec2])[0][0])# 输出: ~0.7适用场景语义相似度需足够训练数据。4. 预训练模型BERT、Sentence-BERTBERT及其变体如Sentence-BERT能够捕捉深层次的语义信息适用于高精度文本相似度计算。4.1 使用Sentence-BERT推荐fromsentence_transformersimportSentenceTransformerfromsklearn.metrics.pairwiseimportcosine_similarity modelSentenceTransformer(all-MiniLM-L6-v2)# 轻量级模型text1Python is a programming languagetext2Python is used for data scienceembeddingsmodel.encode([text1,text2])similaritycosine_similarity([embeddings[0]],[embeddings[1]])[0][0]print(similarity)# 输出: ~0.8优点无需训练直接使用预训练模型。捕捉语义相似度如“猫”和“狗”比“猫”和“汽车”更相似。适用场景高精度语义相似度、问答系统、推荐系统。5. 总结与选型建议方法优点缺点适用场景Jaccard相似度简单、快速忽略词序和语义短文本、关键词匹配Levenshtein距离适用于拼写纠错计算复杂度高短文本、用户名匹配TF-IDF 余弦相似度适用于长文本忽略词序和语义文档检索、新闻分类Word2Vec捕捉词义需要训练数据语义相似度需足够数据Sentence-BERT高精度语义相似度计算较慢相比TF-IDF问答系统、推荐系统推荐选型快速实现TF-IDF 余弦相似度。高精度语义Sentence-BERT。拼写纠错Levenshtein距离。6. 完整代码示例Sentence-BERTfromsentence_transformersimportSentenceTransformerfromsklearn.metrics.pairwiseimportcosine_similarity# 加载预训练模型modelSentenceTransformer(all-MiniLM-L6-v2)# 待比较的文本texts[Python is a programming language,Python is used for data science,Java is another programming language,I love coding in Python]# 计算所有文本对的相似度embeddingsmodel.encode(texts)similarity_matrixcosine_similarity(embeddings)# 打印相似度矩阵foriinrange(len(texts)):forjinrange(len(texts)):print(fSimilarity({texts[i]}, {texts[j]}):{similarity_matrix[i][j]:.2f})输出示例Similarity(Python is a programming language, Python is a programming language): 1.00 Similarity(Python is a programming language, Python is used for data science): 0.82 Similarity(Python is a programming language, Java is another programming language): 0.65 Similarity(Python is a programming language, I love coding in Python): 0.71 ...7. 扩展阅读Sentence-BERT官方文档Gensim Word2Vec教程Scikit-learn TF-IDF向量化结语文本相似度计算是NLP的核心任务之一Python提供了从基础到高级的多种方法。根据业务需求选择合适的方法可以显著提升模型的性能和效率