You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将标注的NER训练数据转换为spaCy命令行JSON格式?

我完全懂你纠结的点——spaCy的训练JSON格式看起来有点绕,尤其是手动转带字符偏移的标注数据的时候。别慌,我给你一步步拆解清楚怎么写,还有实际例子参考,保证你看完就能上手。

先搞懂spaCy训练JSON的核心结构

spaCy接受的训练JSON是一个数组,每个元素是一个包含两个字段的对象:

  • "text":你的原始标注文本(要和标注时的文本完全一致,不能改字、加空格)
  • "annotations":一个数组,里面每个元素是一个三元组 [起始偏移量, 结束偏移量, 实体标签]

这里最关键的是字符偏移量的规则:

  • 偏移是从0开始计数的字符位置
  • 结束偏移量是开区间(比如文本"Apple",起始是0,结束是5,因为索引0到4是5个字符,结束偏移5表示包含到第4个字符的位置)
  • 空格、标点、特殊字符都算单个字符,计数的时候不能忽略
手动编写的关键注意事项
  • 偏移必须精准:手动数的时候别漏了空格或者标点,比如文本"Hello, World!"里的"World"起始偏移是7(逗号+空格占了2个位置:H是0,逗号是5,空格是6,W是7),结束偏移是12。如果拿不准,用文本编辑器的光标位置功能(比如VS Code里看状态栏的光标位置)直接看数字就行。
  • 实体不能重叠:spaCy的NER模型不支持重叠实体标注,所以同一个字符位置只能属于一个实体。
  • 无实体的文本也要写:如果某段文本没有需要标注的实体,"annotations"就写成空数组[]就行。
  • 标签要统一:所有实体标签的大小写、拼写要一致(比如别一会儿写"PERSON"一会儿写"person"),最好全大写。
完整示例一看就会

假设我们要标注两段文本,分别包含PERSON、ORG、DATE、PRODUCT这些自定义实体,对应的JSON格式如下:

[
  {
    "text": "Elon Musk founded Tesla in 2003, which is based in Austin, Texas.",
    "annotations": [
      [0, 9, "PERSON"],
      [18, 23, "ORG"],
      [27, 31, "DATE"],
      [44, 56, "GPE"]
    ]
  },
  {
    "text": "The new iPhone 15 was released in September 2023.",
    "annotations": [
      [8, 15, "PRODUCT"],
      [30, 40, "DATE"]
    ]
  },
  {
    "text": "This is a sentence with no entities to annotate.",
    "annotations": []
  }
]
最后提一下训练的小提示

写完JSON后,记得把数据分成训练集(比如train_data.json)和验证集(dev_data.json),然后用spaCy的命令行工具训练:

  1. 先生成配置文件:
    spacy init config config.cfg --lang en --pipeline ner --optimize efficiency
    
  2. 开始训练:
    spacy train config.cfg --paths.train ./train_data.json --paths.dev ./dev_data.json
    

这样就能用你手动标注的JSON数据训练自定义NER模型啦!

内容的提问来源于stack exchange,提问作者W.P. McNeill

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 09:21:09