You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 06:17:33