Python中如何用stanza库对DataFrame做词形还原并解决代码报错?
错误原因
- 匿名函数参数名不匹配:lambda声明的入参是
x,但函数体内使用了未定义的变量row,直接触发NameError - 数据格式不兼容:
noticia列存储的是字符串形式的列表,不是真实的Python列表,直接传入模型会把方括号、引号等符号当成普通文本处理 - 属性名误用:stanza的词形还原结果属性是
lemma,带下划线的lemma_是spaCy库的属性,混用会取不到值 - 变量名不匹配:调用自定义函数时传入的第一个参数是
data,但你定义的DataFrame变量名是df,会触发另一个NameError - stanza结果遍历逻辑错误:stanza处理文本后返回的Doc对象需要先遍历句子(sentences)再遍历单词(words)才能取到词元
修正后可运行的完整代码
import pandas as pd import ast import stanza # 构建测试数据集 dict_noticia = {'nome_adm': ['CC Brasil', 'ABC Futuro Esporte', 'Tabuao'], 'noticia': ["['folha', 'paulo', 'https', 'east', 'amazonaws', 'multclipp', 'arquivos', 'noticias', 'pdf', 'jpg', 'mônica', 'bergamo', 'longo', 'tempo']", "['coluna', 'estadão']", "['flamengo', 'futebol','melhor','campeao','é']"] } df = pd.DataFrame(dict_noticia) # 加载葡萄牙语stanza模型,首次运行可去掉download_method参数自动下载模型 nlp_stanza = stanza.Pipeline(lang='pt', processors='tokenize,mwt,pos,lemma', download_method=None) def f_lematizacao_stanza(df, column_name, new_column_name): def lemmatize_text(text_str): # 将字符串格式的列表转换为真实Python列表 word_list = ast.literal_eval(text_str) # 拼接为空格分隔的文本传入stanza处理 raw_text = ' '.join(word_list) doc = nlp_stanza(raw_text) # 提取所有词元结果 return [word.lemma for sent in doc.sentences for word in sent.words] df[new_column_name] = df[column_name].apply(lemmatize_text) return df # 调用函数时传入正确的DataFrame变量名 df = f_lematizacao_stanza(df, 'noticia', 'noticia_lema') # 查看结果 print(df[['noticia', 'noticia_lema']])
关键调整说明
- 用
ast.literal_eval安全转换字符串格式的列表,避免符号干扰处理结果 - 替换逻辑混乱的lambda写法为可读性更高的嵌套函数,适配stanza的处理规则
- 修正了属性名、变量名的多处拼写错误
- 适配stanza的返回结构,正确遍历提取词形还原结果
内容的提问来源于stack exchange,提问作者Perciliano
相关产品推荐
相关产品推荐

