如何使用Python读取CSV数据并转换为Bratt(.ann)格式
CSV转Brat(.ann)格式Python实现
没有完全零配置适配所有CSV结构的通用现成脚本,毕竟不同来源的标注CSV字段定义、存储内容差异很大,但针对实体标注类的转换需求,下面的脚本不需要额外安装依赖,调整文件路径和字段映射后可以直接使用,输出格式完全符合Brat标注规范。
前置要求
- 本地安装Python3环境即可,无需第三方库,脚本全用Python内置模块实现
- 提前确认待转换CSV的核心字段:至少需要包含实体类型、实体起始字符偏移、实体结束字符偏移、实体文本内容四类信息
可直接运行的转换脚本
import csv import os def csv_to_ann(csv_input_path, ann_output_path): entity_counter = 1 ann_content = [] # 读取CSV内容 with open(csv_input_path, 'r', encoding='utf-8') as csv_file: csv_reader = csv.DictReader(csv_file) for row in csv_reader: # ==== 这里根据你的CSV实际列名修改对应的键名即可 ==== ent_type = row['entity_type'].strip() start_pos = row['start_offset'].strip() end_pos = row['end_offset'].strip() ent_text = row['entity_text'].strip() # ============================================== # 严格按照Brat ann格式拼接行:制表符分隔编号段、位置段、文本段 ann_line = f"T{entity_counter}\t{ent_type} {start_pos} {end_pos}\t{ent_text}" ann_content.append(ann_line) entity_counter += 1 # 写入ann文件 with open(ann_output_path, 'w', encoding='utf-8') as ann_file: ann_file.write('\n'.join(ann_content)) if __name__ == "__main__": # 修改为你本地的CSV文件路径 INPUT_CSV = "./test_singlefile.csv" # 输出的ann文件路径,注意需要和对应原始文本txt文件同目录、同名(仅后缀不同) OUTPUT_ANN = "./test.ann" csv_to_ann(INPUT_CSV, OUTPUT_ANN) print(f"转换完成,文件已保存至:{os.path.abspath(OUTPUT_ANN)}")
注意事项
- 如果运行时出现
KeyError,说明代码里读取的字段名和你CSV实际的列名不匹配,把代码中标注的字段映射部分改成你CSV里的实际列名即可 - 转换前确认CSV里存的偏移量是字符级偏移,不是词级偏移,所有文件统一用
utf-8编码保存,否则会出现标注位置错位的问题 - Brat加载标注要求同目录下必须存在和ann文件同名的txt原始文本文件,否则会加载失败
- 如果你的CSV里还包含关系、事件类标注,只需要在脚本基础上追加对应格式的标注行即可,关系标注编号从
R1开始累加,事件标注从E1开始累加,格式和实体标注逻辑一致。
内容的提问来源于stack exchange,提问作者David Esubalew
相关产品推荐
相关产品推荐

