ChatGPT | 分割Word文字及表格,优化文本分析

知识库读取Word内容时,由于embedding切片操作,可能会出现表格被分割成多个切片的情况。这种切片方式可能导致“列名栏”和“内容栏”之间的Y轴关系链断裂,从而无法准确地确定每一列的数据对应关系,从而使得无法准确知道每一列的数据汇总。

用下面表格为例子:

级数

T1

T2

T3

T4

T5

T6

T7

子等

T1.1-1.2

T2.1-2.2

T3.1-3.3

T4.1-4.3

T5.1-5.2

T6.1-6.2

T7

专业名称

实习

工程师

助理

工程师

工程师

高级

工程师

资深

工程师

专家级

工程师

首席

工程师

学历

本科及以上

本科及以上

本科及以上

本科及以上

本科及以上

硕士及以上

硕士及以上

工作经验

1年以内(兼职)

1-3年

3-5年

5-8年

8-10年

10-15年

15年以上

级数

T1

T2

T3

T4

T5

T6

T7

子等

T1.1-1.2

T2.1-2.2

T3.1-3.3

T4.1-4.3

T5.1-5.2

T6.1-T6.2

T7

专业名称

实习

工程师

助理

工程师

工程师

高级

工程师

资深

工程师

专家级

工程师

首席

工程师

分值

60-64分

65-69分

70-79分

80-89分

90-94分

95-97分

98-100分

直接演示一下本文代码运行的对比结果,分别展示“无优化”和“有优化”的问答结果,标绿框的是回答错误的:

本文帮助提高文本处理和向量化的效率,以下是对每个步骤的详细说明,详见md_embedding.py源码:

  1. 分离文字和表格:将原始Word文档中的文字内容和表格分开保存。将文字内容保存为纯文本的Markdown文件,而将表格单独保存为多个只包含Markdown表格的Markdown文件。例如,一个Word文档包含2个表格,即生成1个纯文字Markdown文件,2个纯表格的Markdown文件。
  2. 切片并向量化处理:对于多个Markdown文件,按照固定的大小切片,确保切片大小是大于Markdown表格的体积,以确保包含完整的表格。然后对这些切片进行向量化处理。

这种方法的优点是能够有效地分离文字和表格,并通过切片和向量化处理提高处理效率。通过将表格转化为向量表示,可以更方便地进行后续的计算和分析。同时,由于切片时保证了表格的完整性,可以避免表格被切断导致信息丢失的问题。

有优化的embedding的源码, md_embedding.py 如下:

import os
from langchain.embeddings import OpenAIEmbeddings
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.vectorstores import Chroma
from langchain.document_loaders import TextLoader
from langchain.text_splitter import CharacterTextSplitter
from langchain.document_loaders import DirectoryLoader
from langchain.document_loaders import UnstructuredFileLoader
from langchain.document_loaders import UnstructuredWordDocumentLoaderfrom docx import Documentdef convert_word_tables_to_markdown(file_path, output_folder):def convert_table_to_markdown(table):markdown = ""for row in table.rows:cells = [cell.text.replace('\n', '').replace('|', '|') for cell in row.cells]markdown += "|".join(cells) + "|\n"return markdowndoc = Document(file_path)# 创建输出文件夹(如果不存在)os.makedirs(output_folder, exist_ok=True)# 将每个表格转换为Markdown并保存为单独的TXT文件for i, table in enumerate(doc.tables):markdown = convert_table_to_markdown(table)filename_without_ext=os.path.splitext(os.path.basename(file_path))[0]# 将Markdown表格写入TXT文件output_file_path = os.path.join(output_folder, filename_without_ext+f"_output_{i+1}.md")with open(output_file_path, "w", encoding='utf-8') as file:file.write(markdown)return output_folderdef remove_tables_save_as_md(file_path, output_file_path):doc = Document(file_path)# 移除所有表格for table in doc.tables:table._element.getparent().remove(table._element)# 获取剩余内容的纯文本,并构建Markdown格式字符串content = [p.text.strip() for p in doc.paragraphs if p.text.strip()]markdown_content = '\n\n'.join(content)# 保存为MD文件with open(output_file_path, 'w', encoding='utf-8') as file:file.write(markdown_content)return output_file_pathabs_docx_path='D:\CloudDisk\OpenAI\博客的源码\Docx表格优化\带表格DOCX.docx'
embedding_folder_path=os.path.dirname(abs_docx_path)+'\\md_txt'
os.makedirs(embedding_folder_path,exist_ok=True)convert_word_tables_to_markdown(abs_docx_path,embedding_folder_path)
remove_tables_save_as_md(abs_docx_path,embedding_folder_path+'\\'+os.path.basename(abs_docx_path)+'.md')# 1 定义embedding
embeddings = OpenAIEmbeddings(openai_api_key='aaaaaaaaaaaaaaaaaa',openai_api_base='bbbbbbbbbbbbbbbbbbbbbbbbbb',openai_api_type='azure',model="text-embedding-ada-002",deployment="lk-text-embedding-ada-002",chunk_size=1)# 2 定义文件 
loader = DirectoryLoader(embedding_folder_path, glob="**/*.md")
pages = loader.load_and_split()# 按固定尺寸切分段落
text_splitter_RCTS = RecursiveCharacterTextSplitter(chunk_size = 500,chunk_overlap = 100
)split_docs_RCTS = text_splitter_RCTS.split_documents(pages)
for item in split_docs_RCTS:print(item)print('')#写入向量数据库
print(f'写入RCTS向量数据库')
vectordb = Chroma.from_documents(split_docs_RCTS, embedding=embeddings, persist_directory="./MD_RCTS/")
vectordb.persist()

 无优化的embedding的源码,docx_embedding.py 如下:

import os
from langchain.embeddings import OpenAIEmbeddings
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.vectorstores import Chroma
from langchain.document_loaders import UnstructuredWordDocumentLoader# 1 定义embedding
embeddings = OpenAIEmbeddings(openai_api_key='aaaaaaaaaa',openai_api_base='bbbbbbbbbbb',openai_api_type='azure',model="text-embedding-ada-002",deployment="lk-text-embedding-ada-002",chunk_size=1)docx_file_path="D:\CloudDisk\OpenAI\博客的源码\Docx表格优化\带表格DOCX.docx"# 2 定义文件 
loader = UnstructuredWordDocumentLoader(docx_file_path)
pages = loader.load_and_split()# 按固定尺寸切分段落
text_splitter_RCTS = RecursiveCharacterTextSplitter(chunk_size = 500,chunk_overlap = 100
)split_docs_RCTS = text_splitter_RCTS.split_documents(pages)
for item in split_docs_RCTS:print(item)print('')#写入向量数据库
print(f'写入RCTS向量数据库')
vectordb = Chroma.from_documents(split_docs_RCTS, embedding=embeddings, persist_directory="./Word_RCTS/")
vectordb.persist()

 问答测试 chat_qa.py:

import time
from langchain.embeddings.openai import OpenAIEmbeddings
from langchain.vectorstores import Chroma
from langchain.chains import RetrievalQA
from langchain.chat_models import AzureChatOpenAIdef getQuestionList():question_list=['级数=T6,专业名称是?','要求硕士学历有哪些级数?','分值大于等于70是哪些级数?','可以兼职的是什么级数?','需要工作经验满5年以上是哪些专业?','首席工程师要求什么学历,工作经验多少年','自上而下的原则,是指?','现场答辩,是指?','级数=T3,专业名称是?','级数=T4,专业名称是?',]return question_listembeddings = OpenAIEmbeddings(openai_api_key='aaaaaaaaaaaaaaaaa',openai_api_base='bbbbbbbbbbbbbbbbbbbbbbb',openai_api_type='azure',model="text-embedding-ada-002",deployment="lk-text-embedding-ada-002",chunk_size=1)openAiLLm = AzureChatOpenAI(openai_api_key='aaaaaaaaaaaaaaaaaaaaaaaaaaaa', #注意这里,不同 API_BASE 使用不同 APK_KEYopenai_api_base="bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",openai_api_version='2023-03-15-preview',deployment_name='lk-gpt-35-turbo-16k',temperature=0.9,model_name="gpt-35-turbo-16k",max_tokens=300)print('------r---r---r----')word_RTCS = Chroma(persist_directory="./Word_RCTS/", embedding_function=embeddings)
word_qa = RetrievalQA.from_chain_type(llm=openAiLLm,chain_type="stuff",retriever=word_RTCS.as_retriever(),return_source_documents = False) md_RTCS = Chroma(persist_directory="./MD_RCTS/", embedding_function=embeddings)
md_qa = RetrievalQA.from_chain_type(llm=openAiLLm,chain_type="stuff",retriever=md_RTCS.as_retriever(),return_source_documents = False)#print(qa_RTCS)#查看自定义Prompt的结构体内容
for i in range(0,len(getQuestionList())):question_text=getQuestionList()[i]# 进行问答wordchat = word_qa({"query": question_text}) wordquery = str(wordchat['query'])wordresult = str(wordchat['result'])print("问题: ",wordquery)print("无优化-结果:",wordresult)time.sleep(1)#每次提问间隔1scsvchat = md_qa({"query": question_text}) csvquery = str(csvchat['query'])csvresult = str(csvchat['result'])#print("MD问题: ",csvquery)print("有优化-结果:",csvresult)print('----------------------------------------')time.sleep(1)#每次提问间隔1s

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

本地部署 Stable Diffusion XL 1.0 Gradio Demo WebUI

StableDiffusion XL 1.0 Gradio Demo WebUI 0. 先展示几张 StableDiffusion XL 生成的图片1. 什么是 Stable Diffusion XL Gradio Demo WebUI2. Github 地址3. 安装 Miniconda34. 创建虚拟环境5. 安装 Stable Diffusion XL Gradio Demo WebUI6. 启动 Stable Diffusion XL Gradi…

单相锁相环原理与代码实战解释

单相锁相环程序原理如下图所示 单相锁相环原理 锁相环(PLL)是一种常用于同步、解调和信号处理等领域的电路或数字算法,其主要作用是将一个输入信号的相位与频率与参考信号进行精确的匹配。这里我们来简单解释一下单相锁相环的原理和分析。 …

在线平面设计工具盘点,提升效率首选

在移动应用程序或网页UI设计项目中,在线平面图工具是必不可少的。市场上的在线平面图工具绘制软件丰富多样,层出不穷。作为一名UI设计师,有必要了解哪些在线平面图工具既简单又专业。本文将分享6种在线平面图工具,每种在线平面图工…

【程序人生】如何在工作中保持稳定的情绪?

前言 在工作中保持稳定的情绪是现代生活中一个备受关注的话题。随着职场压力和工作挑战的增加,我们常常发现自己情绪波动不定,甚至受到负面情绪的困扰。然而,保持稳定的情绪对于我们的工作效率、人际关系和整体幸福感都至关重要。 无论你是…

JavaEE——SpringMVC中的常用注解

目录 1、RestController (1)、Controller (2)、ResponseBody 2、RequestMappping (1)、定义 (2)、使用 【1】、修饰方法 【2】、修饰类 【3】、指定方法类型 【4】、简化版…

大数据面试题之Elasticsearch:每日三题(六)

大数据面试题之Elasticsearch:每日三题 1. 为什么要使用Elasticsearch?2.Elasticsearch的master选举流程?3.Elasticsearch集群脑裂问题? 1. 为什么要使用Elasticsearch? 系统中的数据,随着业务的发展,时间…

SpringCloudAlibaba微服务实战系列(四)Sentinel熔断降级、异常fallback、block细致处理

SpringCloudAlibaba Sentinel降级和熔断 接着上篇文章的内容,在Sentinel中如何进行降级和熔断呢? 熔断降级规则 降级规则 在Sentinel中降级主要有三个策略:RT、异常比例、异常数,也是针对某个资源的设置。而在1.8.0版本后RT改为…

如何做好项目管理?年薪百万项目大佬一直在用这11张图!

日常工作中,我们会遇到各种大大小小的工作项目,如何能让项目保质保量的完成,就需要项目管理。项目管理是什么?一句话解释:在有限的时间内,在约束的范围中,集合有限资源来完成项目目标。 本周小编…

【深度学习】从现代C++中的开始:卷积

一、说明 在上一个故事中,我们介绍了机器学习的一些最相关的编码方面,例如 functional 规划、矢量化和线性代数规划。 本文,让我们通过使用 2D 卷积实现实际编码深度学习模型来开始我们的道路。让我们开始吧。 二、关于本系列 我们将学习如何…

大学的python课程一般叫什么,大学开设python课程吗

大家好,小编为大家解答大学的python课程一般叫什么的问题。很多人还不知道大学python课有没有听的必要,现在让我们一起来看看吧! 1、华中农业大学python期末考试会考原题吗 华中农业大芦如学python期末考试不会考原题。华中农业搜侍大学pyth…

OpenCV图像处理-图像分割-MeanShift

MeanShift 1. 基本概念2.代码示例 1. 基本概念 MeanShift严格说来并不是用来对图像进行分割的,而是在色彩层面的平滑滤波。它会中和色彩分布相近的颜色,平滑色彩细节,侵蚀掉面积较小的的颜色区域,它以图像上任意一点P为圆心&…

CSS :nth-child

CSS :nth-child :nth-child 伪类根据元素在同级元素中的位置来匹配元素. CSS :nth-child 语法 值是关键词 odd/evenAnB最新的 [of S] 语法权重 浏览器兼容性 很简单的例子, 来直觉上理解这个伪类的意思 <ul><li class"me">Apple</li><li>B…

MySQL 服务器的调优策略

点击上方↑“追梦 Java”关注&#xff0c;一起追梦&#xff01; 在工作中&#xff0c;我们发现慢查询一般有2个途径&#xff0c;一个是被动的&#xff0c;一个是主动的。被动的是当业务人员反馈某个查询界面响应的时间特别长&#xff0c;你才去处理。主动的是通过通过分析慢查询…

在Microsoft Excel中如何快速合并表格

在 Excel 中分析数据时&#xff0c;在一个工作表中收集所有必要信息的频率是多少&#xff1f;几乎从来没有&#xff01;当不同的数据分散在许多工作表和工作簿中时&#xff0c;这是一种非常常见的情况。幸运的是&#xff0c;有几种不同的方法可以将多个表中的数据组合成一个表&…

垃圾回收之三色标记法(Tri-color Marking)

关于垃圾回收算法&#xff0c;基本就是那么几种&#xff1a;标记-清除、标记-复制、标记-整理。在此基础上可以增加分代&#xff08;新生代/老年代&#xff09;&#xff0c;每代采取不同的回收算法&#xff0c;以提高整体的分配和回收效率。 无论使用哪种算法&#xff0c;标记…

C# OpenCvSharpe 二值化工具 阈值 自适应阈值 局部阈值 InRange

效果 阈值 自适应阈值 局部阈值 InRange 项目 VS2010.net4.0OpenCvSharper3 Demo下载

AWS / VPC 云流量监控

由于安全性、数据现代化、增长、灵活性和成本等原因促使更多企业迁移到云&#xff0c;将数据存储在本地的组织正在使用云来存储其重要数据。亚马逊网络服务&#xff08;AWS&#xff09;仍然是最受追捧和需求的服务之一&#xff0c;而亚马逊虚拟私有云&#xff08;VPC&#xff0…

LED芯片 VAS1260IB05E 带内部开关LED驱动器 汽车硬灯带灯条解决方案

VAS1260IB05E深力科LED芯片是一种连续模式电感降压转换器&#xff0c;设计用于从高于LED电压的电压源高效驱动单个或多个串联连接的LED。该设备在5V至60V之间的输入电源下工作&#xff0c;并提供高达1.2A的外部可调输出电流。包括输出开关和高侧输出电流感测电路&#xff0c;该…

趋动科技携手星辰天合,推出针对人工智能领域的两款联合解决方案

近日&#xff0c;趋动科技与 XSKY星辰天合联合宣布&#xff0c;结合双方优势能力和产品&#xff0c;携手推出高性能数据湖一站式方案及全协议存算一体化方案&#xff0c;帮助客户简化 AI 工作的 IT 基础设施部署&#xff0c;实现 AI 相关工作更加灵活和便捷。 全协议存算一体化…

janus-Gateway的服务端部署

janus-Gateway 需求是前后端的webRTC推拉流&#xff0c;但是后端用的是c&#xff0c;于是使用了这个库做视频流的推送和拉取&#xff0c;记录踩坑过程。 如果你也需要自己部署janus的服务端并在前端拉流测试&#xff0c;希望对你有所帮助。 由于janus的服务器搭建需要linux环境…