大语言模型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 如下