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

相关推荐
一个无名的炼丹师4 分钟前
[硬核实战] 解锁多模态RAG:构建能“看懂”PDF复杂图表的智能问答系统
人工智能·python·pdf·多模态·rag
测试人社区-小明17 分钟前
从前端体验到后端架构:Airbnb全栈SDET面试深度解析
前端·网络·人工智能·面试·职场和发展·架构·自动化
南极星100519 分钟前
OPENCV(python)--初学之路(十八)特征匹配+ Homography查找对象
人工智能·opencv·计算机视觉
点云SLAM27 分钟前
Redundant 英文单词学习
人工智能·学习·英文单词学习·雅思备考·redundant·冗余的·多余的 、重复的
爱笑的眼睛1134 分钟前
SQLAlchemy 核心 API 深度解析:超越 ORM 的数据库工具包
java·人工智能·python·ai
知白守黑V38 分钟前
OWASP 2025 LLM 应用十大安全风险深度解析
人工智能·安全·ai agent·ai智能体·ai应用·ai安全·大模型安全
zhaodiandiandian39 分钟前
生成式AI重构内容创作生态:人机协同成核心竞争力
大数据·人工智能·重构
努力毕业的小土博^_^1 小时前
【AI课程领学】基于SmolVLM2与Qwen3的多模态模型拼接实践:从零构建视觉语言模型(一)
人工智能·深度学习·神经网络·机器学习·语言模型·自然语言处理
Lululaurel1 小时前
AI编程提示词工程实战指南:从入门到精通
人工智能·python·机器学习·ai·ai编程
财经三剑客1 小时前
东风集团股份:11月生产量达21.6万辆 销量19.6万辆
大数据·人工智能·汽车