如何将标注的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的命令行工具训练:
- 先生成配置文件:
spacy init config config.cfg --lang en --pipeline ner --optimize efficiency - 开始训练:
spacy train config.cfg --paths.train ./train_data.json --paths.dev ./dev_data.json
这样就能用你手动标注的JSON数据训练自定义NER模型啦!
内容的提问来源于stack exchange,提问作者W.P. McNeill
相关产品推荐
相关产品推荐

