如何将带空行分隔的标注文本文件内容分组为目标数据结构?及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会是这样的结构:
| tokens | tag |
|---|---|
| ['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
相关产品推荐
相关产品推荐

