将pandas DataFrame的列表列传入sklearn的TfidfVectorizer结果异常如何解决
问题分析与解决
异常结果产生原因
- 输入对象不符合接口要求:
TfidfVectorizer.fit_transform()默认接收一维字符串可迭代对象作为语料输入,你直接传入完整DataFramea时,接口不会自动读取'y'列的术语内容,而是将DataFrame的列名/整体结构作为极少量的文本输入处理,最终仅生成1个有效特征,对应你看到的[[1.]]输出。 - 数据结构与默认处理逻辑不匹配:'y'列的内容是两层嵌套列表,且你已经通过术语重复次数标注了出现频次,但
TfidfVectorizer默认会对输入字符串执行空格分词、特殊字符过滤等预处理逻辑,既无法识别嵌套列表结构,也不会直接复用你标注好的频次信息。
正确实现方案
你只需要先把'y'列的嵌套列表展开、拼接为空格分隔的字符串,即可直接匹配TfidfVectorizer的处理逻辑,重复的术语会被自动统计为对应词频,无需额外调整词频计算逻辑。
完整代码示例
import pandas as pd from sklearn.feature_extraction.text import TfidfVectorizer # 原始DataFrame a = pd.DataFrame({ 'x': {0: 'John', 1: 'Ron', 2: 'Don'}, 'y': { 0: [['Apple','Apple','Apple'],['Ball','Ball'],['Cat']], 1: [['Zebra','Zebra'],['Fox','Fox']], 2: [['Elf'],['Ball','Ball']] } }) # 展开嵌套列表为空格分隔的术语字符串 def process_terms(nested_terms): flat_terms = [term for sublist in nested_terms for term in sublist] return " ".join(flat_terms) # 生成符合要求的语料列表 corpus = a['y'].apply(process_terms).tolist() # 执行TF-IDF转换 tfidf = TfidfVectorizer() tfidf_matrix = tfidf.fit_transform(corpus)
结果验证
# 输出所有特征词 print(tfidf.get_feature_names_out()) # 输出转换后的TF-IDF矩阵 print(tfidf_matrix.toarray())
输出将包含Apple、Ball、Cat、Elf、Fox、Zebra共6个特征,对应3条文档的TF-IDF数值,符合预期需求。
内容的提问来源于stack exchange,提问作者Martan
相关产品推荐
相关产品推荐

