JSON转CONLL2003格式转换工具/脚本求助:适配Hugging Face BERT NER训练
标注格式转CONLL2003的实现方案
自定义Python脚本(最灵活可控)
你可以编写一段轻量Python代码完成转换,核心是将文本的每个字符与标签对齐,再按CONLL2003的「token 标签」格式输出(非实体标注为O,实体起始位用B-XXX,中间位用I-XXX)。示例代码:
def convert_to_conll(text, labels): # 初始化所有字符的标签为O char_labels = ["O"] * len(text) # 标记每个实体的起始和中间位置 for label_item in labels: start_idx = label_item["start"] end_idx = label_item["end"] entity_label = label_item["label"] # 实体第一个字符标记为B-前缀 char_labels[start_idx] = f"B-{entity_label}" # 实体后续字符标记为I-前缀 for idx in range(start_idx + 1, end_idx): char_labels[idx] = f"I-{entity_label}" # 按空格拆分token,对齐标签 tokens = text.split() conll_output = [] current_pos = 0 for token in tokens: # 取token第一个字符对应的标签作为该token的标签 token_label = char_labels[current_pos] conll_output.append(f"{token} {token_label}") # 移动指针:token长度 + 1个空格 current_pos += len(token) + 1 # 每个样本间用空行分隔 return "\n".join(conll_output) + "\n\n" # 测试你的示例数据 sample_data = { "text": "I am a boy and I come from New York", "labels": [{"start": 20, "end": 28, "label": "Location"}] } print(convert_to_conll(sample_data["text"], sample_data["labels"]))运行后输出的CONLL格式如下:
I O
am O
a O
boy O
and O
I O
come O
from O
New B-Location
York I-Location基于Hugging Face Datasets库处理
如果你正在使用Hugging Face生态,可借助datasets库完成转换,同时能直接适配BERT的子词分词逻辑(避免子词分割导致标签错位):- 将你的标注数据整理为列表格式,用
datasets.Dataset.from_list()加载为Dataset对象 - 加载BERT对应的tokenizer,使用
tokenizer(text, return_offsets_mapping=True)获取子词与原始文本的位置映射 - 遍历每个子词,根据偏移映射匹配原始标签,生成子词对应的标签序列(子词起始位用
B-XXX,后续用I-XXX,无匹配则为O) - 可直接用处理后的Dataset训练模型,或通过
datasets.Dataset.save_to_disk()导出,再转换为CONLL格式
- 将你的标注数据整理为列表格式,用
内容的提问来源于stack exchange,提问作者MLCoder
相关产品推荐
相关产品推荐

