求助:将TF-IDF稀疏矩阵转为Pandas表格时全为0的问题
检查文本预处理是否过度
要是预处理太严格,比如把所有词汇都当停用词过滤了,或者分词后只剩空字符串,TF-IDF自然没内容可计算。比如用stop_words='english'但文本全是英文停用词,或是自定义停用词表覆盖了所有词汇。
解决:先打印几条预处理后的文本确认,比如print([doc[:50] for doc in processed_text[:3]]),看看有没有有效词汇。调整预处理逻辑,比如缩小停用词范围,或是检查分词、去标点的代码有没有误删有效词。核对TF-IDF的参数设置
比如min_df设得太高(比如min_df=10但所有词出现次数都低于10),所有词汇会被过滤,vectorizer.vocabulary_会是空字典,结果肯定全0。另外max_df设得太低、max_features太小也可能导致没有符合条件的词被保留。
解决:先查看print(vectorizer.vocabulary_),如果是空的就调整参数,比如把min_df改成1或2,max_df设为0.9,先去掉max_features做测试。确认是否正确生成TF-IDF矩阵
别只调用vectorizer.fit(text)就结束,得用fit_transform或者先fit再transform才能生成矩阵。要是只fit,只是训练了词汇表,没生成对应的TF-IDF值。
解决:确保代码是tfidf_matrix = vectorizer.fit_transform(processed_text),而非单独的vectorizer.fit(processed_text)。排查稀疏矩阵的显示问题
有时候稀疏矩阵里有非零值,但因为数值太小,转成array或DataFrame时被默认打印精度四舍五入成0了。可以先查非零元素数量:print(tfidf_matrix.nnz),如果这个数大于0,说明有有效数据。
解决:用pd.DataFrame(tfidf_matrix.todense(), columns=vectorizer.get_feature_names_out())生成表格,或是设置打印精度:pd.set_option('display.float_format', '{:.6f}'.format),就能看到小数值了。检查数据集本身的问题
如果所有文本完全一致,或是数据集为空,每个词的IDF值会是0(因为每个词在所有文档里都出现),最终TF-IDF结果全0。
解决:先检查数据集,确保有不同的文本样本,既不是空的也不是全重复的内容。
内容的提问来源于stack exchange,提问作者Keenan AH

