如何基于sklearn训练的TF-IDF模型解决词类比问题并检索相似词向量?
嘿,这个思路挺有意思的!你已经完成了类比向量的计算,接下来只需要给vec4找到最相似的词向量就行,我来一步步拆解实现:
核心步骤:计算相似度并匹配词汇
首先得明确:你转置后的tfidf_docterm_matrix每一行就是一个词的TF-IDF向量,接下来我们要做的就是计算vec4和所有词向量的相似度,再把最相似的词找出来。
1. 整理词向量与词汇映射
先把词向量矩阵单独提取出来,同时构建一个索引到词汇的逆映射,方便后续把向量索引转换成具体的词:
# 提取所有词的TF-IDF向量矩阵(行对应词,列对应文档) word_vectors = tfidf_docterm_matrix.transpose() # 构建索引→词汇的映射(原vocabulary_是词→索引,这里做反转) idx_to_word = {index: word for word, index in tfidf_featuriser.vocabulary_.items()}
2. 计算余弦相似度
TF-IDF向量是稀疏矩阵,用sklearn自带的cosine_similarity计算效率最高,它能直接处理稀疏格式:
from sklearn.metrics.pairwise import cosine_similarity # 计算vec4和所有词向量的余弦相似度,得到一维的相似度数组 similarity_scores = cosine_similarity(vec4, word_vectors)[0]
3. 排序并筛选结果
把相似度和对应的词绑定,按相似度从高到低排序,同时过滤掉你用来做类比的原始词汇(避免把man/woman/king当成结果),最后取前几个最相似的:
# 将索引与相似度配对,按相似度降序排序 sorted_pairs = sorted(enumerate(similarity_scores), key=lambda x: x[1], reverse=True) # 排除输入的类比词,取前5个最相似的结果 exclude_words = {'man', 'woman', 'king'} top_matches = [ (idx_to_word[idx], score) for idx, score in sorted_pairs if idx_to_word[idx] not in exclude_words ][:5] # 打印结果 print("最相似的词:") for word, score in top_matches: print(f"{word}: {score:.4f}")
小提醒
这里要注意:TF-IDF是基于词的文档频率生成的向量,和Word2Vec这类基于语义训练的向量逻辑不同,它的“相似度”更多反映词在文档集中的共现模式,所以不一定能像Word2Vec那样精准匹配到queen,但这是用TF-IDF实现词类比的标准方式哦。
内容的提问来源于stack exchange,提问作者drew181
相关产品推荐
相关产品推荐

