当前位置: 首页 > article >正文

大语言模型LLM的微调中 QA 转换的小工具 txt2excel.py

在训练语言模型中,需要将文件整理成规范的文档,因为文档本身会有很多不规范的地方,为了训练的正确,将文档进行规范处理

文章最后附上txt的sample

该 Python 代码的主要目的是将特定格式的文本文件中的问答数据读取出来,并写入到 Excel 文件中。其具体功能如下:

1. 读取文本文件中的问答数据

  • 代码首先定义了read_txt_file函数,用于读取指定路径(txt_file_path)的文本文件。
  • 在函数中,以utf-8编码打开文件,逐行读取内容。通过判断每行是否以### Q:### Q:开头来识别问题,以### A:### A:开头来识别答案。
  • 将识别出的问题和答案组合成完整的问答对,并存储在一个列表中返回。

2. 将问答数据写入 Excel 文件

  • 接着定义了write_to_excel函数,该函数接受问答数据列表和输出文件路径(excel_file_path)作为参数。
  • 在函数内部,创建一个新的 Excel 工作簿,获取活动工作表并设置其标题为QA_Data
  • 然后遍历问答数据列表,将每个问答对中的问题和答案进行处理后,作为一行数据添加到工作表中。
  • 最后保存工作簿到指定的输出路径,生成包含问答数据的 Excel 文件。

代码如下

1. 导入必要的库

from openpyxl import Workbook
import os

  • from openpyxl import Workbook:从openpyxl库中导入Workbook类,用于创建和操作 Excel 文件。
  • import os:导入os模块,用于处理文件路径相关的操作。

2. 设置工作目录

work_dir = os.path.dirname(os.path.abspath(__file__))

这行代码获取当前 Python 脚本文件所在的目录路径,并将其赋值给work_dir变量。os.path.dirname获取指定路径的目录部分,os.path.abspath获取绝对路径,__file__是 Python 内置变量,表示当前脚本文件的路径。

3. 指定文件路径

txt_file_path = os.path.join(work_dir, "qa.txt")   # 替换为实际的文本文档路径
excel_file_path = "output.xlsx"  # 替换为输出的Excel文件路径

  • txt_file_path:通过os.path.join将工作目录和文件名qa.txt拼接成完整的文本文件路径,这里假设qa.txt与脚本在同一目录下,如果实际情况不同,需要修改路径。
  • excel_file_path:指定输出 Excel 文件的名称,这里假设输出文件在当前工作目录下。如果需要指定其他目录,同样可以使用os.path.join进行路径拼接。

4. 读取文本文件函数

def read_txt_file(file_path):
    with open(file_path, 'r', encoding='utf-8') as file:
        lines = file.readlines()
    qa_list = []
    current_qa = ""
    for line in lines:
        line = line.strip()
        if line.startswith("### Q:") or line.startswith("### Q:"):
            if current_qa:
                qa_list.append(current_qa)
            current_qa = line.replace("### Q:", "Q:")
        elif line.startswith("### A:") or line.startswith("### A:"):
            current_qa += " " + line.replace("### A:", "A:")
    if current_qa:
        qa_list.append(current_qa)
    return qa_list

  • def read_txt_file(file_path)::定义了一个名为read_txt_file的函数,它接受一个文件路径作为参数,用于读取文本文件中的问答内容。
  • with open(file_path, 'r', encoding='utf-8') as file::以只读模式('r')打开指定路径的文本文件,并使用utf-8编码。with语句确保文件在使用后正确关闭。
  • lines = file.readlines():读取文件的所有行,并将每行内容作为一个字符串存储在lines列表中。
  • qa_list = []:初始化一个空列表,用于存储解析后的问答对。
  • current_qa = "":初始化一个空字符串,用于临时存储当前正在解析的问答内容。
  • 循环部分:
    • line = line.strip():去除每行字符串开头和结尾的空白字符(如空格、换行符等)。
    • if line.startswith("### Q:") or line.startswith("### Q:")::检查当前行是否以### Q:开头,如果是,表示一个新问题的开始。
      • if current_qa::如果current_qa不为空,说明之前已经读取了一个完整的问答对,将其添加到qa_list列表中。
      • current_qa = line.replace("### Q:", "Q:"):将当前行中的### Q:替换为Q:,并赋值给current_qa,开始存储新的问题。
    • elif line.startswith("### A:") or line.startswith("### A:")::检查当前行是否以### A:开头,如果是,表示当前行是问题的答案部分。
      • current_qa += " " + line.replace("### A:", "A:"):将当前行中的### A:替换为A:,并添加到current_qa字符串中,与问题部分组合成完整的问答对。
  • 最后部分:
    • if current_qa::在循环结束后,如果current_qa不为空,说明最后一组问答对还未添加到qa_list中,将其添加进去。
    • return qa_list:返回包含所有解析后的问答对的列表。

5. 将内容写入 Excel 文件函数

def write_to_excel(data, output_file):
    wb = Workbook()
    ws = wb.active
    ws.title = "QA_Data"
    for item in data:
        parts = item.split("A:")
        question = parts[0].replace("Q:", "").strip()
        answer = parts[1].strip() if len(parts) > 1 else ""
        ws.append([question, answer])
    wb.save(output_file)

  • def write_to_excel(data, output_file)::定义了一个名为write_to_excel的函数,它接受数据列表和输出文件路径作为参数,用于将数据写入 Excel 文件。
  • wb = Workbook():创建一个新的 Excel 工作簿对象。
  • ws = wb.active:获取工作簿中的活动工作表(默认是第一个工作表)。
  • ws.title = "QA_Data":将工作表的标题设置为QA_Data
  • 循环部分:
    • parts = item.split("A:"):将每个问答对字符串按照A:进行分割,得到一个包含问题和答案的列表(假设格式为问题A:答案)。
    • question = parts[0].replace("Q:", "").strip():从分割后的列表中获取问题部分,去除Q:前缀并去除首尾空白字符,然后赋值给question变量。
    • answer = parts[1].strip() if len(parts) > 1 else "":如果分割后的列表长度大于 1,说明有答案部分,获取答案并去除首尾空白字符,否则将answer设置为空字符串。
    • ws.append([question, answer]):将问题和答案作为一行数据添加到工作表中。
  • wb.save(output_file):保存工作簿到指定的输出文件路径。

6. 主程序部分

if __name__ == "__main__":
    qa_data = read_txt_file(txt_file_path)
    write_to_excel(qa_data, excel_file_path)

  • if __name__ == "__main__"::这是 Python 中的一个常用结构,用于确保代码在作为主程序运行时执行以下代码块,而在被导入为模块时不执行。
  • qa_data = read_txt_file(txt_file_path):调用read_txt_file函数读取指定文本文件中的问答数据,并将结果赋值给qa_data变量。
  • write_to_excel(qa_data, excel_file_path):调用write_to_excel函数将问答数据写入指定的 Excel 文件中。

整体代码如下:

from openpyxl import Workbook
import os

# 设置工作目录(与训练代码中的设置对应)
work_dir = os.path.dirname(os.path.abspath(__file__))

txt_file_path = os.path.join(work_dir, "qa.txt")   # 替换为实际的文本文档路径
excel_file_path = "output.xlsx"  # 替换为输出的Excel文件路径

# 读取文本文件
def read_txt_file(file_path):
    with open(file_path, 'r', encoding='utf-8') as file:
        lines = file.readlines()
    qa_list = []
    current_qa = ""
    for line in lines:
        line = line.strip()
        if line.startswith("### Q:") or line.startswith("### Q:"):
            if current_qa:
                qa_list.append(current_qa)
            current_qa = line.replace("### Q:", "Q:")
        elif line.startswith("### A:") or line.startswith("### A:"):
            current_qa += " " + line.replace("### A:", "A:")
    if current_qa:
        qa_list.append(current_qa)
    return qa_list

# 将内容写入Excel文件
def write_to_excel(data, output_file):
    wb = Workbook()
    ws = wb.active
    ws.title = "QA_Data"
    for item in data:
        parts = item.split("A:")
        question = parts[0].replace("Q:", "").strip()
        answer = parts[1].strip() if len(parts) > 1 else ""
        ws.append([question, answer])
    wb.save(output_file)

if __name__ == "__main__":
    qa_data = read_txt_file(txt_file_path)
    write_to_excel(qa_data, excel_file_path)

qa.txt
### Q: 目前什么事项会有系统邮件或者企信消息通知?
### A: [此处未明确提及具体通知事项,需查看文档中的图片,假设图片显示包含合同审批通知、付款通知等]合同审批进度、付款状态等事项会有系统邮件或企信消息通知(具体需根据文档中图片所示内容确定)。

## 商旅
### Q: 元年商旅订票时身份信息有误,如何修改?
### A: 行程选择界面,点击出行人“>”按钮编辑证件信息,外籍注意检查护照信息,避免证件信息有误影响乘机。

### Q: 差旅费哪些发票需要员工线下打印?
### A: 机票中的电子客运行程单、酒店住宿专票、火车票,线上订票月结统付统一打印发票;使用护照等非身份证订票的火车票、火车退改签票据,须员工线下打印后交回;滴滴用车、餐费、洗衣费等,须员工垫付后开票。

### Q: 差旅酒店住宿不通过线上预订,如何在差旅事前申请中预估费用?
### A: 按标准添加行程规划,如选择目的地、入住离店日期、房间数、住宿标准等,系统会自动计算预估费用上限。

### Q: 跨店同事是否可以合住?
### A: 为节约费用,可以合住,请线下预定酒店,报销时事由特殊报备。另外,同店员工也是可以合住的,请通过元年预定酒店即可。

### Q: 老系统已审批完成的差旅事前申请在哪提报销?
### A: 商旅模块—行程方案—迁移前差旅费报销单。

### Q: 迁移前差旅费报销单据,如何添加未在事前申请中预估的费用?
### A: 在预算归属中点击操作下的“⊕”按钮,新增行项目添加费用。老系统事前申请的所有行项目、未在事前申请中预估报销新增的行项目均在同一费用明细行里添加。

整理后的 excel 如下

 


http://www.kler.cn/a/417277.html

相关文章:

  • 网络工程师 (22)网络协议
  • Maven架构项目管理工具
  • hot100(9)
  • 科技赋能数字内容体验的核心技术探索
  • $route 和 $router 的区别是什么?
  • string类OJ练习题
  • 球幕科技馆:演艺与科技完美融合,打造未来品牌体验—轻空间
  • STM32的CAN波特率计算
  • C#.Net筑基-类型系统
  • 【linux学习指南】Linux进程信号产生(三) 硬件异常除零出错?野指针异常?core文件
  • 嵌入式Linux使用OpenGL ES
  • mac下Gpt Chrome升级成GptBrowser书签和保存的密码恢复
  • Java List.of()改写为jdk8
  • 金融量化模型的变革之路:探索未来智能交易的核心
  • 大语言模型(LLM)不平衡的内存使用问题;训练过程中 Transformer层1和Transformer层2的反向传播计算量差异
  • C语言实例_16之求不同位数为同一个数的和
  • Flutter:city_pickers省市区三级联动
  • npm install -g@vue/cli报错解决:npm error code ENOENT npm error syscall open
  • 下载SRA序列数据——ascp(前期草稿,未上传待更新)
  • 亚马逊自研大语言模型 Olympus 即将亮相,或将在 LLM 竞赛中掀起新波澜
  • Python `async def` 函数中使用 `yield` 和 `return` 的区别
  • ffmpeg 各版本号对应表格
  • uni-app 使用笔记
  • ctrl键和大写键互换解决方法
  • TYUT设计模式精华版
  • 简单获取json预览