Scikit Learn:如何将TF-IDF得分最高的前n个词输入K-means聚类
如何仅使用TF-IDF得分最高的前n个词进行K-Means聚类
当然可以实现这个需求!核心思路是先找出TF-IDF向量中全局权重最高的前n个词,然后只保留这些词对应的特征列作为K-Means的输入。下面是具体的实现步骤和修改后的代码:
实现步骤
- 计算每个词(TF-IDF特征)的全局总TF-IDF得分(用所有文档中该词的得分总和衡量其整体重要性)
- 根据总得分排序,选出前n个词对应的特征索引
- 从原TF-IDF矩阵中提取这些索引对应的列,得到精简后的特征矩阵
- 用精简后的矩阵进行K-Means聚类和后续的PCA可视化
修改后的完整代码
from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.cluster import KMeans from sklearn.decomposition import PCA import matplotlib.pyplot as plt # 假设你已定义变量:num_clusters, max_iterations, pca_num_components, labels_color_map, df_doc_wholetext # 1. 初始化TF-IDF向量器并生成矩阵 vect = TfidfVectorizer(ngram_range=(1,3), stop_words='english') tfidf_matrix = vect.fit_transform(df_doc_wholetext['csv_text']) # 2. 筛选前n个TF-IDF权重最高的词 n = 100 # 替换为你需要的前n个词的数量 # 获取所有特征(词)的名称 feature_names = vect.get_feature_names_out() # 计算每个特征的全局总TF-IDF得分 tfidf_sums = tfidf_matrix.sum(axis=0).A1 # A1将矩阵转为一维数组 # 按得分从高到低排序,提取前n个特征的索引 top_n_indices = tfidf_sums.argsort()[::-1][:n] # 3. 提取精简后的TF-IDF矩阵(仅保留前n个特征) reduced_tfidf_matrix = tfidf_matrix[:, top_n_indices] # 4. 执行K-Means聚类 clustering_model = KMeans( n_clusters=num_clusters, max_iter=max_iterations, precompute_distances="auto", n_jobs=-1 ) labels = clustering_model.fit_predict(reduced_tfidf_matrix) # 5. PCA降维并可视化(流程和原代码一致,仅使用精简后的矩阵) x = reduced_tfidf_matrix.todense() reduced_data = PCA(n_components=pca_num_components).fit_transform(x) fig, ax = plt.subplots() for index, instance in enumerate(reduced_data): pca_comp_1, pca_comp_2 = reduced_data[index] color = labels_color_map[labels[index]] ax.scatter(pca_comp_1, pca_comp_2, c=color) plt.show() # 可选:查看筛选出的前n个词 top_n_words = [feature_names[i] for i in top_n_indices] print(f"Top {n} TF-IDF words:") print(top_n_words)
关键细节说明
- 用总得分衡量全局重要性:总得分越高,说明这个词在更多文档中拥有较高的TF-IDF值,更具语料级的代表性;如果想改用平均得分,只需把
tfidf_sums = tfidf_matrix.sum(axis=0).A1改成tfidf_means = tfidf_matrix.mean(axis=0).A1,后续排序逻辑不变。 argsort()[::-1][:n]:argsort()返回按得分从小到大排序的索引,[::-1]反转成从大到小,[:n]截取前n个索引。
内容的提问来源于stack exchange,提问作者SVK
相关产品推荐
相关产品推荐

