项目实训二--数据的整理和清洗(二)

去除过短或者过长的训练数据:

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)
  1. 读取CSV文件:使用pd.read_csv()函数读取名为data.csv的文件
  2. 过滤数据
    • 使用Pandas的字符串方法.str.len()来计算每一行中questionanswer列的长度。
    • 使用布尔索引过滤出满足所有条件的行:
      • 问题列的长度至少为5个字符且不超过50个字符。
      • 答案列的长度至少为50个字符且不超过512个字符。
  3. 保存过滤后的数据:使用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)
  1. 相似度计算函数
    • 使用SequenceMatcher函数比较两个字符串的相似度。这个函数返回一个介于0和1之间的数值,表示两个字符串的相似度百分比。
  2. 读取CSV文件
    • 使用pd.read_csv()读取CSV文件。
  3. 初始化索引列表
    • 使用一个集合indices_to_drop来存储需要删除的行索引。使用集合可以避免重复添加同一索引。
  4. 双重循环比较每行
    • 用双重循环遍历数据框,比较每一对问题和答案。
    • 如果发现问题或答案的相似度超过80%,将较后的行索引添加到indices_to_drop集合中。
  5. 删除指定行
    • 使用DataFrame.drop方法删除所有标记为删除的行。
  6. 保存结果
    • 使用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)
  1. 读取CSV文件:使用Pandas读取cleaned_translated_train.csv文件。
  2. 构建JSON格式数据:对于数据框中的每一行,创建一个字典,其中instruction键对应问题列的内容,input键为空字符串,output键对应答案列的内容。
  3. 保存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)
  1. 导入所需的库:使用json进行数据的序列化和反序列化,使用os来处理文件和目录路径。
  2. 设置文件目录:所有的JSON文件都放在名为json_files的目录中。
  3. 读取JSON文件
    • 使用os.listdir()遍历指定目录中的所有文件。
    • 检查文件扩展名是否为.json,确保只处理JSON文件。
    • 对于每个JSON文件,打开并使用json.load()读取内容,然后将这些内容添加到all_data列表中。
  4. 写入合并后的JSON数据
    • 所有文件的数据被存储在all_data列表中,该列表包含了从每个文件读取的数据。
    • 使用json.dump()将这个列表写入一个名为combined_data.json的新文件中,设置ensure_ascii=False来支持非ASCII字符,indent=4提供了格式化的输出,使得JSON文件易于阅读。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值