如何提取TfidfVectorizer结果中低于指定tf-idf分数的词汇
筛选TF-IDF分数低于指定阈值词汇的实现方法
不需要将csr稀疏矩阵转换为稠密数组,直接操作稀疏矩阵的内置属性即可完成筛选,内存效率更高,不会出现转换失败的问题。
实现步骤
保存TF-IDF计算结果,提取词汇映射关系
先将拟合输出的矩阵存储为变量,同时通过向量化器的内置方法拿到词汇索引到实际词的映射:tfidf_vect = TfidfVectorizer(analyzer=clean) # 不要直接打印结果,将矩阵存为变量 tfidf_matrix = tfidf_vect.fit_transform(df['text']) # 获取索引对应的词汇文本 feature_names = tfidf_vect.get_feature_names_out()遍历稀疏矩阵筛选符合阈值的记录
csr矩阵的非零值、对应词汇索引、文档分段信息都存在内置属性中,直接遍历非零元素即可,无需加载全量稠密数据:# 设定分数阈值 score_threshold = 0.1 filter_result = [] for doc_id in range(tfidf_matrix.shape[0]): # 定位当前文档在稀疏矩阵存储结构中的起止位置 start_pos = tfidf_matrix.indptr[doc_id] end_pos = tfidf_matrix.indptr[doc_id + 1] # 遍历当前文档下的所有TF-IDF计算值 for ptr in range(start_pos, end_pos): current_score = tfidf_matrix.data[ptr] word_id = tfidf_matrix.indices[ptr] current_word = feature_names[word_id] if current_score < score_threshold: filter_result.append({ "文档索引": doc_id, "词汇": current_word, "词汇索引": word_id, "TF-IDF分数": current_score }) # 转换为表格格式方便查看 result_df = pd.DataFrame(filter_result)
补充:筛选全局平均TF-IDF最低的词汇
如果需要筛选所有文档中平均TF-IDF分数低于阈值的词汇,而非单文档维度的低分词,可以使用以下逻辑:
import numpy as np # 计算每个词汇的全文档平均TF-IDF值 word_avg_score = np.array(tfidf_matrix.mean(axis=0)).flatten() # 生成筛选掩码 low_score_mask = word_avg_score < score_threshold # 提取符合条件的词汇 global_low_score_words = [ { "词汇": feature_names[idx], "词汇索引": idx, "平均TF-IDF分数": word_avg_score[idx] } for idx in np.where(low_score_mask)[0] ] global_result_df = pd.DataFrame(global_low_score_words)
注意:不建议直接使用
.toarray()将csr矩阵转为稠密数组,当语料规模大、词汇表维度高时,稠密数组会占用极高内存,极易触发内存溢出问题。
内容的提问来源于stack exchange,提问作者Nuri Taş
相关产品推荐
相关产品推荐

