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

如何用Matplotlib可视化TF-IDF向量化后的文档向量?

TF-IDF向量可视化展示相似词的方法

先修正一个小问题

你的代码仅用doc1拟合TF-IDF向量器,会导致doc2中不在doc1词汇表内的词被直接忽略。如果要完整覆盖两个文档的词汇,建议调整为:

tfidf_vectorizer = TfidfVectorizer()
# 用两个文档一起拟合向量器
tfidf_matrix = tfidf_vectorizer.fit_transform([doc1, doc2])
doc1_tfidf = tfidf_matrix[0]
doc2_tfidf = tfidf_matrix[1]

方法1:共现词权重对比条形图

直接提取两个文档中都出现的词汇,对比它们的TF-IDF权重,权重越高说明该词在对应文档中越重要,若两个文档中同一词权重都高,就是核心相似词。

import matplotlib.pyplot as plt
import numpy as np

# 获取词汇表
feature_names = tfidf_vectorizer.get_feature_names_out()

# 稀疏矩阵转数组
doc1_weights = doc1_tfidf.toarray().flatten()
doc2_weights = doc2_tfidf.toarray().flatten()

# 筛选两个文档中都存在的词(权重不为0)
common_mask = (doc1_weights > 0) & (doc2_weights > 0)
common_words = feature_names[common_mask]
doc1_common_weights = doc1_weights[common_mask]
doc2_common_weights = doc2_weights[common_mask]

# 绘制条形图
x = np.arange(len(common_words))
width = 0.35

fig, ax = plt.subplots(figsize=(12, 6))
ax.bar(x - width/2, doc1_common_weights, width, label='文档1')
ax.bar(x + width/2, doc2_common_weights, width, label='文档2')

ax.set_xticks(x)
ax.set_xticklabels(common_words, rotation=45, ha='right')
ax.set_ylabel('TF-IDF权重')
ax.set_title('两个文档共现词的TF-IDF权重对比')
ax.legend()

plt.tight_layout()
plt.show()

方法2:TF-IDF权重热力图

用热力图展示所有在至少一个文档中出现的词汇的权重,颜色深浅对应权重大小,能快速定位两个文档中权重都高的相似词。

import seaborn as sns

# 合并两个文档的权重矩阵
combined_weights = np.vstack([doc1_weights, doc2_weights])

# 筛选至少一个文档中权重不为0的词
non_zero_mask = (combined_weights != 0).any(axis=0)
filtered_weights = combined_weights[:, non_zero_mask]
filtered_words = feature_names[non_zero_mask]

# 绘制热力图
plt.figure(figsize=(15, 3))
sns.heatmap(filtered_weights, annot=True, fmt='.2f', 
            xticklabels=filtered_words, yticklabels=['文档1', '文档2'], 
            cmap='Blues')
plt.title('TF-IDF权重热力图')
plt.tight_layout()
plt.show()

方法3:降维可视化(PCA/t-SNE)

把高维的TF-IDF向量降到2维平面,将两个文档和所有词汇的向量一起展示,靠近两个文档的词汇就是对两者都重要的相似词。

from sklearn.decomposition import PCA

# 准备数据:两个文档 + 所有单字词文档
all_samples = [doc1, doc2] + list(feature_names)
all_tfidf = tfidf_vectorizer.fit_transform(all_samples)

# PCA降维到2D
pca = PCA(n_components=2)
pca_results = pca.fit_transform(all_tfidf.toarray())

# 绘图
plt.figure(figsize=(10, 8))
# 绘制两个文档的点
plt.scatter(pca_results[0, 0], pca_results[0, 1], c='red', s=120, label='文档1')
plt.scatter(pca_results[1, 0], pca_results[1, 1], c='blue', s=120, label='文档2')
# 绘制词汇点并标注
for idx, word in enumerate(feature_names):
    plt.scatter(pca_results[2+idx, 0], pca_results[2+idx, 1], c='gray', s=60)
    plt.text(pca_results[2+idx, 0]+0.01, pca_results[2+idx, 1]+0.01, word, fontsize=10)

plt.title('TF-IDF向量PCA降维可视化')
plt.legend()
plt.show()

内容的提问来源于stack exchange,提问作者MTV

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 23:15:32