中文rlhf数据集50w条数据解析
- 解析代码
- 数据名
- 代码解析
解析代码
import jieba
from tqdm import tqdm
import re
import pandas as pd
import numpy as npdef find_non_english_text(text):pattern = re.compile(r'[^a-zA-Z]')return pattern.sub('', text)def find_chinese_text(text):pattern = re.compile(r'[^\u4e00-\u9fff]')return pattern.sub('', text)json_list = pd.read_parquet("E:/data_sets/train-rm-static-m2m100-zh-jianti.parquet")
data_list = []
basic_list = ["<|User|>", "<|Ash|>"] * 100for _, one_data in tqdm(json_list.iterrows()):ins = "".join(one_data["prompt"].split("\n\n")[1:-1])# inp=one_data["input"]out = one_data["response"]ins = np.hstack([i.split("Human:") for i in ins.split("Assistant:")])[1:].tolist()ins = [i for i in ins if len(i)>0]ins_len = len(ins)try:ins = np.hstack([[i, j] for i, j in zip(basic_list[:ins_len], ins)]).tolist()ins += [basic_list[ins_len], out]data_list.append(ins)except:continue
with open("data_set_five.txt", "a", encoding="utf-8") as f:voc_set = set()for one_data in tqdm(data_list):ins = []for one in one_data:if one in ["<|User|>", "<|Ash|>"]:ins += [one]else:one = jieba.lcut(one)try:one = np.hstack([list(i) if len(find_chinese_text(i)) > 0 else i for i in one]).tolist()except:breakins += onevoc_set |= set(ins)f.write(str(ins) + "\n")
数据名
在hf上搜方可
train-rm-static-m2m100-zh-jianti.parquet
数据地址
代码解析
import jieba
: 导入分词库jieba。from tqdm import tqdm
: 导入tqdm库,用于在循环中显示进度条。import re
: 导入正则表达式库。import pandas as pd
: 导入pandas库,用于处理数据。import numpy as np
: 导入numpy库,用于处理数组。def find_non_english_text(text)
: 定义一个函数,用于查找非英文文本。该函数输入一个文本,使用正则表达式找到文本中的非英文字符,并用空字符替换。def find_chinese_text(text)
: 定义一个函数,用于查找中文文本。该函数输入一个文本,使用正则表达式找到文本中的非中文字符,并用空字符替换。json_list = pd.read_parquet("E:/data_sets/train-rm-static-m2m100-zh-jianti.parquet")
: 读取parquet格式的文件,并将数据赋值给json_list。data_list = []
: 定义一个空列表,用于存储最终的数据。basic_list = ["<|User|>", "<|Ash|>"] * 100
: 定义一个列表,其中包含两个字符串"<|User|>“和”<|Ash|>",并将其重复100次。for _, one_data in tqdm(json_list.iterrows()):
: 遍历json_list,并使用tqdm在循环中显示进度条。其中,_表示索引值,one_data表示每一行数据。ins = "".join(one_data["prompt"].split("\n\n")[1:-1])
: 从one_data中获取prompt字段,并去除字段中的换行符。然后,取出prompt中除第一行和最后一行之外的所有内容,并将其赋值给ins。out = one_data["response"]
: 从one_data中获取response字段,并将其赋值给out。ins = np.hstack([i.split("Human:") for i in ins.split("Assistant:")])[1:].tolist()
: 将ins根据"Assistant:"分割成多个子串,然后将子串中的"Human:"去除,并将子串合并为一个列表。最后,将列表中的第一个元素去除,并将其转换为列表类型。ins_len = len(ins)
: 获取ins列表的长度,并将其赋值给ins_len。ins = np.hstack([[i, j] for i, j in zip(basic_list[:ins_len], ins)]).tolist()
: 将basic_list中与ins长度相同的元素取出,然后将basic_list和ins中的元素一一配对组成元素为两个字符串的列表,并将这些列表合并为一个列表。最后,将这个列表转换为列表类型。data_list.append(ins)
: 将ins添加到data_list中。with open("data_set_five.txt", "a", encoding="utf-8") as f:
: 打开一个文件"data_set_five.txt",并将其赋值给变量f。打开文件时,使用"a"模式表示追加数据到文件末尾。voc_set = set()
: 定义一个空集合,用于存储数据中的所有词汇。for one_data in tqdm(data_list):
: 遍历data_list,并使用tqdm在循环中显示进度条。其中,one_data表示每一个元素。ins = []
: 定义一个空列表,用于存储分词后的文本。for one in one_data:
: 遍历one_data中的每一个元素,并将其赋值给变量one。if one in ["<|User|>", "<|Ash|>"]:
: 判断one是否等于"<|User|>“或”<|Ash|>"。ins += [one]
: 如果one等于"<|User|>“或”<|Ash|>",则将one加入ins中。else:
: 如果one不等于"<|User|>“或”<|Ash|>"。one = jieba.lcut(one)
: 使用jieba对one进行分词。try:
: 开始异常处理。one = np.hstack([list(i) if len(find_chinese_text(i)) > 0 else i for i in one]).tolist()
: 对于one中的每个分词,如果其包含中文字符,则将其拆分成单个字符,否则不做处理。然后,将处理后的结果合并为一个列表,并将这个列表转换为列表类型。voc_set |= set(ins)
: 将ins中的所有元素加入voc_set中。f.write(str(ins) + "\n")
: 将ins转换为字符串,并将其写入文件中,同时在字符串末尾加入换行符。