Porter Stemmer算法逐行处理句子报AttributeError问题求助
问题根因
触发AttributeError: 'list' object has no attribute 'lower'的核心原因有2个:
- 如果你是通过
df['Review'].apply(porterStemmer)的方式调用函数,传入text参数的是单条review字符串而非整个Review列的列表。你对字符串做循环遍历时,每次拿到的line是单个字符,若数据集存在空值、格式错误的行,导致某行Review被解析为列表,后续word_tokenize处理时内部会调用.lower()方法,列表没有该方法就会抛出报错。 - 你的函数本身逻辑存在问题:循环内每次都会重置
words列表,最终只会返回最后一行/最后一个字符的处理结果,之前的处理结果全部被覆盖。
修复方案
首先调整函数逻辑,让函数仅处理单条review字符串,无需额外循环,同时修正csv读取的分隔符配置:
import pandas as pd import nltk from nltk.tokenize import word_tokenize from nltk.stem import PorterStemmer # 提前下载分词依赖避免报错 nltk.download('punkt') ps = PorterStemmer() def porterStemmer(text): # 增加类型判断,过滤非字符串内容避免报错 if not isinstance(text, str): return [] words = word_tokenize(text) stem_words = [ps.stem(x) for x in words] return stem_words # 你的数据集是制表符分隔,必须指定sep参数,否则会把两列读成一列 df = pd.read_csv('test_data.csv', sep='\t') # 逐行处理Review列 df['stemmed_review'] = df['Review'].apply(porterStemmer)
内容的提问来源于stack exchange,提问作者N K
相关产品推荐
相关产品推荐

