如何对DataFrame列中的字符串列表执行词形还原?
解决DataFrame列表列的词形还原问题
问题场景
你的DataFrame中df['Review']列的每一行都是字符串列表(比如["eating", "cats", "becoming"]),想要对所有列表执行词形还原得到["eat", "cat", "become"],但现有代码运行报错。
原代码错误原因
你的代码存在两个核心问题:
lem函数中用range(len(x))遍历得到的是整数索引,把整数传给lemmatizer.lemmatize()会触发错误——这个方法需要传入字符串,因此出现'int' object has no attribute 'endswith'的提示。lem函数没有返回值,处理后的结果无法传递回去,最终会把None赋值给目标列。
修正后的代码
方法1:自定义函数处理
from nltk.stem import WordNetLemmatizer import pandas as pd lemmatizer = WordNetLemmatizer() def lem(word_list): # 遍历列表中的每个单词,执行词形还原后返回新列表 return [lemmatizer.lemmatize(word) for word in word_list] # 直接对Review列应用函数,无需指定axis=1(Series级别操作) df['Review'] = df['Review'].apply(lem)
方法2:简化为lambda表达式
如果不想单独定义函数,可以直接用lambda表达式实现:
df['Review'] = df['Review'].apply(lambda lst: [lemmatizer.lemmatize(word) for word in lst])
进阶优化(可选)
WordNetLemmatizer默认按名词规则还原,若要更准确处理动词、形容词等,可以手动指定词性参数:
def lem_with_pos(word_list): processed = [] for word in word_list: # 先尝试动词还原,再尝试名词,提升还原准确性 lemma = lemmatizer.lemmatize(word, pos='v') lemma = lemmatizer.lemmatize(lemma, pos='n') processed.append(lemma) return processed df['Review'] = df['Review'].apply(lem_with_pos)
内容的提问来源于stack exchange,提问作者jam
相关产品推荐
相关产品推荐

