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

大语言模型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.activews.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.activews.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.mrgr.cn/news/78297.html

相关文章:

  • 深度学习:自然语言处理
  • Bean的生命周期详解保姆级教程,结合spring boot和spring.xml两种方式讲解,5/7/10大小阶段详细分析
  • GM、BP、LSTM时间预测预测代码
  • 力扣整理版九:贪心算法
  • C 语言静态库与动态库的生成和使用
  • 《生成式 AI》课程 第3講 CODE TASK执行文章摘要的机器人
  • Java AQS(AbstractQueuedSynchronizer):深入剖析
  • v-for产生 You may have an infinite update loop in a component render function
  • 直言抖音电商环境恶化,叶国富也想指点张一鸣
  • 【拥抱AI】RAG如何提高向量化的质量
  • 关于node全栈项目打包发布linux项目问题总集
  • SQL基础入门—— 简单查询与条件筛选
  • ubuntu 安装docker
  • Linux下的火墙管理及优化
  • C语言蓝桥杯组题目
  • WonderJourney 学习笔记
  • Qt获取文件夹下的文件个数(过滤和不过滤的区别)
  • 第 4 章 Java 并发包中原子操作类原理剖析
  • 【Jenkins】docker 部署 Jenkins 踩坑笔记
  • 类和对象--中--初始化列表(重要)、隐式类型转化(理解)、最后两个默认成员函数
  • Android 布局菜单或按钮图标或Menu/Item设置可见和不可见
  • 《Vue 初印象:快速上手 Vue 基础语法》
  • PostgreSQL详细安装教程
  • 基于SpringBoot共享汽车管理系统【附源码】
  • Docker容器运行CentOS镜像,执行yum命令提示“Failed to set locale, defaulting to C.UTF-8”
  • linuxCNC(三)ini配置文件说明