大语言模型LLM的微调中 Q&A 转换的小工具 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 文件中。

整体代码如下:

python 复制代码
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 如下

相关推荐
Leinwin5 分钟前
Microsoft Azure 服务4月更新告示
人工智能·azure
胡耀超8 分钟前
霍夫圆变换全面解析(OpenCV)
人工智能·python·opencv·算法·计算机视觉·数据挖掘·数据安全
jndingxin16 分钟前
OpenCV CUDA 模块中用于在 GPU 上计算两个数组对应元素差值的绝对值函数absdiff(
人工智能·opencv·计算机视觉
jerry60916 分钟前
LLM笔记(五)概率论
人工智能·笔记·学习·概率论
硅谷秋水17 分钟前
学习以任务为中心的潜动作,随地采取行动
人工智能·深度学习·计算机视觉·语言模型·机器人
Tiny番茄1 小时前
Multimodal models —— CLIP,LLava,QWen
人工智能
Wnq100721 小时前
工业场景轮式巡检机器人纯视觉识别导航的优势剖析与前景展望
人工智能·算法·计算机视觉·激光雷达·视觉导航·人形机器人·巡检机器人
无心水2 小时前
【程序员AI入门:模型】19.开源模型工程化全攻略:从选型部署到高效集成,LangChain与One-API双剑合璧
人工智能·langchain·开源·ai入门·程序员ai开发入门·程序员的 ai 开发第一课·程序员ai入门
有梦想的攻城狮2 小时前
大语言模型与多模态模型比较
人工智能·语言模型·自然语言处理·llm·大语言模型
九章云极AladdinEdu3 小时前
GPU与NPU异构计算任务划分算法研究:基于强化学习的Transformer负载均衡实践
java·开发语言·人工智能·深度学习·测试工具·负载均衡·transformer