数据预处理(一):源数据的处理与写入

  • 需求:将所有文件下的A类数据的训练集、验证集和测试集分别整合到一起,B类数据的训练集、验证集和测试集分别整合到一起。

  • 将要处理的数据文件放至data文件下,数据处理完成后存放至match_data文件下。
    在这里插入图片描述
    数据格式如下:
    在这里插入图片描述

  • 导入所需要的包

import os
import json
from tqdm import tqdm
  • 文件路径及目录相关操作
data_path = "data/" # 根路径
path_list = os.listdir(data_path) # 获取根路径下的文件目录
print(path_list)
  • 分别定义用于存放各类数据的列表
# 分别定义用于存放各类数据的列表
train_data_a = []
val_data_a = []
train_data_b = []
val_data_b = []
test_data_a = []
test_data_b = []
  • 对单句进行处理
# 对单句进行处理
def process(sentence):
    sentence = sentence.replace(" ", "") # 去空格操作
    sentence = sentence.lower() # 小写化操作
    return sentence
  • 将数据写入新文件的操作
# 将数据写入新文件操作
def write_data(path, data):
    with open(path, "w", encoding="utf-8") as fw: # 打开指定文件
        for ele in data: # 按行写入数据
            ele = [_.replace("\t", "") for _ in ele] # 去掉每一行的制表符
            fw.write("\t".join(ele) + "\n") # 每行中的每列数据用制表符分割,每行末尾添加换行符
  • 循环遍历数据文件,分别对各类数据文件进行操作
# 分别对各类文件进行处理
for dir_name in listdir_names: # 遍历文件名列表
    # 处理训练集文件
    with open(data_path + dir_name + "/train.txt", "r", encoding="utf-8") as fr: # 分别打开各文件夹中的训练集文件
        for line in tqdm(fr): # 按行读取文件内容
            data = json.loads(line.strip()) # 按行将数据加载成json格式
            if "A" in dir_name: # 按A、B类分别存放数据
                train_data_a.append((process(data["source"]), process(data["target"]), process(data["labelA"])))
            else:
                train_data_b.append((process(data["source"]), process(data["target"]), process(data["labelB"])))

    # 处理验证集文件
    with open(data_path + dir_name + "/valid.txt", "r", encoding="utf-8") as fr:
        for line in tqdm(fr):
            data = json.loads(line.strip())
            if "A" in dir_name:
                valid_data_a.append((process(data["source"]), process(data["target"]), process(data["labelA"])))
            else:
                valid_data_b.append((process(data["source"]), process(data["target"]), process(data["labelB"])))

    # 处理测试集文件
    with open(data_path + dir_name + "/test_with_id.txt", "r", encoding="utf-8") as fr:
        for line in tqdm(fr):
            data = json.loads(line.strip())
            if "A" in dir_name:
                test_data_a.append((process(data["source"]), process(data["target"]), process(data["id"])))
            else:
                test_data_b.append((process(data["source"]), process(data["target"]), process(data["id"])))
  • 打印数据列表的长度
# 打印数据列表的长度
print(len(train_data_a))
print(len(train_data_b))
print(len(valid_data_a))
print(len(valid_data_b))
print(len(test_data_a))
print(len(test_data_b))
  • 将处理后的新数据分别写入各自文件
# 将处理后的新数据分别写入各自文件
write_data("./match_data/train_A.txt", train_data_a)
write_data("./match_data/train_B.txt", train_data_b)
write_data("./match_data/valid_A.txt", valid_data_a)
write_data("./match_data/valid_B.txt", valid_data_b)
write_data("./match_data/test_A.txt", test_data_a)
write_data("./match_data/test_B.txt", test_data_b)
  • 整合后的数据格式如下:
    在这里插入图片描述
  • 下篇笔记记录的是如何将本篇笔记处理后的数据再处理成bert的输入数据格式。

猜你喜欢

转载自blog.csdn.net/weixin_40605573/article/details/115919736