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

写在前面

  • Kit Description

    Series of notebooks that demonstrate methods for extracting text from documents in different input formats

    从不同输入格式的文档中提取文本的方法

必要工具

必要的Python库

  • Python 3.x
  • Pandas
  • NumPy
  • Scikit-learn
  • BeautifulSoup (用于网页数据提取)
  • requests (用于 HTTP 请求)

数据源

  • CSV 文件
  • JSON 文件
  • 网页
  • API

CSV 文件-- 文本提取

examples of text extraction from csv files with different packages

从具有不同包的 CSV 文件中提取文本的示例

用CSV Loader加载CSV文件

获取CSV文件路径

1
2
3
4
5
6
7
8
9
10
11
# 读取一个目录下所有 CSV 文件的路径,并返回第一个 CSV 文件的路径
folder_loc = os.path.join(kit_dir,'data/sample_data/sample_files/')

csv_files = list(glob.glob(f'{folder_loc}/*.csv')) # csv_files 是一个列表,包含了 folder_loc 目录下所有以 .csv 结尾的文件的路径

file_path = csv_files[0] # 目录下第一个csv文件的路径

# os.path.join() 是一个函数,用于连接目录路径和子目录路径,形成一个完整的目录路径
# glob.glob() 是一个函数,用于匹配文件路径和模式,返回一个列表
# f'{folder_loc}/*.csv' 是一个模式,匹配 folder_loc 目录下所有以 .csv 结尾的文件
#

加载分词器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 定义了一个 RecursiveCharacterTextSplitter 对象,用于分割文本

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

# RecursiveCharacterTextSplitter 是一个类,用于分割文本
# text_splitter 类实例

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

从CSV加载程序加载

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 使用 langchain 库从 CSV 文件中加载文档,并打印每个文档的内容

from langchain.document_loaders.csv_loader import CSVLoader


loader_csv = CSVLoader(file_path=file_path, encoding="utf-8", csv_args={'delimiter': ','})
# 创建一个 CSVLoader 实例,指定参数:
# file_path: CSV 文件的路径
# encoding: 文件编码(UTF-8)
# csv_args: CSV 文件的参数,包括分隔符(,)

docs_csv = loader_csv.load() # 使用 load() 方法从 CSV 文件中加载文档,返回一个文档列表
for doc in docs_csv:
print(f'{doc.page_content}\n')
# 遍历文档列表,打印每个文档的内容(page_content 属性)


# langchain 一个用于文档处理和链式操作的 Python 库
# langchain.document_loaders.csv_loader: 用于从 CSV 文件中加载文档
#

具有自定义字段名称的 CSV 加载器

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
# 使用 langchain 库从 CSV 文件中加载文档,并打印每个文档的内容

loader_csv = CSVLoader(
file_path=file_path,
csv_args={
"delimiter": ",",
"quotechar": '"',
"fieldnames": fieldnames
}
)

# 创建一个 CSVLoader 实例 loader_csv ,指定以下参数:
# file_path: CSV 文件的路径
# csv_args: CSV 文件的参数,包括:
# delimiter: 分隔符(,)
# quotechar: 引用符(")
# fieldnames: CSV 文件的列名(fieldnames 变量)


docs_csv = loader_csv.load_and_split(text_splitter = text_splitter) # 使用 load_and_split() 方法从 CSV 文件中加载文档,并将文档分割成单独的文本块
# text_splitter 参数 用于分割文本块

for doc in docs_csv:
print(f'{doc.page_content}\n')
# 遍历打印文档内容

使用pandas加载CSV文件

Pandas 是一个用于数据分析和数据处理的 Python 库

提供了高效的、易于使用的数据结构,特别适合处理结构化数据(如表格数据)

  • 此方法只能选择1 列来构建 embedding
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 从 CSV 文件中加载数据,并使用 LangChain 库生成文本嵌入

from langchain.document_loaders import DataFrameLoader
import pandas as pd

# 读取 CSV 文件
df = pd.read_csv('data.csv')

# 创建 DataFrameLoader 实例
loader_pandas = DataFrameLoader(df, page_content_column="Company")

# 加载文档
docs_pandas = loader_pandas.load()

# 打印文档内容
for doc in docs_pandas:
print(f'{doc.page_content}\n')

# langchain: 一个用于自然语言处理的 Python 库
# pandas: 一个用于数据分析的 Python 库
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
# 来自snova的拓展代码:使用 LangChain 生成文本嵌入

from langchain import LLM
from langchain.document_loaders import DataFrameLoader
import pandas as pd

# 读取 CSV 文件
df = pd.read_csv('data.csv')

# 创建 DataFrameLoader 实例
loader_pandas = DataFrameLoader(df, page_content_column="Company")

# 加载文档
docs_pandas = loader_pandas.load()

# 创建 LLM 实例
llm = LLM('text-davinci-003')

# 生成文本嵌入
embeddings = llm.embed_documents(docs_pandas)

# 打印文本嵌入
for doc, embedding in zip(docs_pandas, embeddings):
print(f'{doc.page_content}\n{embedding}\n')

  • Pandas的核心数据结构:

    • Series

      • 类似于一维数组的结构,可以存储各种数据类型
      • 每个数据都有一个关联的标签(索引)
    • DataFrame

      • 类似于电子表格的二维表格结构,包含行和列

        每列可以存储不同的数据类型,非常适合存储和操作多维数据集

  • Pandas的主要功能:

    • 数据导入和导出:支持从 CSVExcelSQL数据库、JSON等多种文件格式中读取和保存数据
    • 数据清洗和预处理:提供方便的工具进行数据筛选、缺失值处理、数据转换等
    • 数据操作:支持数据过滤、分组、聚合、合并、排序等复杂操作
    • 时间序列分析:内置了处理时间序列数据的功能,适合处理金融数据等领域的时间序列任务
    • 数据可视化:虽然 Pandas 不是专门的可视化库,但可以结合 matplotlibseaborn 等库进行简单的可视化操作

使用Unstructed.io加载CSV文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
from langchain.document_loaders import UnstructuredAPIFileLoader   # 导入 Unstructured API 文件加载器

# 注册 Unstructured.io 并获取免费 API Key
load_dotenv(os.path.join(repo_dir,'.env')) # 使用 load_dotenv 函数从 .env 文件中加载环境变量


# 实例化 Unstructured API 文件加载器
loader_unestructured = UnstructuredAPIFileLoader(file_path, mode="elements", api_key=os.environ.get("UNSTRUCTURED_API_KEY"),
url=os.environ.get("UNSTRUCTURED_URL")) #
# 实例化 UnstructuredAPIFileLoader 类,传入以下参数:
# file_path: 文件路径。
# mode: 模式,设置为 "elements"。
# api_key: Unstructured.io API Key,通过环境变量 UNSTRUCTURED_API_KEY 获取。
# url: Unstructured.io API URL,通过环境变量 UNSTRUCTURED_URL 获取



# 加载和分割文档
docs_unstructured = loader_unestructured.load_and_split(text_splitter)


# 遍历列表中的每个文档,打印每个文档的内容
for doc in docs_unstructured:
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
# 创建一个向量存储库(FAISS)来存储和查询文档的嵌入向量

# 导入 Hugging Face 指令嵌入和 FAISS 向量存储
from langchain.embeddings import HuggingFaceInstructEmbeddings
from langchain.vectorstores import FAISS

# 配置嵌入参数 encode_kwargs,用于控制嵌入过程
# normalize_embeddings 参数设置为 True,表示嵌入后将对向量进行归一化
encode_kwargs = {'normalize_embeddings': True}


# 实例化 Hugging Face 指令嵌入
embd_model = HuggingFaceInstructEmbeddings( model_name='intfloat/e5-large-v2',
embed_instruction="", # no instructions needed for candidate passages
query_instruction="Represent this sentence for searching relevant passages: ",
encode_kwargs=encode_kwargs)
# 实例化 HuggingFaceInstructEmbeddings 类,传入以下参数:
# model_name: 嵌入模型名称,设置为 'intfloat/e5-large-v2'
# embed_instruction: 嵌入指令,设置为空字符串(表示不需要指令)
# query_instruction: 查询指令,设置为 "Represent this sentence for searching relevant passages: "
# encode_kwargs: 嵌入参数,设置为 encode_kwargs


# 创建 FAISS 向量存储
vectorstore_csv = FAISS.from_documents(documents=docs_csv, embedding=embd_model)
vectorstore_pandas = FAISS.from_documents(documents=docs_pandas, embedding=embd_model)
vectorstore_unstructured = FAISS.from_documents(documents=docs_unstructured, embedding=embd_model)
# docs_csv、docs_pandas 和 docs_unstructured 是文档列表,分别对应不同的文档来源


文档嵌入:使用 Hugging Face 指令嵌入模型(HuggingFaceInstructEmbeddings)对文档进行嵌入,生成嵌入向量

向量存储库创建:使用 FAISS 类(FAISS)创建一个向量存储库,用于存储和查询嵌入向量

文档向量存储:将嵌入向量存储到 FAISS 向量存储库中


# FAISS 是一种高效的向量存储库,用于存储和查询嵌入向量

相似度搜索

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
query = "What is the information about customer with first name Preston?"
ans = vectorstore_csv.similarity_search(query)
print("-------CSV Loader----------\n")
print(ans[0].page_content)


ans_2 = vectorstore_pandas.similarity_search(query)
print("--------Pandas------------\n")
print(ans_2[0].page_content)


ans_3 = vectorstore_unstructured.similarity_search(query)
print("--------Unstructured------------\n")
print(ans_3[0].page_content)


# 定义查询语句:定义一个查询语句 "What is the information about customer with first name Preston?"。

# 相似度搜索:使用 FAISS 向量存储库对三个文本数据源(CSV、Pandas 和 Unstructured)进行相似度搜索,得到相似度最高的文档。

# 打印结果:打印每个数据源中相似度最高的文档的内容。
  • Copyrights © 2024-2025 brocademaple
  • 访问人数: | 浏览次数:

      请我喝杯咖啡吧~

      支付宝
      微信