羲和数据集收集器0.8

为了使代码能够识别并提取文档中的内容,我们需要进一步优化文本解析和问答对提取的逻辑。需要确保能够正确识别和提取其中的问答对。
以下是对代码的进一步完善:

python

import os
import json
import fitz  # PyMuPDF
import docx
import re
import tkinter as tk
from tkinter import filedialog, messagebox, simpledialog
import logging# 设置日志记录
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')def clean_text(text):""" 清理文本,去除多余的空白字符和标点符号 """text = re.sub(r'\s+', ' ', text)  # 合并多个空白字符text = re.sub(r'[^\w\s]', '', text)  # 去除标点符号return text.strip()def extract_qa_pairs_from_txt(file_path):with open(file_path, 'r', encoding='utf-8') as f:content = f.read()content = clean_text(content)qa_pairs = extract_qa_pairs_from_content(content)return qa_pairsdef extract_qa_pairs_from_docx(file_path):doc = docx.Document(file_path)content = '\n'.join([para.text for para in doc.paragraphs])content = clean_text(content)qa_pairs = extract_qa_pairs_from_content(content)return qa_pairsdef extract_qa_pairs_from_pdf(file_path):doc = fitz.open(file_path)content = ''for page_num in range(len(doc)):page = doc.load_page(page_num)content += page.get_text()content = clean_text(content)qa_pairs = extract_qa_pairs_from_content(content)return qa_pairsdef extract_qa_pairs_from_content(content):qa_pairs = []lines = content.split('\n')current_question = Nonecurrent_answer = []for line in lines:# 检查是否为新的问答对或定义开始if re.match(r'^\d+\.\s+', line) or re.match(r'^Q:\s+', line) or re.match(r'^问题:\s+', line) or re.match(r'^\w+:\s+', line):if current_question and current_answer:qa_pairs.append({'question': current_question, 'xihe_answers': [' '.join(current_answer)], 'ling_answers': [' '.join(current_answer)]})current_question = re.sub(r'^\d+\.\s+', '', line)current_question = re.sub(r'^(Q:|问题:|[\w\s]+:)\s+', '', current_question)current_answer = []elif re.match(r'^\d+\.\d+\s+', line) or re.match(r'^$$\d+$$\s+', line) or re.match(r'^注 \d+:', line):  # 子章节或注释开始if current_answer:current_answer.append(line)else:current_answer.append(line)if current_question and current_answer:qa_pairs.append({'question': current_question, 'xihe_answers': [' '.join(current_answer)], 'ling_answers': [' '.join(current_answer)]})return qa_pairsdef extract_qa_pairs_from_file(file_path):if file_path.endswith('.txt'):return extract_qa_pairs_from_txt(file_path)elif file_path.endswith('.docx'):return extract_qa_pairs_from_docx(file_path)elif file_path.endswith('.pdf'):return extract_qa_pairs_from_pdf(file_path)else:raise ValueError("Unsupported file type")def write_qa_pairs_to_file(qa_pairs, output_file):with open(output_file, 'w', encoding='utf-8') as f:for pair in qa_pairs:f.write(json.dumps(pair, ensure_ascii=False) + '\n')def generate_output_filename(files):base_names = [os.path.splitext(os.path.basename(file))[0] for file in files]if len(base_names) == 1:return f"{base_names[0]}_qa.txt"else:return "_".join(base_names) + "_qa.txt"def process_files(files, output_file):qa_pairs = []for file in files:try:logging.info(f"Processing file: {file}")qa_pairs.extend(extract_qa_pairs_from_file(file))except Exception as e:logging.error(f"Error processing {file}: {e}")messagebox.showerror("错误", f"处理文件时出错: {file}\n{e}")write_qa_pairs_to_file(qa_pairs, output_file)num_lines = sum(1 for line in open(output_file, 'r', encoding='utf-8'))messagebox.showinfo("完成", f"提取了问答对并保存到 {output_file}\n共 {num_lines} 行数据")def select_files():global filesfiles = filedialog.askopenfilenames(filetypes=[("Text files", "*.txt"), ("Word files", "*.docx"), ("PDF files", "*.pdf")])if files:file_list_label.config(text="\n".join(files))def start_processing():if not files:messagebox.showerror("错误", "请选择输入文件")returnoutput_file = generate_output_filename(files)process_files(files, output_file)# 创建主窗口
root = tk.Tk()
root.title("问答对提取工具")# 文件选择
select_files_button = tk.Button(root, text="选择文件", command=select_files)
select_files_button.pack(pady=10)
file_list_label = tk.Label(root, text="")
file_list_label.pack()# 开始处理按钮
start_button = tk.Button(root, text="开始处理", command=start_processing)
start_button.pack(pady=20)# 运行主循环
root.mainloop()

优化内容提取逻辑
为了更好地处理你提供的示例内容,我们需要调整 extract_qa_pairs_from_content 函数,使其能够更灵活地识别和提取问答对。以下是一些可能的优化:

识别标题和段落:识别文档中的标题和段落,将其作为潜在的问答对。
处理多行答案:确保多行答案能够正确合并。
python

def extract_qa_pairs_from_content(content):qa_pairs = []lines = content.split('\n')current_question = Nonecurrent_answer = []for line in lines:# 检查是否为新的问答对或定义开始if re.match(r'^\d+\.\s+', line) or re.match(r'^Q:\s+', line) or re.match(r'^问题:\s+', line) or re.match(r'^\w+:\s+', line):if current_question and current_answer:qa_pairs.append({'question': current_question, 'xihe_answers': [' '.join(current_answer)], 'ling_answers': [' '.join(current_answer)]})current_question = re.sub(r'^\d+\.\s+', '', line)current_question = re.sub(r'^(Q:|问题:|[\w\s]+:)\s+', '', current_question)current_answer = []elif re.match(r'^\d+\.\d+\s+', line) or re.match(r'^$$\d+$$\s+', line) or re.match(r'^注 \d+:', line):  # 子章节或注释开始if current_answer:current_answer.append(line)else:current_answer.append(line)if current_question and current_answer:qa_pairs.append({'question': current_question, 'xihe_answers': [' '.join(current_answer)], 'ling_answers': [' '.join(current_answer)]})# 处理没有明确标记的问答对if not qa_pairs:for line in lines:if ':' in line:parts = line.split(':', 1)if len(parts) == 2:question, answer = partsqa_pairs.append({'question': question.strip(), 'xihe_answers': [answer.strip()], 'ling_answers': [answer.strip()]})return qa_pairs

说明:
识别标题和段落:通过检查行中是否包含 : 来识别潜在的问答对。
处理多行答案:确保多行答案能够正确合并。
运行步骤:
确保安装了所需的库:pip install pymupdf python-docx
将上述代码保存为一个Python文件,例如 qa_extractor_gui.py。
运行该文件:python qa_extractor_gui.py。
使用GUI选择一个或多个文件,点击“开始处理”按钮进行文件处理。
这样,你就可以通过一个友好的图形界面来选择文件,并进行问答对的提取和保存。希望这些改进能更好地处理你提供的示例内容!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/10438.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

Golang | Leetcode Golang题解之第554题砖墙

题目: 题解: func leastBricks(wall [][]int) int {cnt : map[int]int{}for _, widths : range wall {sum : 0for _, width : range widths[:len(widths)-1] {sum widthcnt[sum]}}maxCnt : 0for _, c : range cnt {if c > maxCnt {maxCnt c}}retur…

斯坦福泡茶机器人DexCap源码解析:涵盖收集数据、处理数据、模型训练三大阶段

前言 因为我司「七月在线」关于dexcap的复现/优化接近尾声了,故准备把dexcap的源码也分析下。​下周则分析下iDP3的源码——为队伍「iDP3人形的复现/优化」助力 最开始,dexcap的源码分析属于此文《DexCap——斯坦福李飞飞团队泡茶机器人:带…

高中数学:概率-随机实验、样本空间、随机事件

文章目录 一、随机实验二、样本空间三、随机事件例题 四、事件运算 一、随机实验 二、样本空间 三、随机事件 例如 样本空间 Ω { a , b , c , d , e , f } 则,事件 A { a , b , c } ,是一个随机事件 事件 B { d } 是一个基本事件 样本空间Ω\{a,b,c…

w~大模型~合集21

我自己的原文哦~ https://blog.51cto.com/whaosoft/12459590 #大模型~微调~用带反馈的自训练 面对当前微调大模型主要依赖人类生成数据的普遍做法,谷歌 DeepMind 探索出了一种减少这种依赖的更高效方法。大模型微调非得依赖人类数据吗?用带反馈的自训…

利用 Vue.js 开发动态组件的实战指南

📝个人主页🌹:一ge科研小菜鸡-CSDN博客 🌹🌹期待您的关注 🌹🌹 Vue.js 是现代 Web 开发中非常流行的框架,以其渐进式架构和组件化设计受到广泛欢迎。组件化开发是 Vue.js 的核心优势…

Jmeter中的配置原件(一)

配置原件 1--CSV Data Set Config 用途 参数化测试:从CSV文件中读取数据,为每个请求提供不同的参数值。数据驱动测试:使用外部数据文件来驱动测试,使测试更加灵活和可扩展。 配置步骤 准备CSV文件 创建一个CSV文件&#xff0c…

MCU的OTA升级(未完-持续更新)

1.术语 ISP : In-System Programming 在系统编程,是一种通过MCU(微控制器单元)上的内置引导程序(BootLoader)来实现对芯片内部存储器(如Flash)进行编程的技术。 华大目前对应的ISP IAP&…

让redis一直开启服务/自动启动

文章目录 你的redis是怎么打开的黑窗不能关?必须要自动启动吗?再说说mysql 本文的所有指令都建议在管理员权限下打开cmd控制台 推荐的以管理员身份打开控制台的方式 Win R 打开运行 输入cmdShift Ctrl Enter 你的redis是怎么打开的 安装过redis的朋友都知道, redis的安…

从认识 VNode VDOM 到实现 mini-vue

前言 现有框架几乎都引入了虚拟 DOM 来对真实 DOM 进行抽象,也就是现在大家所熟知的 VNode 和 VDOM,那么为什么需要引入虚拟 DOM 呢?下面就一起来了解下吧!!! VNode & VDOM VNode 和 VDOM 是什么&am…

vue项目实战

1.项目文件夹添加(结构如下) 2.页面构建 安装路由 npm install react-router-dom 3.页面基本模板 router文件夹下index.js的模板 // 引入组件 import Login from "../views/login"; // 注册路由数组 const routes [{// 首页默认是/path: …

SD-WAN跨境加速专线:打造无缝、高效的全球社交媒体营销网络

在数字化时代,电子商务与社交媒体的融合已成为不可逆转的趋势。亚马逊,作为全球领先的电子商务平台,近期与Facebook、Instagram、Snapchat、Pinterest和TikTok等社交媒体巨头携手,推出了一项革命性的无缝购物体验。这一创新举措不…

yelp商家数据集上使用火算法求解TSP 问题

先简要回顾下什么是TSP问题, 旅行商问题(Traveling Salesman Problem,TSP)是一个经典的组合优化问题,广泛应用于运筹学、计算机科学和物流等领域。TSP的基本描述如下: 问题描述 定义:假设有一…

【深度学习目标检测|YOLO算法1】YOLO家族进化史:从YOLOv1到YOLOv11的架构创新、性能优化与行业应用全解析...

【深度学习目标检测|YOLO算法1】YOLO家族进化史:从YOLOv1到YOLOv11的架构创新、性能优化与行业应用全解析… 【深度学习目标检测|YOLO算法1】YOLO家族进化史:从YOLOv1到YOLOv11的架构创新、性能优化与行业应用全解析… 文章目录 【深度学习目标检测|YOL…

星期-时间范围选择器 滑动选择时间 最小粒度 vue3

星期-时间范围选择器 功能介绍属性说明事件说明实现代码使用范例 根据业务需要,实现了一个可选择时间范围的周视图。用户可以通过鼠标拖动来选择时间段,并且可以通过快速选择组件来快速选择特定的时间范围。 功能介绍 时间范围选择:用户可以…

Java | Leetcode Java题解之第554题砖墙

题目&#xff1a; 题解&#xff1a; class Solution {public int leastBricks(List<List<Integer>> wall) {Map<Integer, Integer> cnt new HashMap<Integer, Integer>();for (List<Integer> widths : wall) {int n widths.size();int sum 0…

牛客小白月赛104 —— C.小红打怪

C.小红打怪 1.题目&#xff1a; 2.样例 输入 5 1 2 3 4 5 输出 2 说明 第一回合&#xff0c;小红攻击全体怪物&#xff0c;队友1攻击5号怪物&#xff0c;队友2攻击4号和5号怪物&#xff0c;剩余每只怪物血量为[0,1,2,2,2]。 第二回合&#xff0c;小红攻击全体怪物&#…

python画图|text()和dict()初探

【1】引言 在进行hist()函数的学习进程中&#xff0c;了解到了subplot_mosaic()函数&#xff0c;在学习subplot_mosaic()函数的时候&#xff0c;又发现了text()和dict()函数。 经探究&#xff0c;text()和dict()函数有很多一起使用的场景&#xff0c;为此&#xff0c;我们就一…

BUG: scheduling while atomic

▌▌上篇文章的内容还没有结束 中断处理函数中如果执行了调度&#xff0c;会发生什么 ▌这次&#xff0c;我修改了程序&#xff0c;在中断处理函数中调用了msleep 程序执行后&#xff0c;会有这样的日志 ▌关键就是这句 BUG: scheduling while atomic 我们追代码&#xff0c;可…

算法 -选择排序

博客主页&#xff1a;【夜泉_ly】 本文专栏&#xff1a;【算法】 欢迎点赞&#x1f44d;收藏⭐关注❤️ 文章目录 &#x1f4a1;选择排序1. &#x1f504; 选择排序&#x1f5bc;️示意图&#x1f4d6;简介&#x1f4a1;实现思路1&#x1f4bb;代码实现1&#x1f4a1;实现思路2…

ubuntu 22.04 镜像源更换

双11抢了个云服务器&#xff0c;想要整点东西玩玩&#xff0c;没想到刚上来就不太顺利 使用sudo apt update更新软件&#xff0c;然后发生了如下报错 W: Failed to fetch http://mirrors.jdcloudcs.com/ubuntu/dists/jammy/InRelease 理所当然想到可能是镜像源连接不是很好&…