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

如何将带空行分隔的标注文本文件内容分组为目标数据结构?及DataFrame实现方法问询

解决文本标注数据分组问题:字典列表与DataFrame实现

你的问题核心是把空行分隔的多组标注数据,每组打包成{'tokens': [...], 'tag': [...]}的结构,原来的代码只输出最后一组,是因为你一直在覆盖同一个字典的内容,而没有把每组数据单独存储。下面分两种方案解决:

一、用字典列表实现(推荐,直接匹配你要的结构)

单个字典只能存一组数据,所以我们需要用一个列表来保存所有组的字典。每次遇到空行时,就把当前积累的tokens和tags打包成字典加入列表,同时重置临时变量;还要注意处理文件末尾没有空行的情况,把最后一组也加入列表。

修改后的代码如下:

f = open("a_testdata.txt", "r")
data_collection = []  # 用列表存储所有分组的字典
current_tokens = []
current_tags = []

for line in f:
    cleaned_line = line.strip()
    if cleaned_line:  # 处理非空行,提取token和tag
        token, tag = cleaned_line.split('\t')
        current_tokens.append(token)
        current_tags.append(tag.strip())
    else:  # 遇到空行,保存当前分组
        if current_tokens and current_tags:  # 避免空分组(比如连续空行)
            data_collection.append({
                'tokens': current_tokens,
                'tag': current_tags
            })
            # 重置临时变量,准备下一组
            current_tokens = []
            current_tags = []

# 处理文件最后一组(如果文件结尾没有空行)
if current_tokens and current_tags:
    data_collection.append({
        'tokens': current_tokens,
        'tag': current_tags
    })

# 输出所有分组结果
for group in data_collection:
    print(group)

运行后你会得到所有分组的数据,比如:

{'tokens': ['Setelah', 'melalui', 'proses', 'telepon', 'yang', 'panjang', 'tutup', 'sudah', 'kartu', 'kredit', 'bca', 'Ribet'], 'tag': ['O', 'B', 'B', 'I', 'O', 'O', 'B', 'O', 'B', 'I', 'I', 'B']}
{'tokens': ['@HaloBCA', 'Saya', 'mencoba', 'mengakses', 'menu', 'm-BCA', 'saya', 'namun', 'saya', 'mendapat', 'respons', 'Fasilitas', 'Mobile', 'Banking', 'terblokir', 'bagimana', 'sih', 'padahal', 'saya', 'baru', 'coba', 'akses', 'lo'], 'tag': ['B', 'O', 'O', 'B', 'B', 'I', 'O', 'O', 'O', 'B', 'I', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O']}

二、用Pandas DataFrame实现(适合数据批量处理)

如果后续需要对这些数据做分析、筛选等操作,用DataFrame会更方便。我们可以先给每组数据标记一个组ID,再通过分组聚合得到每组的tokens和tags列表:

import pandas as pd

# 读取文件,保留空行以便分组
df = pd.read_csv(
    "a_testdata.txt",
    sep='\t',
    header=None,
    names=['token', 'tag'],
    skip_blank_lines=False
)

# 生成组ID:每遇到一个空行,组ID加1
df['group_id'] = df['token'].isna().cumsum()

# 去掉空行数据
df_clean = df.dropna(subset=['token']).reset_index(drop=True)

# 按组ID聚合,把每组的token和tag转为列表
grouped_df = df_clean.groupby('group_id').agg({
    'token': list,
    'tag': list
}).rename(columns={'token': 'tokens'}).reset_index(drop=True)

# 转为你需要的字典列表格式
result = grouped_df.to_dict('records')
print(result)

# 也可以直接查看DataFrame结构
print(grouped_df)

运行后grouped_df会是这样的结构:

tokenstag
['Setelah', 'melalui', 'proses', 'telepon', 'yang', 'panjang', 'tutup', 'sudah', 'kartu', 'kredit', 'bca', 'Ribet']['O', 'B', 'B', 'I', 'O', 'O', 'B', 'O', 'B', 'I', 'I', 'B']
['@HaloBCA', 'Saya', 'mencoba', 'mengakses', 'menu', 'm-BCA', 'saya', 'namun', 'saya', 'mendapat', 'respons', 'Fasilitas', 'Mobile', 'Banking', 'terblokir', 'bagimana', 'sih', 'padahal', 'saya', 'baru', 'coba', 'akses', 'lo']['B', 'O', 'O', 'B', 'B', 'I', 'O', 'O', 'O', 'B', 'I', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O']

总结

  • 如果你只需要生成目标格式的字典结构,字典列表的方式最直接,逻辑简单易懂;
  • 如果你需要对数据做进一步处理(比如统计标签分布、筛选特定组),DataFrame的方式更灵活高效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 16:34:08