You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 03:09:02