☰
GLiNER2结构化数据抽取教程:如何把非结构化文本一步变成JSON
2026/10/7 15:16:25 网站建设 项目流程

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),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询