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

如何将Spacy NER识别出的实体提取为DataFrame的独立列

你原代码的问题是没有对返回的实体按标签过滤,且同一段文本重复调用了两次NER模型,存在性能冗余。可以参考如下方案实现需求:

最优方案:单次调用模型,一次性生成所有实体列

避免重复调用模型,大幅提升处理效率:

import pandas as pd
import spacy

# 替换为你自己的NER模型加载路径
ner_model = spacy.load("你的自定义NER模型路径或内置模型名,比如en_core_web_sm")

def extract_entities(text):
    doc = ner_model(text)
    # 可按需求增减需要提取的实体标签
    entity_map = {"GPE": [], "PERSON": []}
    for ent in doc.ents:
        if ent.label_ in entity_map:
            entity_map[ent.label_].append(ent.text)
    # 单实体返回字符串,多实体用逗号拼接;需要保留列表格式可注释掉这部分,直接返回pd.Series(entity_map)
    for label, ent_list in entity_map.items():
        entity_map[label] = ", ".join(ent_list) if ent_list else None
    return pd.Series(entity_map)

# 直接批量生成GPE、PERSON两列
df[["GPE", "PERSON"]] = df["Text"].apply(extract_entities)

单标签单独提取方案

如果只需要单独提取某一类实体,可以用通用提取函数:

def extract_by_label(text, target_label):
    doc = ner_model(text)
    ent_list = [ent.text for ent in doc.ents if ent.label_ == target_label]
    # 同样,需要保留列表就改为 return ent_list if ent_list else None
    return ", ".join(ent_list) if ent_list else None

# 单独提取PERSON列
df["PERSON"] = df["Text"].apply(lambda x: extract_by_label(x, "PERSON"))
# 单独提取GPE列
df["GPE"] = df["Text"].apply(lambda x: extract_by_label(x, "GPE"))

注意事项

  • 如果你的自定义NER模型的标签名和spaCy内置标签不一致,直接替换代码里的标签字符串即可
  • 若存在同标签多实体的情况,示例代码用逗号拼接,你可以按需调整输出格式

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 03:48:05