基于word2vec的句子对相似度得分计算及方法优劣对比咨询
嘿,这个问题问到点子上了!作为经常在NLP领域摸爬滚打的人,我来给你详细唠唠这两个问题。
一、用Word2Vec计算句子对相似度的具体步骤
其实核心思路是把句子转换成向量(句向量),再用相似度算法(比如余弦相似度)计算得分,具体分这几步:
准备Word2Vec模型
你可以用预训练好的通用模型(比如基于维基百科语料训练的),也可以用自己的领域专属语料训练模型。如果用Python的话,gensim库是最常用的工具,加载模型很方便:from gensim.models import Word2Vec # 加载自己训练的模型 model = Word2Vec.load("my_word2vec_model.bin") # 若是Google的预训练模型,用KeyedVectors加载 # from gensim.models import KeyedVectors # model = KeyedVectors.load_word2vec_format('GoogleNews-vectors-negative300.bin', binary=True)预处理句子
对每个句子做分词、去除停用词(比如“的”“了”这种无意义虚词),中文场景可以用jieba分词:import jieba from stopwordsiso import stopwords def preprocess_sentence(sentence): # 分词 words = jieba.lcut(sentence) # 过滤停用词 filtered_words = [word for word in words if word not in stopwords('zh')] return filtered_words生成句向量
把句子里每个词的Word2Vec向量提取出来,计算平均向量(这是最常用的方法,也可以用TF-IDF加权平均来提升精准度):import numpy as np def get_sentence_vector(sentence_words, model): word_vectors = [] for word in sentence_words: if word in model.wv: word_vectors.append(model.wv[word]) if not word_vectors: # 若句子中没有词在模型词表中,返回零向量 return np.zeros(model.vector_size) # 计算平均向量作为句向量 return np.mean(word_vectors, axis=0)计算句子对的相似度得分
用余弦相似度计算两个句向量的相似度,得分范围在[-1,1],越接近1说明句子越相似:from sklearn.metrics.pairwise import cosine_similarity def calculate_sentence_similarity(sent1, sent2, model): # 预处理两个句子 words1 = preprocess_sentence(sent1) words2 = preprocess_sentence(sent2) # 获取句向量 vec1 = get_sentence_vector(words1, model).reshape(1, -1) vec2 = get_sentence_vector(words2, model).reshape(1, -1) # 计算余弦相似度得分 sim_score = cosine_similarity(vec1, vec2)[0][0] return sim_score调用这个函数,就能得到任意一对句子的相似度得分了。
二、Word2Vec vs 传统余弦相似度(比如TF-IDF余弦),优势在哪?
首先得明确:传统余弦相似度一般基于**词袋模型(Bag of Words)**或TF-IDF,和Word2Vec的核心区别在于是否能捕捉语义信息:
- 理解词的语义关联:传统方法只看词的出现频率,比如“苹果(水果)”和“香蕉”,如果语料中共现少,传统余弦得分会很低;但Word2Vec通过上下文训练,能识别它们都是水果,向量距离很近,相似度得分更合理。
- 处理同义词/近义词:比如“汽车”和“轿车”,传统方法会把它们当成完全不同的词,而Word2Vec的向量会非常接近,能正确识别二者的相似性。
- 缓解数据稀疏问题:对于低频词,传统TF-IDF会给极低权重甚至忽略;但Word2Vec可以通过上下文语境给低频词生成合理向量,哪怕这个词只出现几次。
- 泛化能力更强:比如训练时见过“猫喜欢吃鱼”,遇到“猫咪爱吃鱼”,Word2Vec能识别这两个句子相似;而传统方法可能因为“猫”和“猫咪”是不同词,得分不高。
当然,Word2Vec也不是万能的:比如句子过短、存在歧义(比如“苹果”指公司还是水果)、训练数据质量差时,效果会打折扣;而且平均法生成句向量的方式忽略了词序,后来的Doc2Vec、BERT等模型更先进,但在很多轻量化场景下,Word2Vec已经足够好用且高效。
内容的提问来源于stack exchange,提问作者Cong Yang
相关产品推荐
相关产品推荐

