Python实战:基于余弦相似度的中文短文本相似性计算
1. 为什么需要中文短文本相似性计算在日常工作和生活中我们经常会遇到需要比较两段中文文本相似度的场景。比如在客服系统中自动匹配相似问题在内容平台上检测重复文章或者在搜索引擎中推荐相关文档。这些场景都离不开文本相似性计算。中文文本相似性计算与英文最大的不同在于分词处理。英文天然以空格分隔单词而中文需要专门的分词技术。我曾经在一个电商评论分析项目中就因为最初没有处理好分词导致手机很好用和手机壳很好用被判断为高度相似闹出了笑话。余弦相似度特别适合处理这类问题因为它只考虑向量的夹角而非绝对距离。这意味着即使两段文本长度差异很大比如一条评论是好用另一条是这款手机确实非常好用性能强劲只要它们谈论的是相同主题就能获得较高的相似度评分。2. 完整实现流程详解2.1 文本预处理实战技巧中文文本预处理有这几个关键步骤特殊字符处理需要过滤掉标点符号、特殊符号等噪声。但要注意保留有意义的数字比如12℃中的12。中文分词这是最关键的环节。我推荐使用jieba分词库它不仅准确率高还能识别新词import jieba text 今天温度是12摄氏度 seg_list jieba.lcut(text) print(seg_list) # [今天, 温度, 是, 12, 摄氏度]停用词过滤可以使用哈工大停用词表去除的、了等无实际意义的词。统一字符格式将所有字符转为小写全角转半角等。2.2 向量化处理的优化方案原始文章使用的是简单的词频向量化但在实际项目中我们可以做得更好TF-IDF加权考虑词语在整个语料库中的重要性词向量平均使用预训练的中文词向量如腾讯词向量加入N-gram特征捕捉词语组合信息这里给出一个改进版的向量化函数from sklearn.feature_extraction.text import TfidfVectorizer import jieba def chinese_tokenizer(text): return jieba.lcut(text) tfidf TfidfVectorizer(tokenizerchinese_tokenizer) corpus [ hi今天温度是12摄氏度。, hello今天温度很高。 ] vectors tfidf.fit_transform(corpus) print(vectors.toarray())2.3 余弦相似度计算原理余弦相似度衡量的是两个向量在空间中的夹角余弦值计算公式为similarity (A·B) / (||A|| * ||B||)在Python中我们可以用NumPy高效实现import numpy as np def cosine_similarity(vec1, vec2): dot_product np.dot(vec1, vec2) norm1 np.linalg.norm(vec1) norm2 np.linalg.norm(vec2) return dot_product / (norm1 * norm2)这个公式的美妙之处在于它对文本长度不敏感更关注内容主题的一致性。我在一个新闻去重项目中测试过即使两篇文章长度相差3倍只要主题相同相似度仍然能达到0.8以上。3. 性能优化与生产环境实践3.1 大规模文本处理技巧当需要处理海量文本时原始方法会遇到性能瓶颈。以下是几个优化方案稀疏矩阵优化使用scipy.sparse矩阵存储向量并行计算利用多核CPU加速近似最近邻搜索使用Facebook的Faiss库这里给出一个支持批量计算的改进版本from sklearn.metrics.pairwise import cosine_similarity import numpy as np # 假设有1000个文本向量 vectors np.random.rand(1000, 300) # 计算所有文本两两之间的相似度 sim_matrix cosine_similarity(vectors) # 查找与第0个文本最相似的5个文本 most_similar np.argsort(-sim_matrix[0])[1:6]3.2 实际项目中的调参经验经过多个项目的实践我总结了这些调参技巧分词粒度选择细粒度分词适合短文本粗粒度适合长文本停用词处理领域相关停用词往往比通用停用词更重要相似度阈值设定需要根据具体场景通过实验确定在电商评论分析中我们发现0.7的阈值能较好区分相似评论而在法律文书比对中可能需要提高到0.85才能避免误判。4. 常见问题与解决方案4.1 中文特有的挑战中文文本处理有几个特殊问题未登录词问题新词、网络用语不断出现一词多义苹果可能指水果也可能指手机品牌同义词问题计算机和电脑表达相同意思解决方案包括定期更新分词词典使用词向量捕捉语义信息构建领域同义词库4.2 调试技巧与工具当相似度计算结果不符合预期时可以这样排查先检查分词结果是否正确打印向量化后的特征词表可视化向量分布使用PCA降维这里有个实用的调试函数def debug_similarity(text1, text2, vectorizer): print(分词结果:) print(vectorizer.build_tokenizer()(text1)) print(vectorizer.build_tokenizer()(text2)) vec1 vectorizer.transform([text1]) vec2 vectorizer.transform([text2]) print(\n特征词表:) print(vectorizer.get_feature_names_out()) print(\n向量值:) print(vec1.toarray()) print(vec2.toarray()) sim cosine_similarity(vec1, vec2)[0][0] print(f\n相似度: {sim:.4f}) return sim在实际项目中这套文本相似度计算方法已经帮助我完成了多个重要功能从用户评论聚类到智能客服问答匹配。最开始实现时确实遇到了不少坑比如忽略了停用词的影响或者没有处理好数字和特殊符号。经过多次迭代优化现在的版本已经能够稳定处理各种中文文本场景。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2482958.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!