如何实现标题-段落对与指定通用标题的cosine语义相似度计算
余弦语义相似度计算最优实现策略
1. 技术选型
优先选择Sentence-BERT(封装在sentence-transformers库)作为语义表征方案,优势如下:专门针对语义相似度任务优化,生成的句向量可直接用于余弦相似度计算,推理速度比原生BERT快数个量级,效果远优于TF-IDF、Word2Vec等传统无监督表征方案,可同时适配短标题、长段落的混合输入场景。如果是中文内容,可直接选择对应的多语言或中文预训练权重。
2. 文本表征处理流程
- 通用标题预处理:直接将通用标题输入预训练模型,生成固定维度的语义向量
vec_general - 【标题-段落】对预处理:可根据业务需求二选一:
- 无权重差异化需求:直接把
待匹配标题 + 分隔符 + 段落内容拼接为单条文本,输入模型生成向量vec_pair - 需要突出标题权重:分别给待匹配标题、段落生成向量
vec_title、vec_content,按权重加权融合,例如vec_pair = 0.7 * vec_title + 0.3 * vec_content,权重值可根据实际测试效果调整
- 无权重差异化需求:直接把
3. 相似度计算
直接计算两个向量的余弦值即可,取值范围为0~1,数值越高代表相似度越高。可直接调用sklearn.metrics.pairwise.cosine_similarity实现,也可自行实现「向量点积除以向量模长乘积」的计算逻辑。
4. 可运行参考代码
from sentence_transformers import SentenceTransformer from sklearn.metrics.pairwise import cosine_similarity # 加载预训练模型,中文场景可替换为多语言/中文专用模型 model = SentenceTransformer('all-MiniLM-L6-v2') # 生成通用标题向量 general_title = "指定的通用标题内容" vec_general = model.encode(general_title).reshape(1, -1) # 待匹配的【标题-段落】列表 pair_list = [ "标题1 段落1全部内容", "标题2 段落2全部内容" ] vec_pairs = model.encode(pair_list) # 批量计算相似度 similarity_scores = cosine_similarity(vec_general, vec_pairs)[0] # 输出结果 for idx, score in enumerate(similarity_scores): print(f"第{idx+1}组匹配度:{score:.4f}")
内容的提问来源于stack exchange,提问作者tasos_koukos
相关产品推荐
相关产品推荐

