知識庫讀取Word內(nèi)容時,由于embedding切片操作,可能會出現(xiàn)表格被分割成多個切片的情況。這種切片方式可能導致“列名欄”和“內(nèi)容欄”之間的Y軸關系鏈斷裂,從而無法準確地確定每一列的數(shù)據(jù)對應關系,從而使得無法準確知道每一列的數(shù)據(jù)匯總。
用下面表格為例子:
級數(shù) |
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 |
專業(yè)名稱 |
實習 工程師 |
助理 工程師 |
工程師 |
高級 工程師 |
資深 工程師 |
專家級 工程師 |
首席 工程師 |
學歷 |
本科及以上 |
本科及以上 |
本科及以上 |
本科及以上 |
本科及以上 |
碩士及以上 |
碩士及以上 |
工作經(jīng)驗 |
1年以內(nèi)(兼職) |
1-3年 |
3-5年 |
5-8年 |
8-10年 |
10-15年 |
15年以上 |
級數(shù) |
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 |
專業(yè)名稱 |
實習 工程師 |
助理 工程師 |
工程師 |
高級 工程師 |
資深 工程師 |
專家級 工程師 |
首席 工程師 |
分值 |
60-64分 |
65-69分 |
70-79分 |
80-89分 |
90-94分 |
95-97分 |
98-100分 |
直接演示一下本文代碼運行的對比結果,分別展示“無優(yōu)化”和“有優(yōu)化”的問答結果,標綠框的是回答錯誤的:
本文幫助提高文本處理和向量化的效率,以下是對每個步驟的詳細說明,詳見md_embedding.py源碼:
- 分離文字和表格:將原始Word文檔中的文字內(nèi)容和表格分開保存。將文字內(nèi)容保存為純文本的Markdown文件,而將表格單獨保存為多個只包含Markdown表格的Markdown文件。例如,一個Word文檔包含2個表格,即生成1個純文字Markdown文件,2個純表格的Markdown文件。
- 切片并向量化處理:對于多個Markdown文件,按照固定的大小切片,確保切片大小是大于Markdown表格的體積,以確保包含完整的表格。然后對這些切片進行向量化處理。
這種方法的優(yōu)點是能夠有效地分離文字和表格,并通過切片和向量化處理提高處理效率。通過將表格轉化為向量表示,可以更方便地進行后續(xù)的計算和分析。同時,由于切片時保證了表格的完整性,可以避免表格被切斷導致信息丟失的問題。
有優(yōu)化的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 UnstructuredWordDocumentLoader
from docx import Document
def 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 markdown
doc = Document(file_path)
# 創(chuàng)建輸出文件夾(如果不存在)
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_folder
def 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)
# 獲取剩余內(nèi)容的純文本,并構建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_path
abs_docx_path='D:\CloudDisk\OpenAI\博客的源碼\Docx表格優(yōu)化\帶表格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('')
#寫入向量數(shù)據(jù)庫
print(f'寫入RCTS向量數(shù)據(jù)庫')
vectordb = Chroma.from_documents(split_docs_RCTS, embedding=embeddings, persist_directory="./MD_RCTS/")
vectordb.persist()
?無優(yōu)化的embedding的源碼,docx_embedding.py 如下:文章來源:http://www.zghlxwxcb.cn/news/detail-612333.html
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表格優(yōu)化\帶表格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('')
#寫入向量數(shù)據(jù)庫
print(f'寫入RCTS向量數(shù)據(jù)庫')
vectordb = Chroma.from_documents(split_docs_RCTS, embedding=embeddings, persist_directory="./Word_RCTS/")
vectordb.persist()
?問答測試?chat_qa.py:文章來源地址http://www.zghlxwxcb.cn/news/detail-612333.html
import time
from langchain.embeddings.openai import OpenAIEmbeddings
from langchain.vectorstores import Chroma
from langchain.chains import RetrievalQA
from langchain.chat_models import AzureChatOpenAI
def getQuestionList():
question_list=[
'級數(shù)=T6,專業(yè)名稱是?',
'要求碩士學歷有哪些級數(shù)?',
'分值大于等于70是哪些級數(shù)?',
'可以兼職的是什么級數(shù)?',
'需要工作經(jīng)驗滿5年以上是哪些專業(yè)?',
'首席工程師要求什么學歷,工作經(jīng)驗多少年',
'自上而下的原則,是指?',
'現(xiàn)場答辯,是指?',
'級數(shù)=T3,專業(yè)名稱是?',
'級數(shù)=T4,專業(yè)名稱是?',
]
return question_list
embeddings = 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_KEY
openai_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的結構體內(nèi)容
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("無優(yōu)化-結果:",wordresult)
time.sleep(1)#每次提問間隔1s
csvchat = md_qa({"query": question_text})
csvquery = str(csvchat['query'])
csvresult = str(csvchat['result'])
#print("MD問題: ",csvquery)
print("有優(yōu)化-結果:",csvresult)
print('----------------------------------------')
time.sleep(1)#每次提問間隔1s
到了這里,關于ChatGPT | 分割Word文字及表格,優(yōu)化文本分析的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!