基于Spacy库的NER概率分析 涉洗钱场景模型优化及实体概率查询
spaCy NER实体分类概率获取方案
注意:spaCy默认的NER组件为过渡式解析架构,默认仅输出最优标签结果,不会直接返回分类概率,可通过以下两种可行方案实现需求
方案1:启用现有NER组件的波束搜索返回置信度
不需要修改现有模型结构,适合已经完成洗钱领域语料微调的现成NER模型使用,示例代码如下:
import spacy # 加载你微调好的针对洗钱场景的NER模型,也可替换为官方预训练模型如zh_core_web_trf/en_core_web_trf nlp = spacy.load("your_trained_model_path") ner_pipe = nlp.get_pipe("ner") # 配置波束搜索参数 ner_pipe.cfg["beam_density"] = 0.0001 ner_pipe.cfg["beam_width"] = 32 # 传入从报纸链接提取的正文文本 doc = nlp("extracted_news_article_content") for ent in doc.ents: # 仅筛选你需要的人名、地点、组织机构三类实体 if ent.label_ not in ["PER", "GPE", "LOC", "ORG"]: continue # 获取当前实体的所有候选标签及对应概率 beams = ner_pipe.beam_parse([doc], beam_width=32, beam_density=0.0001) for beam in beams: for score, candidate_ents in ner_pipe.get_beam_parses(beam): for candidate in candidate_ents: # 匹配到当前实体的位置后输出对应标签和概率 if candidate.start == ent.start and candidate.end == ent.end: print(f"实体:{ent.text} | 候选标签:{candidate.label_} | 概率:{round(score,4)}")
方案2:换用SpanCategorizer(跨度分类)架构做NER
如果还在模型优化阶段,更推荐使用spaCy的spancat组件替代默认NER,该架构天然输出每个候选实体的分类概率,且在细分领域场景下的识别准确率通常高于传统过渡式NER,推理时获取概率的示例代码如下:
import spacy # 加载用spancat架构训练好的洗钱场景NER模型 nlp = spacy.load("your_spancat_trained_model_path") doc = nlp("extracted_news_article_content") # 遍历spancat输出的实体结果,默认存储在doc.spans["sc"],可在训练时自定义键名 for ent in doc.spans["sc"]: if ent.label_ in ["PER", "GPE", "LOC", "ORG"]: print(f"实体:{ent.text} | 标签:{ent.label_} | 概率:{round(ent.score,4)}")
适配你的研究场景的优化建议
- 针对洗钱相关报纸文章的场景,建议先标注少量领域专属语料,再对预训练模型做微调,可大幅提升实体识别准确率
- 拿到实体分类概率后,可设置置信度阈值过滤低概率的错误识别结果,或对概率低于阈值的实体做人工校验,进一步提升输出质量
- 若使用波束搜索方案,可根据准确率和推理速度的需求调整
beam_width参数,参数越大覆盖的候选标签越全,但是推理速度会相应变慢
内容的提问来源于stack exchange,提问作者Diksha Kapoor
相关产品推荐
相关产品推荐

