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

如何用Stanza对Pandas DataFrame的df['story']列做词形还原?需先分词吗?

词形还原实现指南

首先明确:词形还原必须先执行分词操作——因为词形还原是针对单个词汇的处理,只有把整段文本拆分成独立单词后,才能对每个词进行还原处理。

下面是两种最常用的Python实现方案:

方案一:用NLTK库手动实现

NLTK需要手动完成分词、词性标注、词形还原的全流程,适合需要精细控制步骤的场景:

  1. 安装并导入依赖,下载必要语料库
import pandas as pd
import nltk
from nltk.tokenize import word_tokenize
from nltk.stem import WordNetLemmatizer
from nltk.corpus import wordnet

# 首次运行需下载资源
nltk.download('punkt')
nltk.download('wordnet')
nltk.download('averaged_perceptron_tagger')
  1. 定义处理函数
# 把NLTK的词性标签转换成WordNetLemmatizer能识别的格式
def get_wordnet_pos(tag):
    if tag.startswith('J'):
        return wordnet.ADJ
    elif tag.startswith('V'):
        return wordnet.VERB
    elif tag.startswith('N'):
        return wordnet.NOUN
    elif tag.startswith('R'):
        return wordnet.ADV
    return wordnet.NOUN  # 默认按名词处理

def lemmatize_text(text):
    # 第一步:分词
    tokens = word_tokenize(text)
    # 第二步:标注词性
    pos_tags = nltk.pos_tag(tokens)
    # 第三步:词形还原
    lemmatizer = WordNetLemmatizer()
    lemmatized_tokens = [lemmatizer.lemmatize(token, get_wordnet_pos(tag)) for token, tag in pos_tags]
    # 可选:把还原后的词重新组合成文本
    return ' '.join(lemmatized_tokens)
  1. 应用到DataFrame列
df['lemmatized_story'] = df['story'].apply(lemmatize_text)

方案二:用spaCy库一键处理

spaCy的内置管道已经集成了分词、词性标注和词形还原,操作更简洁,适合大规模文本处理:

  1. 安装并加载模型
import pandas as pd
import spacy

# 加载英文小模型(首次运行需下载)
nlp = spacy.load('en_core_web_sm')
  1. 定义处理函数
def lemmatize_text_spacy(text):
    doc = nlp(text)
    # 提取词形还原结果,过滤掉标点
    lemmatized_tokens = [token.lemma_ for token in doc if not token.is_punct]
    return ' '.join(lemmatized_tokens)
  1. 应用到DataFrame列
df['lemmatized_story'] = df['story'].apply(lemmatize_text_spacy)

额外说明

  • 如果处理的是中文文本,需要替换成中文工具链(比如jieba分词+HanLP词形还原),以上方案针对英文文本设计。
  • spaCy的词性判断精度更高,处理大体积文本时效率也优于NLTK,优先推荐。

内容的提问来源于stack exchange,提问作者rafine

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 01:26:01