当前位置:   article > 正文

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

unstructuredworddocumentloader

知识库读取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 如下:

  1. import os
  2. from langchain.embeddings import OpenAIEmbeddings
  3. from langchain.text_splitter import RecursiveCharacterTextSplitter
  4. from langchain.vectorstores import Chroma
  5. from langchain.document_loaders import TextLoader
  6. from langchain.text_splitter import CharacterTextSplitter
  7. from langchain.document_loaders import DirectoryLoader
  8. from langchain.document_loaders import UnstructuredFileLoader
  9. from langchain.document_loaders import UnstructuredWordDocumentLoader
  10. from docx import Document
  11. def convert_word_tables_to_markdown(file_path, output_folder):
  12. def convert_table_to_markdown(table):
  13. markdown = ""
  14. for row in table.rows:
  15. cells = [cell.text.replace('\n', '').replace('|', '|') for cell in row.cells]
  16. markdown += "|".join(cells) + "|\n"
  17. return markdown
  18. doc = Document(file_path)
  19. # 创建输出文件夹(如果不存在)
  20. os.makedirs(output_folder, exist_ok=True)
  21. # 将每个表格转换为Markdown并保存为单独的TXT文件
  22. for i, table in enumerate(doc.tables):
  23. markdown = convert_table_to_markdown(table)
  24. filename_without_ext=os.path.splitext(os.path.basename(file_path))[0]
  25. # 将Markdown表格写入TXT文件
  26. output_file_path = os.path.join(output_folder, filename_without_ext+f"_output_{i+1}.md")
  27. with open(output_file_path, "w", encoding='utf-8') as file:
  28. file.write(markdown)
  29. return output_folder
  30. def remove_tables_save_as_md(file_path, output_file_path):
  31. doc = Document(file_path)
  32. # 移除所有表格
  33. for table in doc.tables:
  34. table._element.getparent().remove(table._element)
  35. # 获取剩余内容的纯文本,并构建Markdown格式字符串
  36. content = [p.text.strip() for p in doc.paragraphs if p.text.strip()]
  37. markdown_content = '\n\n'.join(content)
  38. # 保存为MD文件
  39. with open(output_file_path, 'w', encoding='utf-8') as file:
  40. file.write(markdown_content)
  41. return output_file_path
  42. abs_docx_path='D:\CloudDisk\OpenAI\博客的源码\Docx表格优化\带表格DOCX.docx'
  43. embedding_folder_path=os.path.dirname(abs_docx_path)+'\\md_txt'
  44. os.makedirs(embedding_folder_path,exist_ok=True)
  45. convert_word_tables_to_markdown(abs_docx_path,embedding_folder_path)
  46. remove_tables_save_as_md(abs_docx_path,embedding_folder_path+'\\'+os.path.basename(abs_docx_path)+'.md')
  47. # 1 定义embedding
  48. embeddings = OpenAIEmbeddings(openai_api_key='aaaaaaaaaaaaaaaaaa',
  49. openai_api_base='bbbbbbbbbbbbbbbbbbbbbbbbbb',
  50. openai_api_type='azure',
  51. model="text-embedding-ada-002",
  52. deployment="lk-text-embedding-ada-002",
  53. chunk_size=1)
  54. # 2 定义文件
  55. loader = DirectoryLoader(embedding_folder_path, glob="**/*.md")
  56. pages = loader.load_and_split()
  57. # 按固定尺寸切分段落
  58. text_splitter_RCTS = RecursiveCharacterTextSplitter(
  59. chunk_size = 500,
  60. chunk_overlap = 100
  61. )
  62. split_docs_RCTS = text_splitter_RCTS.split_documents(pages)
  63. for item in split_docs_RCTS:
  64. print(item)
  65. print('')
  66. #写入向量数据库
  67. print(f'写入RCTS向量数据库')
  68. vectordb = Chroma.from_documents(split_docs_RCTS, embedding=embeddings, persist_directory="./MD_RCTS/")
  69. vectordb.persist()

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

  1. import os
  2. from langchain.embeddings import OpenAIEmbeddings
  3. from langchain.text_splitter import RecursiveCharacterTextSplitter
  4. from langchain.vectorstores import Chroma
  5. from langchain.document_loaders import UnstructuredWordDocumentLoader
  6. # 1 定义embedding
  7. embeddings = OpenAIEmbeddings(openai_api_key='aaaaaaaaaa',
  8. openai_api_base='bbbbbbbbbbb',
  9. openai_api_type='azure',
  10. model="text-embedding-ada-002",
  11. deployment="lk-text-embedding-ada-002",
  12. chunk_size=1)
  13. docx_file_path="D:\CloudDisk\OpenAI\博客的源码\Docx表格优化\带表格DOCX.docx"
  14. # 2 定义文件
  15. loader = UnstructuredWordDocumentLoader(docx_file_path)
  16. pages = loader.load_and_split()
  17. # 按固定尺寸切分段落
  18. text_splitter_RCTS = RecursiveCharacterTextSplitter(
  19. chunk_size = 500,
  20. chunk_overlap = 100
  21. )
  22. split_docs_RCTS = text_splitter_RCTS.split_documents(pages)
  23. for item in split_docs_RCTS:
  24. print(item)
  25. print('')
  26. #写入向量数据库
  27. print(f'写入RCTS向量数据库')
  28. vectordb = Chroma.from_documents(split_docs_RCTS, embedding=embeddings, persist_directory="./Word_RCTS/")
  29. vectordb.persist()

 问答测试 chat_qa.py:

  1. import time
  2. from langchain.embeddings.openai import OpenAIEmbeddings
  3. from langchain.vectorstores import Chroma
  4. from langchain.chains import RetrievalQA
  5. from langchain.chat_models import AzureChatOpenAI
  6. def getQuestionList():
  7. question_list=[
  8. '级数=T6,专业名称是?',
  9. '要求硕士学历有哪些级数?',
  10. '分值大于等于70是哪些级数?',
  11. '可以兼职的是什么级数?',
  12. '需要工作经验满5年以上是哪些专业?',
  13. '首席工程师要求什么学历,工作经验多少年',
  14. '自上而下的原则,是指?',
  15. '现场答辩,是指?',
  16. '级数=T3,专业名称是?',
  17. '级数=T4,专业名称是?',
  18. ]
  19. return question_list
  20. embeddings = OpenAIEmbeddings(openai_api_key='aaaaaaaaaaaaaaaaa',
  21. openai_api_base='bbbbbbbbbbbbbbbbbbbbbbb',
  22. openai_api_type='azure',
  23. model="text-embedding-ada-002",
  24. deployment="lk-text-embedding-ada-002",
  25. chunk_size=1)
  26. openAiLLm = AzureChatOpenAI(openai_api_key='aaaaaaaaaaaaaaaaaaaaaaaaaaaa', #注意这里,不同 API_BASE 使用不同 APK_KEY
  27. openai_api_base="bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
  28. openai_api_version='2023-03-15-preview',
  29. deployment_name='lk-gpt-35-turbo-16k',
  30. temperature=0.9,
  31. model_name="gpt-35-turbo-16k",
  32. max_tokens=300)
  33. print('------r---r---r----')
  34. word_RTCS = Chroma(persist_directory="./Word_RCTS/", embedding_function=embeddings)
  35. word_qa = RetrievalQA.from_chain_type(llm=openAiLLm,chain_type="stuff",retriever=word_RTCS.as_retriever(),return_source_documents = False)
  36. md_RTCS = Chroma(persist_directory="./MD_RCTS/", embedding_function=embeddings)
  37. md_qa = RetrievalQA.from_chain_type(llm=openAiLLm,chain_type="stuff",retriever=md_RTCS.as_retriever(),return_source_documents = False)
  38. #print(qa_RTCS)#查看自定义Prompt的结构体内容
  39. for i in range(0,len(getQuestionList())):
  40. question_text=getQuestionList()[i]
  41. # 进行问答
  42. wordchat = word_qa({"query": question_text})
  43. wordquery = str(wordchat['query'])
  44. wordresult = str(wordchat['result'])
  45. print("问题: ",wordquery)
  46. print("无优化-结果:",wordresult)
  47. time.sleep(1)#每次提问间隔1s
  48. csvchat = md_qa({"query": question_text})
  49. csvquery = str(csvchat['query'])
  50. csvresult = str(csvchat['result'])
  51. #print("MD问题: ",csvquery)
  52. print("有优化-结果:",csvresult)
  53. print('----------------------------------------')
  54. time.sleep(1)#每次提问间隔1s

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/467367
推荐阅读
相关标签
  

闽ICP备14008679号