如何用Stanza对Pandas DataFrame的df['story']列做词形还原?需先分词吗?
词形还原实现指南
首先明确:词形还原必须先执行分词操作——因为词形还原是针对单个词汇的处理,只有把整段文本拆分成独立单词后,才能对每个词进行还原处理。
下面是两种最常用的Python实现方案:
方案一:用NLTK库手动实现
NLTK需要手动完成分词、词性标注、词形还原的全流程,适合需要精细控制步骤的场景:
- 安装并导入依赖,下载必要语料库
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')
- 定义处理函数
# 把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)
- 应用到DataFrame列
df['lemmatized_story'] = df['story'].apply(lemmatize_text)
方案二:用spaCy库一键处理
spaCy的内置管道已经集成了分词、词性标注和词形还原,操作更简洁,适合大规模文本处理:
- 安装并加载模型
import pandas as pd import spacy # 加载英文小模型(首次运行需下载) nlp = spacy.load('en_core_web_sm')
- 定义处理函数
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)
- 应用到DataFrame列
df['lemmatized_story'] = df['story'].apply(lemmatize_text_spacy)
额外说明
- 如果处理的是中文文本,需要替换成中文工具链(比如jieba分词+HanLP词形还原),以上方案针对英文文本设计。
- spaCy的词性判断精度更高,处理大体积文本时效率也优于NLTK,优先推荐。
内容的提问来源于stack exchange,提问作者rafine
相关产品推荐
相关产品推荐

