使用TfidfVectorizer生成csr矩阵转array后全为0的原因求解
问题原因排查及解决方案
首先先确认矩阵是否真的全为0:
Tfidf生成的是稀疏矩阵,绝大多数位置天然就是0,你当前打印的arr[0][0]是第一个样本的第一个特征的数值,以及稀疏矩阵默认截断打印的头尾少量元素,看起来全是0属于正常现象,不代表整个矩阵没有有效数值。你可以先执行print(x_feature_train.nnz),该属性表示稀疏矩阵中非零元素的总数,如果返回值大于0,说明矩阵完全正常,只是你打印的位置刚好都是0。
如果x_feature_train.nnz返回0,说明确实生成了全0矩阵,常见原因如下:
- 输入的X_train不符合默认分词规则:TfidfVectorizer默认会过滤长度小于2的词汇、全符号/数字的内容以及内置停用词,如果你的所有训练文本都是单个字符、全是特殊符号/数字、或者全部属于内置停用词,就不会提取到任何有效特征,最终矩阵全0。
- 特征过滤参数设置过严:如果你自定义了
min_df/max_df参数,比如设置min_df=10要求词至少在10个样本中出现,但所有词的出现频次都低于阈值,就会被全部过滤,没有有效特征。 - 输入数据类型异常:如果X_train传入的不是字符串列表,而是数值、空字符串、或者其他非字符串类型对象,分词器无法提取有效词汇,也会生成全0矩阵。
排查方法
执行print(vector.get_feature_names_out())查看生成的特征词表:
- 如果词表为空,说明确实没有提取到有效特征,可以调整分词规则、降低
min_df阈值、检查输入语料格式后重新运行。 - 如果词表非空,你可以通过词表索引查看对应位置的数值,比如特征词表第一个词是
"测试",就执行print(arr[0][vector.vocabulary_["测试"]]),就能看到对应的非零TF-IDF数值。
内容的提问来源于stack exchange,提问作者Abhinav Wadhwa
相关产品推荐
相关产品推荐

