多语言 NER 三强横评:GLiNER 2.5、spaCy、HanLP,中文谁最能打
【免费下载链接】gliner2.5-multi-v1项目地址: https://ai.gitcode.com/hf_mirrors/fastino/gliner2.5-multi-v1
多语言命名实体识别(NER)的选型,正在成为很多中文团队"幸福的烦恼"。一边是主打零样本、schema 驱动的 GLiNER 2.5 多语言检查点带着 287M 参数和 boundary 架构杀入中文圈;一边是深耕中文多年的 HanLP,以 PKU / MSRA / OntoNotes 多标准标注和 ELECTRA 多任务模型稳坐国产头把交椅;还有工业界事实标准的 spaCy,以 75+ 语言、84 条预训练流水线的生态体量虎视眈眈。
三者代表了三条完全不同的技术路线:GLiNER 2.5 是"任务说明书 + 双向编码器 + 稀疏边界配对"的零样本抽取器,spaCy 是"固定标签 + 成熟工程流水线"的传统工业库,HanLP 是"中文优先 + 多任务联合学习"的生产级工具链。本文不站队,只把架构原理、实测证据、部署账本摊开对比——尤其针对中文场景,回答一个最实际的问题:同一份中英混合文本,谁最能打?
三条路线,三种底层哲学
先说清楚各自"为什么是现在的样子",这决定了后面所有对比的结论。
GLiNER 2.5:把"要抽什么"写进输入
GLiNER 家族的核心思想是:不训练新模型也能抽新实体。把实体类型(甚至是一段自然语言描述)拼进输入序列,让模型在文本 span 与类型向量之间做相似度匹配。这一思路在 GLiNER2 论文(arXiv:2507.18546)中被扩展为 schema 驱动的多任务系统:实体、分类、结构化记录、关系抽取共享一个 encoder,一次前向传播组合多任务。
本仓库gliner2.5-multi-v1是这套架构的多语言检查点,关键配置写死在 config.json 里:
- 架构:
"architecture": "boundary",即 BoundaryExtractor——稀疏 start/end 配对,而不是固定宽度的 span 网格,max_len达到 4096,任何能塞进编码窗口的跨度长度都能表达; - 编码器:
microsoft/mdeberta-v3-base(见 encoder_config/config.json,12 层、hidden 768、词表 25 万),这是 mDeBERTa 的多语言版本,天然覆盖中文子词; - 任务头:
enable_records: true、enable_relations: true,外加分类与 span 属性头; - 权重:287M 参数,FP16 约 594MB,CPU / CUDA / MPS 均可推理。
与这套架构配套的是一组语义锚点 token,直接追加进 DeBERTa 词表(见 tokenizer_config.json):[P]标记任务开始、[E]标记实体类型、[L]标记分类标签、[C]标记结构化字段、[R]标记关系槽位,[SEP_STRUCT]/[SEP_TEXT]分隔不同任务段与正文段。模型训练时学会读取这些 token 的 hidden state 去完成各自任务,推理时标签数量不影响前向次数。
加载方式在 README.md 中有明确说明——必须用AutoExtractor,旧版的GLiNER2.from_pretrained是 legacy span 加载器,无法分发该检查点:
from gliner2 import AutoExtractor model = AutoExtractor.from_pretrained("fastino/gliner2.5-multi-v1") # BoundaryExtractor / boundaryspaCy:工程流水线的"固定标签"逻辑
spaCy 的哲学是把 NLP 做成可组合的生产流水线:分词 → 词性 → 依存 → 实体,组件各司其职,用声明式 config 管理,包装成可复现、可部署的 pipeline。官方口径是75+ 语言、25 种语言的 84 条预训练流水线,中文提供zh_core_web_sm / md / lg / trf四个量级。
它的优势在"确定性":流水线成熟、CPU 优化充分(官方基准里英文en_core_web_lg在 CPU 上可达约 1 万词/秒),生态里可视化、评估、打包工具一应俱全。但代价也明确——标签集是训练时定死的。模型认得 PERSON、ORG、GPE 这类通用类型,想要抽"药品剂量""合同违约条款",要么换模型,要么自己标注数据重训。这正是 GLiNER 论文在 Related Work 中对传统 NLP 库的概括:任务各自为政、标签不可泛化到未见类型。
HanLP:中文优先的多任务工具链
HanLP 的定位是"面向生产环境的前沿多语种 NLP"。它最独特的地方是标准意识:中文 NER 直接对齐 PKU、MSRA、OntoNotes 三套标注规范,分词区分粗分/细分,支持自定义词典与黑白名单,这在中文圈子是刚需。官方演示页给出的默认路径是一个 ELECTRA-small 底座的多任务模型CLOSE_TOK_POS_NER_SRL_DEP_SDP_CON_ELECTRA_SMALL_ZH——一个模型同时产出分词、词性、NER、语义角色、依存与成分句法,中文的"语言理解全套"一次给齐。
它同时提供 native 与 RESTful 两种 API,语义一致,面向轻量级与海量级两种场景,Apache 2.0 开源。相比 spaCy 的"通用多语",HanLP 明显是中文主场的重兵部署。
同一份中英混合测试集,谁更稳
横评不做无米之炊。我们构造一份典型的中英混合语料,覆盖三类现实场景:
- 通用类型:人名、机构、地点——"阿里巴巴创始人马云在杭州发布新战略";
- 开放领域:医疗/金融等自定义类型——"患者服用了400mg布洛芬缓解剧烈头痛";
- 中英混排:"Tim Cook 在 Cupertino 发布了 iPhone 15,分析师们保持乐观。"
场景一:零样本开放标签,GLiNER 2.5 完胜
这是 GLiNER 2.5 的主场。标签不是固定的,而是调用时传入的 schema,甚至可以带自然语言描述来收窄语义:
result = model.extract_entities( "患者服用了400mg布洛芬缓解剧烈头痛", { "medication": "药物或药品物质名称", "dosage": "400mg、2片、5ml 等剂量表达", "symptom": "患者报告的症状或状况", }, include_spans=True, include_confidence=True, )注意这里返回的是字符级 span(half-open 区间,text[start:end] == entity["text"]),这对中文后处理很重要——你可以直接把实体切出来做掩码、打标或入库。社区对这一机制做过源码级拆解:模型内部用WhitespaceTokenSplitter把正文切词,再在连续词片段上滑窗,与每个[E]类型向量做 sigmoid 打分。连续汉字没有空格时,正则切词会把整段汉字并成一个"词",词级 span 很难切出人名地名——所以在中文零样本实践中,业界普遍建议先用 jieba 预分词再喂模型:
import jieba def zh_for_gliner(text: str) -> str: return " ".join(jieba.cut(text)) spaced = zh_for_gliner("张三在北京的阿里巴巴工作") result = model.extract_entities(spaced, ["人名", "地名", "机构"])这是一条必须写进排期的事实:GLiNER 2.5 的中文 NER 强在"标签任意定义",但工程上要配一个分词前置步骤。mDeBERTa 对中文子词友好,切词逻辑不变,训推必须一致。
泛化能力的证据来自论文的零样本基准:CrossNER 五个领域平均 F1 0.590,紧咬 GPT-4o 的 0.599,略低于专精 NER 的 GLiNER-M(0.615)——这是多任务通用模型的合理取舍。社区情报里的中文教程也反复印证:零样本抽取、自定义实体类型、混合语种识别是它的招牌能力,20+ 语种覆盖让"一份代码管全球文本"成为可能。
场景二:中文标准标注,HanLP 最正统
当业务要求"实体标注必须对齐 MSRA 规范""需要可解释的分词结果",HanLP 是唯一的选择。它不承诺零样本——它承诺的是标准正确性:PKU / MSRA / OntoNotes 三套标签规范任选,粗分/细分两套标准,词典可以定制。对银行、医疗、政务这类有明确标注口径、要过评审的中文项目,这不是性能问题,是合规问题。
多任务模型的副产品也很值钱:NER 之外顺带给出词性、依存句法、语义角色,一套 ELECTRA-small 打天下。如果你的下游还要做句法分析或语义标注,HanLP 的边际成本几乎为零。
场景三:中英混排、批量吞吐,spaCy 最省心
spaCy 的中文流水线(zh_core_web_*)内置分词组件,混排文本开箱即用,CPU 吞吐是它的招牌:官方基准中英文en_core_web_lg在 CPU 上约 1 万词/秒,即使是 transformer 版en_core_web_trf也有数百词/秒的兜底。对"量很大、标签固定、要跑得快"的常规抽取,它是最不用操心的选择。
但诚实地说,spaCy 的中文能力定位是"通用多语生态里的一员",而非中文特化。其 NER 精度标杆(OntoNotes 5.0 上 trf 版 89.8 F1、lg 版 85.5)是英文模型的数据;中文流水线的标签集是固定的通用类型,遇到"铁公鸡公司名""网红昵称"这类中文特有的歧义,它和你一样没有知识——只是不会主动告诉你它没把握。
小结:这一局没有全胜者
| 场景 | GLiNER 2.5 | spaCy | HanLP |
|---|---|---|---|
| 零样本自定义标签 | 最优(改 schema 即换标签) | 需标注重训 | 需标注重训 |
| 中文标准标注口径 | 无标准绑定 | 通用类型 | 最优(PKU/MSRA/OntoNotes) |
| 中英混排吞吐 | CPU 毫秒级,需预分词 | 最优(原生分词+万词/秒) | 优(native 多任务) |
| 附带句法/语义能力 | 无 | 有 | 最优(MTL 全家桶) |
训练成本、部署体积与维护成本
性能之外,生产选型真正劝退人的往往是成本和维护。这里把三家账本摊开。
部署体积与延迟
| 维度 | GLiNER 2.5 Multi | spaCy (zh) | HanLP (zh MTL) |
|---|---|---|---|
| 参数量 | 287M(mDeBERTa-v3) | sm/md/lg/trf 多档 | ELECTRA-small 级 |
| 权重体积 | 约 594MB(FP16) | 数十 MB~数百 MB | 数百 MB 级 |
| CPU 推理 | 毫秒级;分类 5→50 标签仅 130→208ms | 万词/秒级 | native 本地推理 |
| GPU | 可选(CUDA/MPS) | 可选(trf 需要) | 可选 |
| 显存敏感 | 低(可纯 CPU) | 低(sm/md 纯 CPU) | 低 |
GLiNER 2.5 的一个关键效率事实:标签数量几乎不增加延迟。论文的 CPU 延迟基准里,分类标签从 5 个增加到 50 个,GLiNER2 只从 130ms 涨到 208ms;而 DeBERTa 系零样本分类器每个标签要单独前向,20 个标签时慢 6.8 倍。原理不复杂——所有标签的[L]token 在同一次编码里出向量,一个 MLP 统一打分。这在"标签集很大"的场景(意图分类 77 类、字段枚举几十项)是决定性的差异。
训练与微调成本
- GLiNER 2.5:零样本是默认用法,改标签就是改 schema,不产生训练成本。需要垂直精度时走微调:论文使用 25.4 万条混合样本(真实文档 13.6 万 + GPT-4o 合成 11.8 万),5 个 epoch、AdamW、骨干 1e-5 / 任务层 2e-5 的差分学习率。仓库配套的 SKILL.md 还描述了托管微调工作流——上传 JSONL 标注、起训练任务、部署检查点,把"准备标注 → 微调 → 上线"串成 API 流程。中文微调的一条铁律:
input必须与推理用同一套预分词,实体字符串要能在 input 里字面找到。 - spaCy:新增标签的代价最高——需要标注语料、配置训练 config、重训流水线组件。好处是工具链极成熟(Project、Config、评估可视化),一旦训完,部署确定性极强。
- HanLP:中文专用能力的维护被库本身吸收(词典、标准、模型都有官方维护),但要自定义实体类型同样需要标注数据重训,且模型组件较多、微调链路相对重。
长期维护的隐性成本
三个维度看维护:标签变更(GLiNER 2.5 改一行 schema;spaCy/HanLP 要动数据与训练)、多语言覆盖(GLiNER 2.5 一个检查点覆盖 20+ 语种;spaCy 靠多语言流水线矩阵;HanLP 中文最强、多语次之)、隐私合规(三者均可本地部署不出网,但 GLiNER 2.5 的 CPU-only 能力和 Apache 2.0 许可对"数据不出域"场景最友好,这也是它在 PII 脱敏领域快速渗透的原因)。
中文圈选型结论与建议
把证据收拢成决策建议,按团队画像对号入座:
选 GLiNER 2.5 Multi,当你的关键词是"零样本、标签常变、多语、离线"。快速验证一个抽取想法只需十几行代码和一行 schema;实体类型从"人物机构地点"切到"药品剂量症状"不产生任何训练成本;一个检查点同时处理中文、英文和混排文本;纯 CPU 可跑、数据不出网。代价是:中文需要 jieba 预分词、span 长度受编码窗口限制(长实体要分批)、没有句法等附带能力。它是"抽取层"的最佳底座,尤其适合 PII 扫描、RAG 打标、日志/工单字段化这类闭集高频任务。
选 HanLP,当你的主场是中文、且需要"标准正确性"与完整语言理解。政企项目要对齐 MSRA 标注口径、下游要句法分析、团队需要一套可控的中文 NLP 全家桶——HanLP 是唯一把这些打包好的开源方案。它不擅长零样本,但如果你本来就打算长期维护标注数据,这个短板不存在。
选 spaCy,当你的文本以英文为主、依赖成熟生态、标签多年不动。吞吐、工具链、社区文档都是工业级,中文能力够用但非专精。它是"流水线"思路的代表:稳定、可预测、开箱即用。
最优解往往是组合拳:GLiNER 2.5 打头阵做开放标签抽取与多语覆盖,HanLP 或 spaCy 提供分词与句法底座,规则引擎兜底关键字段。社区对 GLiNER2 的定位总结得很清醒——"闭集、高频、要 span 的场景交给 GLiNER 2.5,开放域长文本交给 LLM",而中文的句法与标准问题,交给在中文主场深耕十年的工具。横评的结论不是"谁取代谁",而是:中文 NER 的答案,取决于你的标签流动速度和语言纵深需求。
【免费下载链接】gliner2.5-multi-v1项目地址: https://ai.gitcode.com/hf_mirrors/fastino/gliner2.5-multi-v1
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考