GLiNER2结构化数据抽取教程:如何把非结构化文本一步变成JSON
【免费下载链接】GLiNER2Unified Schema-Based Information Extraction项目地址: https://gitcode.com/gh_mirrors/gl/GLiNER2
GLiNER2(GitHub 加速计划 / gl / GLiNER2)是一个统一的Schema 驱动信息抽取开源项目:只需一个字段描述(Schema),就能把发票、病历、新闻等非结构化文本一步抽成结构化的 JSON,无需大模型提示词,也无需微调,且支持纯本地 CPU 推理、隐私零外泄。本文将带你从零完成安装、定义字段、抽取 JSON,并覆盖多任务组合抽取与长文档处理的最佳实践。
为什么选 Schema 驱动的结构化数据抽取? 🎯
传统做法要么写一堆正则,要么调用大模型生成 JSON——前者维护成本高,后者贵、慢且可能"幻觉"。GLiNER2 走的是第三条路:
- 一个 Schema,多种任务:实体、分类、结构化记录、关系、跨度属性,一次前向推理全部完成
- 本地优先(CPU 可跑):数据不出本机,天然适合 PII、医疗、金融等敏感场景
- 两种架构统一 API:span 架构(GLiNER2)与 boundary 架构(GLiNER2.5)都由
AutoExtractor自动识别加载
对新手来说,最常用、最贴合"文本变 JSON"需求的 API 就是extract_json():输入一段文本 + 一个字段字典,输出就是标准 JSON 结构。
快速安装与模型加载
要求 Python ≥ 3.10(见 pyproject.toml)。只装本地推理所需的最小依赖:
pip install gliner2[local]加载模型只需一行(AutoExtractor会按检查点自动分派架构,源码见 auto.py):
from gliner2 import AutoExtractor model = AutoExtractor.from_pretrained("fastino/gliner2.5-base-v1") # 英文首选 # 多语言场景换用 "fastino/gliner2.5-multi-v1";追求 CPU 速度用 "fastino/gliner2.5-small-v1"💡 中文等无空格分词语言可传
word_splitter="char"加载,详见 README.md。
三步完成结构化数据抽取:定义字段 → 调用 → 拿到 JSON
以一段产品描述为例,调用extract_json()即可得到 JSON 结果:
text = "The MacBook Pro costs $1999 and features M3 chip, 16GB RAM, and 512GB storage." result = model.extract_json( text, { "product": [ "name::str::Full product name and model", "price::str::Product price with currency", "features::list::Included hardware features" ] } ) print(result) # {'product': [{'name': 'MacBook Pro', 'price': ['$1999'], # 'features': ['M3 chip', '16GB RAM', '512GB storage']}]}整个过程只有三步:① 写字段描述 → ② 调extract_json→ ③ 打印 JSON。没有提示词工程,没有解析修复,字段名就是你 JSON 里的键名。
字段规格写法速查表
字段用::分隔的简单语法描述(tutorial/3-json_extraction.md 有完整讲解):
| 写法 | 含义 |
|---|---|
"name" | 最简写法,默认list类型(可抽出多个值) |
"name::str" | 单值字段,返回字符串 |
"features::list::Hardware features" | 多值字段 + 给模型的描述 |
"tier::[basic\|premium\|enterprise]::str" | 枚举字段:只能取候选值之一,杜绝自由发挥 |
两个实用技巧:
- 给字段加英文描述,模型理解更准,例如
"amount::str::Transaction amount with currency" - 用枚举约束取值,如订单状态
"status::[pending|processing|shipped|delivered]::str",输出的 JSON 天然干净
进阶:多任务组合抽取(一次调用出实体+分类+结构)
真实业务里往往既要 JSON 字段,又要实体和分类。用 Schema 构建器create_schema()把多种任务拼在一起,一次推理全部完成:
schema = (model.create_schema() .entities(["company", "person"]) # 实体 .classification("sentiment", ["positive", "negative", "neutral"]) # 分类 .structure("product") # 结构化字段 .field("name", dtype="str") .field("price", dtype="str") .field("features", dtype="list") ) text = "Apple CEO Tim Cook announced iPhone 15 for $999 with amazing new features. Exciting!" print(model.extract(text, schema))一次调用即可得到:
{ "entities": {"person": ["Tim Cook"], "company": ["Apple"]}, "sentiment": "positive", "product": [{"name": "iPhone 15", "price": "$999", "features": ["amazing new features"]}] }更多组合套路(发票、合同、临床笔记等真实场景的完整 Schema)见 tutorial/4-combined.md。
质量把控:置信度、字符位置与正则校验
include_confidence=True:每个字段附带 0–1 置信度,可按阈值过滤低质结果include_spans=True:附带start/end字符位置,可回溯原文高亮- 阈值调优:
extract_json(..., threshold=0.9)提高精度;敏感字段建议单独设高阈值 - 正则校验器:用
RegexValidator过滤"不像邮箱的邮箱",详见 tutorial/5-validator.md
长文档怎么办:分块扫描 + 自动合并
年报、病历这类超长文本,直接用extract_json_long()(runtime.py):模型自动按重叠分块扫描,把块内结果映射回原文位置并合并去重,你拿到的 span 仍是全文档全局偏移。
result = model.extract_json_long(long_text, {"transaction": [...]}, chunk_size=384, chunk_overlap=64)批量场景用batch_extract_json/batch_extract_json_long。完整长文本指南见 tutorial/12-long_context.md。
上手后的下一步 🚀
| 想做的事 | 去哪儿看 |
|---|---|
| JSON 抽取完整教程(财务、医疗、电商案例) | tutorial/3-json_extraction.md |
| 实体抽取 / 分类 / 关系抽取 | tutorial/2-ner.md、tutorial/1-classification.md |
| 用自己的数据微调(LoRA) | tutorial/9-training.md |
| GLiNER2.5 边界架构设计说明 | gliner2/models/boundary/ |
| 项目总览与全部模型列表 | README.md |
总结:GLiNER2 把"非结构化文本 → JSON"这件繁琐的事压缩为写一个字段字典 + 一次函数调用:本地运行、结果可控、字段枚举可约束。对于需要把文档批量变成结构化数据入库的场景,它是目前上手最轻量的选择之一。
【免费下载链接】GLiNER2Unified Schema-Based Information Extraction项目地址: https://gitcode.com/gh_mirrors/gl/GLiNER2
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考