如何用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
相关产品推荐
相关产品推荐

