使用Python+Spacy循环处理句子并提取词性至DataFrame的问题
解决Spacy词性标注后高效存入DataFrame的问题
问题根源
你碰到的PerformanceWarning,是因为循环里反复调用insert添加列——每一次插入都会重构DataFrame的内存结构,次数多了就会导致数据碎片化,拖慢性能。
优化方案:一次性生成所有POS列再合并
核心思路是先把所有句子的POS结果批量处理成结构化的DataFrame,再和原数据合并,只做一次合并操作,彻底避免频繁修改原DataFrame的问题。
具体代码实现
- 加载Spacy模型(根据语言选择对应模型,示例用英文模型)
import spacy import pandas as pd # 加载Spacy模型,中文替换为zh_core_web_sm nlp = spacy.load("en_core_web_sm")
- 定义单句处理函数,返回该句所有token的词性列表
def extract_pos(sentence): doc = nlp(sentence) return [token.pos_ for token in doc]
- 批量处理所有句子,生成词性结果的DataFrame
# 假设原DataFrame的句子列名为"sentence",请根据实际情况修改 pos_results = sentences["sentence"].apply(extract_pos) # 把每个句子的词性列表展开为列,自动生成text1、text2...格式的列名 max_token_count = max(pos_results.apply(len)) pos_df = pd.DataFrame( pos_results.tolist(), columns=[f"text{i+1}" for i in range(max_token_count)] )
- 合并原数据与词性结果
final_data = pd.concat([sentences, pos_df], axis=1)
- 直接导出到Excel
final_data.to_excel("词性标注结果.xlsx", index=False)
方案优势
- 彻底消除数据碎片化警告,性能比循环插入列提升明显
- 代码简洁无嵌套循环,可读性和维护性更高
- 全程自动化处理,无需逐句编写重复代码
内容的提问来源于stack exchange,提问作者aliencode
相关产品推荐
相关产品推荐

