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

如何用Spacy遍历DataFrame的categories列提取命名实体?

解决方法:用spaCy为DataFrame的分类列标注命名实体

问题根源

你的错误主要来自两个方面:

  • 未正确处理categories列中字符串形式的列表(比如"[amazon]"、"[]"),直接传给spaCy会导致解析无效内容。
  • 混淆了spaCy的Doc和Token对象属性:ents是Doc对象的属性,pos_/dep_是Token对象的属性,你之前的代码错误地在Doc上调用了Token的属性。

分步解决方案

1. 预处理分类列,提取有效文本

首先把字符串格式的列表转换成纯文本,空列表直接转为空字符串:

import re
import pandas as pd
import spacy

# 加载德语模型
nlp = spacy.load("de_core_news_sm")

# 提取括号内的有效文本
def extract_category_text(raw_text):
    # 匹配[]中的内容,忽略前后空格
    match_result = re.search(r'\[(.*?)\]', raw_text)
    if match_result:
        content = match_result.group(1).strip()
        return content if content else ""
    return ""

# 生成处理后的文本列
df['cleaned_category'] = df['categories'].apply(extract_category_text)

2. 用spaCy标注命名实体

定义函数遍历处理后的文本,提取实体(空文本直接返回空列表):

def extract_entities(text):
    if not text:
        return []
    doc = nlp(text)
    # 返回实体文本和对应的标签
    return [(ent.text, ent.label_) for ent in doc.ents]

# 为DataFrame添加实体列
df['named_entities'] = df['cleaned_category'].apply(extract_entities)

3. (可选)提取词性/依存关系

如果需要获取词性标注、依存关系(对应你之前的尝试),可以用这个函数:

def extract_token_details(text):
    if not text:
        return []
    doc = nlp(text)
    # 返回每个token的文本、词性、依存关系
    return [(token.text, token.pos_, token.dep_) for token in doc]

df['token_details'] = df['cleaned_category'].apply(extract_token_details)

查看结果

运行后可以打印验证:

print(df[['categories', 'cleaned_category', 'named_entities', 'token_details']])

错误复盘

  • 第一次尝试:list(nlp.pipe(df.categories))返回的是Doc对象的列表,不是单个Doc,所以doc.ents会报错——你需要遍历列表里的每个Doc再访问ents。
  • 第二次/第三次尝试:遍历Doc列表/Series时,每个循环变量是完整的Doc对象,而不是Doc里的单个Token,pos_是Token的属性,所以直接调用token.pos_会报错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 12:10:36