使用TfidfVectorizer提取特征词-IDF值时遇TypeError,求排查解决
问题定位与修复
1. 触发TypeError的直接原因
你遇到的TypeError: 'builtin_function_or_method' object is not iterable,根源在于这行代码:
sorted_scores = sorted(features_name.items, key= operator.itemgetter(1), reverse=True)
字典的items是方法,不是直接可迭代的对象,必须通过items()调用它,才能获取字典的键值对迭代器。你漏写了括号,导致Python把items当成了方法本身而非它的返回值,自然无法迭代。
2. 修正后的代码片段
把items改成items()即可修复这个错误,修正后的完整代码如下:
import operator # 关联特征名与IDF值 idf = tfv.idf_ features_name = dict(zip(tfv.get_feature_names(), idf)) # 按IDF值降序排序并打印 sorted_scores = sorted(features_name.items(), key=operator.itemgetter(1), reverse=True) for item in sorted_scores: print("{} Score: {}".format(item[0], item[1]))
3. 更优解决方案(简洁易读+拓展性强)
如果只是想查看特征词与IDF值的排序结果,用pandas处理会更高效——代码更简洁,还能方便后续的筛选、可视化操作:
import pandas as pd # 直接生成包含特征名和IDF值的DataFrame idf_df = pd.DataFrame({ 'feature': tfv.get_feature_names(), 'idf_score': tfv.idf_ }) # 按IDF值降序排序 sorted_idf_df = idf_df.sort_values(by='idf_score', ascending=False) # 打印前20条高IDF值的特征(按需调整数量) print(sorted_idf_df.head(20)) # 若要输出全部结果,直接打印整个DataFrame即可 # print(sorted_idf_df)
另外补充一点:你用tfv.fit((xtrain) + (xvalid))的半监督方式拟合TF-IDF是合理的(利用全部文本的词汇分布),且后续用训练好的转换器转换训练集和验证集的操作也是正确的,这部分无需调整。
内容的提问来源于stack exchange,提问作者Win Wongsawatdichart
相关产品推荐
相关产品推荐

