如何将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
相关产品推荐
相关产品推荐

