去除过短或者过长的训练数据:
import pandas as pd
# 读取CSV文件
data = pd.read_csv('data.csv')
# 过滤数据,保留满足条件的行
filtered_data = data[(data['question'].str.len() >= 5) & (data['question'].str.len() <= 50) &
(data['answer'].str.len() >= 50) & (data['answer'].str.len() <= 512)]
# 保存过滤后的数据到新的CSV文件
filtered_data.to_csv('filtered_data.csv', index=False)
- 读取CSV文件:使用
pd.read_csv()
函数读取名为data.csv
的文件 - 过滤数据:
- 使用Pandas的字符串方法
.str.len()
来计算每一行中question
和answer
列的长度。 - 使用布尔索引过滤出满足所有条件的行:
- 问题列的长度至少为5个字符且不超过50个字符。
- 答案列的长度至少为50个字符且不超过512个字符。
- 使用Pandas的字符串方法
- 保存过滤后的数据:使用
to_csv()
方法将过滤后的数据保存到一个名为filtered_data.csv
的新文件中。设置index=False
参数来避免写入行索引到文件。
这段代码有效地过滤出符合给定字符长度要求的行,去除不符合条件的行,并将剩余的行保存到新的CSV文件中。
删除相似的问题或者相似的答案
import pandas as pd
from difflib import SequenceMatcher
def similar(a, b):
return SequenceMatcher(None, a, b).ratio()
# 读取CSV文件
data = pd.read_csv('data.csv')
# 初始化要删除的索引列表
indices_to_drop = set()
# 检查问题列的相似度
for i in range(len(data) - 1):
for j in range(i + 1, len(data)):
# 比较问题列
if similar(data.loc[i, 'question'], data.loc[j, 'question']) > 0.8:
indices_to_drop.add(j) # 添加问题二的索引到删除列表
# 比较答案列
if similar(data.loc[i, 'answer'], data.loc[j, 'answer']) > 0.8:
indices_to_drop.add(j) # 添加答案二的索引到删除列表
# 删除相似度高的行
data = data.drop(indices_to_drop)
# 保存过滤后的数据到新的CSV文件
data.to_csv('filtered_data.csv', index=False)
- 相似度计算函数:
- 使用
SequenceMatcher
函数比较两个字符串的相似度。这个函数返回一个介于0和1之间的数值,表示两个字符串的相似度百分比。
- 使用
- 读取CSV文件:
- 使用
pd.read_csv()
读取CSV文件。
- 使用
- 初始化索引列表:
- 使用一个集合
indices_to_drop
来存储需要删除的行索引。使用集合可以避免重复添加同一索引。
- 使用一个集合
- 双重循环比较每行:
- 用双重循环遍历数据框,比较每一对问题和答案。
- 如果发现问题或答案的相似度超过80%,将较后的行索引添加到
indices_to_drop
集合中。
- 删除指定行:
- 使用
DataFrame.drop
方法删除所有标记为删除的行。
- 使用
- 保存结果:
- 使用
to_csv()
方法将处理后的数据保存到新的CSV文件filtered_data.csv
中,index=False
参数确保不保存行索引。
- 使用
这段代码将根据问题和答案的相似度过滤出唯一的行,是处理大量文本数据
对不同学科相关的 CSV 文件进行扫描并将相同主题的 CSV 文件合并
import os
import pandas as pd
def get_csv_files(directory):
"""获取指定目录下的所有 CSV 文件"""
csv_files = [os.path.join(directory, f) for f in os.listdir(directory) if f.endswith('.csv')]
return csv_files
def extract_topic_from_file(file, keyword):
"""从文件的第一列中提取主题"""
df = pd.read_csv(file)
if keyword in df.columns:
first_column_values = df[keyword].unique()
if len(first_column_values) > 0:
return first_column_values[0] # 使用第一列的第一个唯一值作为主题
return None
def categorize_files_by_keyword(csv_files, keyword):
"""通过扫描第一列的关键词将 CSV 文件分类"""
categorized_files = {}
for file in csv_files:
topic = extract_topic_from_file(file, keyword)
if topic:
if topic not in categorized_files:
categorized_files[topic] = []
categorized_files[topic].append(file)
return categorized_files
def merge_csv_files(files):
"""合并给定的 CSV 文件列表"""
dfs = [pd.read_csv(f) for f in files]
merged_df = pd.concat(dfs, ignore_index=True)
return merged_df
def save_merged_files(categorized_files, output_directory):
"""保存合并后的文件"""
if not os.path.exists(output_directory):
os.makedirs(output_directory)
for topic, files in categorized_files.items():
merged_df = merge_csv_files(files)
output_file = os.path.join(output_directory, f"{topic}_merged.csv")
merged_df.to_csv(output_file, index=False)
print(f"Saved merged file for topic '{topic}' to '{output_file}'")
def main(input_directory, output_directory, keyword):
csv_files = get_csv_files(input_directory)
categorized_files = categorize_files_by_keyword(csv_files, keyword)
save_merged_files(categorized_files, output_directory)
if __name__ == "__main__":
input_directory = "path/to/your/csv/files" # 输入CSV文件的目录路径
output_directory = "path/to/save/merged/csv/files" # 输出合并CSV文件的目录路径
keyword = "your_keyword" # 要在第一列中搜索的关键词
main(input_directory, output_directory, keyword)
- get_csv_files:获取指定目录下的所有 CSV 文件。
- extract_topic_from_file:从 CSV 文件的第一列中提取主题。如果第一列包含关键词,则使用第一个唯一值作为主题。
- categorize_files_by_keyword:根据第一列中的关键词将 CSV 文件分类。
- merge_csv_files:合并给定的 CSV 文件列表。
- save_merged_files:保存合并后的 CSV 文件到指定目录。
- main:主函数,指定输入目录、输出目录和关键词。
转换为Alpaca数据集和Json格式用于模型训练和微调
import pandas as pd
import json
# 读取CSV文件
data = pd.read_csv('cleaned_translated_train.csv')
# 转换数据为JSON格式,每一行变成一个字典
json_data = [
{
"instruction": row["question"],
"input": "",
"output": row["answer"]
}
for index, row in data.iterrows()
]
# 将JSON数据保存到文件
with open('data_for_training.json', 'w', encoding='utf-8') as json_file:
json.dump(json_data, json_file, ensure_ascii=False, indent=4)
- 读取CSV文件:使用Pandas读取
cleaned_translated_train.csv
文件。 - 构建JSON格式数据:对于数据框中的每一行,创建一个字典,其中
instruction
键对应问题列的内容,input
键为空字符串,output
键对应答案列的内容。 - 保存JSON数据:将构建的JSON数据列表保存到名为
data_for_training.json
的文件中,使用json.dump
进行序列化,保持格式化输出以提高可读性。
多个处理好的Json文件进行拼接,用于最后的Lora微调和Rag向量化
import json
import os
# 假设所有JSON文件都存放在一个名为 'json_files' 的目录中
directory_path = 'json_files'
all_data = []
# 遍历目录中的每个文件
for filename in os.listdir(directory_path):
if filename.endswith('.json'):
file_path = os.path.join(directory_path, filename)
# 打开并读取JSON文件
with open(file_path, 'r', encoding='utf-8') as file:
data = json.load(file)
all_data.append(data) # 将读取的数据添加到列表中
# 将合并后的数据保存到一个新的JSON文件中
with open('combined_data.json', 'w', encoding='utf-8') as output_file:
json.dump(all_data, output_file, ensure_ascii=False, indent=4)
- 导入所需的库:使用
json
进行数据的序列化和反序列化,使用os
来处理文件和目录路径。 - 设置文件目录:所有的JSON文件都放在名为
json_files
的目录中。 - 读取JSON文件:
- 使用
os.listdir()
遍历指定目录中的所有文件。 - 检查文件扩展名是否为
.json
,确保只处理JSON文件。 - 对于每个JSON文件,打开并使用
json.load()
读取内容,然后将这些内容添加到all_data
列表中。
- 使用
- 写入合并后的JSON数据:
- 所有文件的数据被存储在
all_data
列表中,该列表包含了从每个文件读取的数据。 - 使用
json.dump()
将这个列表写入一个名为combined_data.json
的新文件中,设置ensure_ascii=False
来支持非ASCII字符,indent=4
提供了格式化的输出,使得JSON文件易于阅读。
- 所有文件的数据被存储在