【AI-Snova】数据提取(Data Extraction)--XLS extraction

写在前面

  • shows examples of text extraction from Excel xls or xlsx files with different packages

    显示了从具有不同包的 Excel xls 或 xlsx 文件中提取文本的示例

主要内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 导入一些环境和路径,配置项目的工作目录、导入依赖库,并为后续处理文件、数据拆分以及环境变量加载做好准备

import os
import sys

current_dir = os.getcwd() # 获取当前工作目录的路径
kit_dir = os.path.abspath(os.path.join(current_dir, "..")) # 向上跳一级目录,获取 kit_dir 的路径
repo_dir = os.path.abspath(os.path.join(kit_dir, "..")) # 在 kit_dir 的基础上再向上跳一级,获取 repo_dir 的路径

# 添加路径到系统路径中
sys.path.append(kit_dir)
sys.path.append(repo_dir)

# 导入依赖库
import glob
import pandas as pd
from dotenv import load_dotenv
from langchain.text_splitter import RecursiveCharacterTextSplitter
from tqdm.autonotebook import trange

加载XLS文件的方法

1
2
3
4
5
6
7
8
9
folder_loc = os.path.join(kit_dir,'data/sample_data/sample_files/')  # 获取文件夹路径
xls_files = list(glob.glob(f'{folder_loc}/*.xls')) # 获取 xls 文件列表
file_path = xls_files[0] # 获取第一个 xls 文件路径


# kit_dir 是一个变量,代表一个文件夹的路径
# glob.glob 函数用于匹配文件名模式,返回匹配的文件列表
# xls_files 是一个列表,包含文件夹中所有 xls 文件的路径
# file_path 是一个变量,代表第一个 xls 文件的路径

加载文本拆分器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 通过使用 RecursiveCharacterTextSplitter 来创建一个文本分割器,它的目的是将大段的文本拆分为更小的片段,同时保留一定的重叠部分,便于处理和分析长文本

text_splitter = RecursiveCharacterTextSplitter(
# Set a small chunk size, just to make splitting evident.
chunk_size = 100,
chunk_overlap = 20,
length_function = len,
add_start_index = True,
separators = ["\n\n\n","\n\n"]
)


# chunk_size 指定每个分割块的大小(即每个块的字符数)
# chunk_overlap 每个分割块之间的重叠字符数
# length_function 指定用于计算文本长度的函数
# add_start_index 指定了是否添加起始索引
# separators 指定用于分割文本的分隔符
# 文本将在以下情况下被分割:
# 当出现三个连续的换行符 (\n\n\n)
# 当出现两个换行符 (\n\n)

从非结构化本地XLSX加载程序加载

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 使用 langchain 库从 Excel 文件中加载文档,并将其分割成单独的文档

from langchain.document_loaders import UnstructuredExcelLoader

# 创建一个 UnstructuredExcelLoader 实例,指定文件路径 file_path 和模式 mode="elements"
# 模式 mode="elements" 表示将 Excel 文件中的每个单元格视为一个文本元素
loader = UnstructuredExcelLoader(file_path, mode="elements")


# 使用 loader 实例加载并分割 Excel 文件中的文档
# text_splitter 是一个用于分割文本的函数,用于将文本分割成单独的文档
docs_unstructured_local = loader.load_and_split(text_splitter = text_splitter)


# 遍历分割后的文档列表,并将每个文档的page_content属性打印到控制台,page_content属性包含文档的内容
for doc in docs_unstructured_local:
print(f'{doc.page_content}\n---')


# langchain: 一个用于文本处理和文档分析的 Python 库。
# UnstructuredExcelLoader: 一个用于从 Excel 文件中加载未结构化文档的类

从非结构化io API加载

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# 使用 UnstructuredAPIFileLoader 类从一个文件中加载数据,并利用 text_splitter 将加载的文本拆分为多个文档片段

# 用于加载非结构化的文件数据
from langchain.document_loaders import UnstructuredAPIFileLoader

# 注释提示需要在 Unstructured.io 注册并获取一个免费的 API 密钥
load_dotenv(os.path.join(repo_dir,'.env'))
# 函数从指定的 .env 文件中加载环境变量。repo_dir 是项目的根目录,.env 文件存储了 API 密钥等敏感信息
# 可以安全地从环境变量中读取 API 密钥和其他配置信息,而不需要在代码中明文保存


# 创建实例
loader = UnstructuredAPIFileLoader(file_path, api_key=os.environ.get('UNSTRUCTURED_API_KEY'),
url=os.environ.get("UNSTRUCTURED_URL"))
# file_path:要加载的文件路径,表示要从哪个文件中读取数据
# api_key:从环境变量中获取的 API 密钥,用于身份验证
# os.environ.get('UNSTRUCTURED_API_KEY') 会查找 .env 文件中定义的 UNSTRUCTURED_API_KEY
# url:API 的 URL 地址,用于指向特定的 API 服务器。os.environ.get("UNSTRUCTURED_URL") 会从环境变量中获取 API 的基础 URL



# 调用 loader.load_and_split() 方法来加载文件内容,并按照指定的 text_splitter 对文本进行拆分
docs_unstructured_api = loader.load_and_split(text_splitter = text_splitter)

# 遍历输出
for doc in docs_unstructured_api:
print(f'{doc.page_content}\n---')

通过嵌入相似性来评估 loded docs

嵌入和存储

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
# 使用 LangChain 和 FAISS 来创建两个不同的向量数据库(vector stores),它们分别用于本地和通过 API 获取的文档

from langchain.embeddings import HuggingFaceInstructEmbeddings
from langchain.vectorstores import FAISS

# 定义嵌入模型参数
encode_kwargs = {'normalize_embeddings': True}
# True表示对嵌入向量进行归一化处理,使所有向量的长度相等,有助于提高相似性搜索的效果


# 初始化 HuggingFaceInstructEmbeddings 模型
embd_model = HuggingFaceInstructEmbeddings( model_name='intfloat/e5-large-v2',
embed_instruction="",
query_instruction="Represent this sentence for searching relevant passages: ",
encode_kwargs=encode_kwargs)
# model_name='intfloat/e5-large-v2': 使用 HuggingFace 的 intfloat/e5-large-v2 模型来将文本转换为嵌入(向量)
# embed_instruction="": 由于 docs_unstructured_local 和 docs_unstructured_api 中的文档(候选段落)不需要特殊指令来进行嵌入表示,所以设置为空字符串
# query_instruction="Represent this sentence for searching relevant passages: ": 这个指令提示模型将查询句子表示为能够找到相关段落的形式
# encode_kwargs=encode_kwargs: 指定了前面定义的编码参数,用于对嵌入结果进行归一化处理


# 创建本地和 API 获取文档的向量数据库
vectorstore_unstructured_local = FAISS.from_documents(documents=docs_unstructured_local, embedding=embd_model)
vectorstore_unstructured_api = FAISS.from_documents(documents=docs_unstructured_api, embedding=embd_model)
# FAISS.from_documents(): 从给定的文档列表创建一个 FAISS 向量数据库

# documents=docs_unstructured_local: 本地未结构化文档的列表,用于创建 vectorstore_unstructured_local 向量数据库

# documents=docs_unstructured_api: 这是从 API 获取的未结构化文档的列表,用于创建 vectorstore_unstructured_api 向量数据库

# embedding=embd_model: 使用前面定义的 HuggingFaceInstructEmbeddings 模型将文档转换为嵌入向量,并存储在 FAISS 数据库中



# langchain.embeddings: 将文本转换为向量的工具,用于构建向量数据库中的数据表示
# FAISS: 快速相似性搜索库,用于高效地存储和检索大规模向量


# 这段代码的主要功能是:
# 用 HuggingFaceInstructEmbeddings 模型将不同来源(本地和 API)的文档转换为向量表示
# 用 FAISS 创建两个独立的向量数据库,用于存储这些嵌入向量,以便之后可以进行高效的相似性搜索

相似性搜索

1
2
3
4
5
6
7
8
9
10
11
12
# 用于在 VectorStore 中执行相似性搜索
# VectorStore 是一个用于存储和检索向量数据的库

query = "How many bits has a double?" # query→要搜索的关键词
ans = vectorstore_unstructured_local.similarity_search(query) # 在本地加载器中执行相似性搜索,返回一个包含匹配结果的列表
print("-------Unstructured local Loader----------\n")
print(ans[0].page_content)


ans_2 = vectorstore_unstructured_api.similarity_search(query) # 在API加载器中执行相似性搜索,返回一个包含匹配结果的列表
print("--------Unstructured api loader------------\n")
print(ans_2[0].page_content)
  • Copyrights © 2024-2025 brocademaple
  • 访问人数: | 浏览次数:

      请我喝杯咖啡吧~

      支付宝
      微信