You need to enable JavaScript to run this app. 基于pandas将CSV格式NER标注数据转换为CoNLL BIO格式并优化代码
优惠活动
大模型
产品
解决方案
定价
更多

基于pandas将CSV格式NER标注数据转换为CoNLL BIO格式并优化代码

实现缺陷根因

你当前方案的核心问题是:在DataFrame结构内插入空行时,系统会自动为空行填充默认NaN值,最终导出文本时,这部分会被写成NaN\tNaN的无效行,而非CoNLL格式要求的无任何内容的纯空行,自然无法被正确识别为分句标记。

可落地优化方案

方案1:逐句遍历拼接(最稳定,适合标注数据直接转换场景)

该方案完全绕开在DataFrame内插入空行的操作,从根源上避免无效脏数据,也是标注转数据场景的通用实现逻辑:

import pandas as pd

# 读取CSV原始数据,将存为字符串形式的分词/标签列表转换为实际Python列表
df = pd.read_csv("ner_raw_data.csv", converters={"text": eval, "tags": eval})

conll_output_lines = []
# 按句子编号分组遍历
for sent_id, group_data in df.groupby("sent_num", sort=True):
    # 提取当前句子的分词、标签序列
    word_list = group_data["text"].iloc[0]
    tag_list = group_data["tags"].iloc[0]
    # 强制校验分词和标签长度匹配,提前排查标注错位问题
    assert len(word_list) == len(tag_list), f"句子编号{sent_id}的分词与标签长度不一致"
    # 逐词生成制表符分隔的行
    for word, tag in zip(word_list, tag_list):
        conll_output_lines.append(f"{word}\t{tag}")
    # 句子结束追加纯空行(无任何内容,仅作为分句标识)
    conll_output_lines.append("")

# 写入CoNLL格式文件
with open("standard_output.conll", "w", encoding="utf-8") as f:
    f.write("\n".join(conll_output_lines))

方案优势:

  • 无DF结构插入操作,不会产生带NaN的脏数据
  • 内置标注一致性校验,能提前发现分词-标签错位的标注问题
  • 导出格式完全符合标准CoNLL规范:分词与标签以制表符分隔,句末为单独的纯空行

方案2:Explode展开后批量生成(适合需要先做逐词数据清洗的场景)

如果你需要先把列表形式的分词、标签展开为逐词结构做后续清洗,不要在DF内插入空行,可在最终文本拼接阶段单独标记句末位置插入空行:

import pandas as pd

df = pd.read_csv("ner_raw_data.csv", converters={"text": eval, "tags": eval})
# 对齐展开两个列表列,得到逐词粒度的数据集
df_exploded = df.set_index("sent_num")[["text", "tags"]].apply(pd.Series.explode).reset_index()
# 生成逐词的制表符分隔行内容
df_exploded["content"] = df_exploded.apply(lambda row: f"{row['text']}\t{row['tags']}", axis=1)

# 定位每个句子的最后一行索引位置
sent_end_idx = set(df_exploded.groupby("sent_num").tail(1).index)
final_lines = []
for row_idx, content in enumerate(df_exploded["content"]):
    final_lines.append(content)
    # 遇到句子末尾时,追加纯空行做分句标识
    if row_idx in sent_end_idx:
        final_lines.append("")

with open("standard_output.conll", "w", encoding="utf-8") as f:
    f.write("\n".join(final_lines))

实现注意事项:

  • 严禁使用DataFrame原生的append方法插入空行,该方式生成的空行会自动填充NaN值,最终导出带脏数据
  • 分句空行必须为无任何字符的纯换行,不能附带制表符、空格,否则会被CoNLL解析器识别为无效数据行
常见踩坑提示
  • 读取CSV时,之前序列化为字符串的分词/标签列必须通过converters参数转成实际Python列表,否则explode操作会将整段字符串拆分为单字符,破坏数据结构
  • 对于超大体积的标注数据集,可采用逐行写入文件的方式替代全量拼接列表,降低内存占用

内容的提问来源于stack exchange,提问作者GSA

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.24 14:06:04