如何读取文本文件首行并用Porter Stemmer做词干提取,解决相关报错
报错原因与修复方案
报错根因
f.readlines()的返回值是包含文件所有行的列表,对应你的测试文件,lines的值为['eats\n', 'runs\n']。而PorterStemmer.stem()仅支持传入单个字符串参数,方法内部会自动对入参调用lower()做小写转换,你传入列表类型参数自然会抛出'list' object has no attribute 'lower'的异常。
修复代码(匹配需求:仅处理第一行)
你需要先取第一行内容,再去掉行尾的换行符,修正后代码如下:
from nltk.stem.porter import PorterStemmer word_stemmer = PorterStemmer() with open('notepad.txt', 'r', encoding='utf-8') as f: # 读取第一行并清除首尾空白/换行符 first_word = f.readline().strip() result = word_stemmer.stem(first_word) print(result)
运行后输出即为你期望的eat。
扩展:批量处理所有行
如果需要对文件中所有行的单词统一做词干提取,可使用如下写法:
from nltk.stem.porter import PorterStemmer word_stemmer = PorterStemmer() with open('notepad.txt', 'r', encoding='utf-8') as f: word_list = [line.strip() for line in f if line.strip()] stem_result = [word_stemmer.stem(word) for word in word_list] print(stem_result) # 输出:['eat', 'run']
内容的提问来源于stack exchange,提问作者Majin Board
相关产品推荐
相关产品推荐

