Sklearn TfidfVectorizer的get_feature_names_out()输出无意义词疑问
TfidfVectorizer输出无意义特征词来源说明
这些无意义字符全部来自20newsgroups数据集本身,和scikit-learn的内置内容没有任何关系。
- scikit-learn的
TfidfVectorizer本身不预置任何固定词表,所有输出的特征名,都是它从传入的拟合文本里按规则切分提取出的token,不会凭空生成词汇,也没有内置的词库类内容。 - 20newsgroups是采集自90年代Usenet新闻组的真实用户发帖语料,本身就带有大量原生噪声:包括用户随手输入的乱码、签名档的特殊符号串、早期论坛的排版分隔线、打字错误、非英语零散字符、设备型号/用户id类无意义字符串,你看到的
zz_g9q3、长串下划线组成的分隔符、带特殊重音的零散字符都属于这类原始噪声。 - 验证方式非常简单:直接在原始的
newsgroups_train.data或newsgroups_test.data文本列表里搜索zz_g9q3这类字符串,就能直接定位到包含该内容的原始发帖。
另外你贴的代码存在流程疏漏:你只实例化了向量器,没有在训练集上调用fit()/fit_transform()学习词表,直接对测试集调用transform()会触发未拟合错误,应该是整理代码的时候漏了训练集拟合的步骤。如果要减少这类无意义特征的干扰,可以在初始化向量器、加载数据集的时候加简单的过滤规则:
- 加载20newsgroups时传入参数
remove=('headers', 'footers', 'quotes'),去掉邮件头、页脚签名、引用内容,能过滤掉大部分签名档类乱码 - 初始化
TfidfVectorizer时设置min_df=2,过滤掉仅在1篇文档里出现的极低频乱码 - 可以通过
token_pattern参数设置更严格的词匹配规则,比如仅匹配纯字母组成的字符串,过滤掉带特殊符号的乱码token
内容的提问来源于stack exchange,提问作者IMSC Panda
相关产品推荐
相关产品推荐

