5.2.3 CSV加载器(CSVLoader)
CSV文件是一种以逗号分隔值的文本文件,每一行都是一个数据记录,每个记录由一个或多个字段组成,字段之间由逗号分隔。在LangChain中,CSV加载器(CSVLoader)是用于从CSV文件中加载数据并将其转换为文档对象的组件。
1. 加载CSV数据
CSV加载器允许用户指定CSV文件的路径,然后加载文件并将其内容解析为文档对象。用户可以使用CSV加载器的默认设置,也可以根据需要自定义解析器参数,如指定分隔符、引号字符和字段名等。例如文件mlb_teams_2012.csv中的主要内容如下所示,这个CSV文件的每一行代表一个MLB队伍的记录,其中包含三个字段:队伍名称(Team)、球员薪资(以百万美元计,Payroll (millions)),以及胜场数(Wins)。这些数据可以用于各种统计分析,例如分析薪资和胜场之间的关系,或者评估各个队伍的经济效益等。
Team,Payroll (millions),Wins
Nationals,81.34,98
Reds,82.20,97
Yankees,197.96,95
Giants,117.62,94
Braves,83.31,94
Athletics,55.37,94
Rangers,120.51,93
Orioles,81.43,93
Rays,64.17,90
Angels,154.49,89
Tigers,132.30,88
Cardinals,110.30,88
Dodgers,95.14,86
White Sox,96.92,85
Brewers,97.65,83
Phillies,174.54,81
Diamondbacks,74.28,81
Pirates,63.43,79
Padres,55.24,76
Mariners,81.97,75
Mets,93.35,74
Blue Jays,75.48,73
Royals,60.91,72
Marlins,118.07,69
Red Sox,173.18,69
Indians,78.43,68
Twins,94.08,66
Rockies,78.06,64
Cubs,88.19,61
Astros,60.65,55
下面的代码将加载文件mlb_teams_2012.csv,并将每一行数据作为一个单独的文档(Document)对象。
from langchain_community.document_loaders.csv_loader import CSVLoader
loader = CSVLoader(file_path='./example_data/mlb_teams_2012.csv')
data = loader.load()
print(data)
执行后会输出:
[Document(page_content='Team: Nationals\nPayroll (millions): 81.34\nWins: 98', metadata={'source': 'mlb_teams_2012.csv', 'row': 0}), Document(page_content='Team: Reds\nPayroll (millions): 82.20\nWins: 97', metadata={'source': 'mlb_teams_2012.csv', 'row': 1}), Document(page_content='Team: Yankees\nPayroll (millions): 197.96\nWins: 95', metadata={'source': 'mlb_teams_2012.csv', 'row': 2}), Document(page_content='Team: Giants\nPayroll (millions): 117.62\nWins: 94', metadata={'source': 'mlb_teams_2012.csv', 'row': 3}), Document(page_content='Team: Braves\nPayroll (millions): 83.31\nWins: 94', metadata={'source': 'mlb_teams_2012.csv', 'row': 4}), Document(page_content='Team: Athletics\nPayroll (millions): 55.37\nWins: 94', metadata={'source': 'mlb_teams_2012.csv', 'row': 5}), Document(page_content='Team: Rangers\nPayroll (millions): 120.51\nWins: 93', metadata={'source': 'mlb_teams_2012.csv', 'row': 6}), Document(page_content='Team: Orioles\nPayroll (millions): 81.43\nWins: 93', metadata={'source': 'mlb_teams_2012.csv', 'row': 7}), Document(page_content='Team: Rays\nPayroll (millions): 64.17\nWins: 90', metadata={'source': 'mlb_teams_2012.csv', 'row': 8}), Document(page_content='Team: Angels\nPayroll (millions): 154.49\nWins: 89', metadata={'source': 'mlb_teams_2012.csv', 'row': 9}), Document(page_content='Team: Tigers\nPayroll (millions): 132.30\nWins: 88', metadata={'source': 'mlb_teams_2012.csv', 'row': 10}), Document(page_content='Team: Cardinals\nPayroll (millions): 110.30\nWins: 88', metadata={'source': 'mlb_teams_2012.csv', 'row': 11}), Document(page_content='Team: Dodgers\nPayroll (millions): 95.14\nWins: 86', metadata={'source': 'mlb_teams_2012.csv', 'row': 12}), Document(page_content='Team: White Sox\nPayroll (millions): 96.92\nWins: 85', metadata={'source': 'mlb_teams_2012.csv', 'row': 13}), Document(page_content='Team: Brewers\nPayroll (millions): 97.65\nWins: 83', metadata={'source': 'mlb_teams_2012.csv', 'row': 14}), Document(page_content='Team: Phillies\nPayroll (millions): 174.54\nWins: 81', metadata={'source': 'mlb_teams_2012.csv', 'row': 15}), Document(page_content='Team: Diamondbacks\nPayroll (millions): 74.28\nWins: 81', metadata={'source': 'mlb_teams_2012.csv', 'row': 16}), Document(page_content='Team: Pirates\nPayroll (millions): 63.43\nWins: 79', metadata={'source': 'mlb_teams_2012.csv', 'row': 17}), Document(page_content='Team: Padres\nPayroll (millions): 55.24\nWins: 76', metadata={'source': 'mlb_teams_2012.csv', 'row': 18}), Document(page_content='Team: Mariners\nPayroll (millions): 81.97\nWins: 75', metadata={'source': 'mlb_teams_2012.csv', 'row': 19}), Document(page_content='Team: Mets\nPayroll (millions): 93.35\nWins: 74', metadata={'source': 'mlb_teams_2012.csv', 'row': 20}), Document(page_content='Team: Blue Jays\nPayroll (millions): 75.48\nWins: 73', metadata={'source': 'mlb_teams_2012.csv', 'row': 21}), Document(page_content='Team: Royals\nPayroll (millions): 60.91\nWins: 72', metadata={'source': 'mlb_teams_2012.csv', 'row': 22}), Document(page_content='Team: Marlins\nPayroll (millions): 118.07\nWins: 69', metadata={'source': 'mlb_teams_2012.csv', 'row': 23}), Document(page_content='Team: Red Sox\nPayroll (millions): 173.18\nWins: 69', metadata={'source': 'mlb_teams_2012.csv', 'row': 24}), Document(page_content='Team: Indians\nPayroll (millions): 78.43\nWins: 68', metadata={'source': 'mlb_teams_2012.csv', 'row': 25}), Document(page_content='Team: Twins\nPayroll (millions): 94.08\nWins: 66', metadata={'source': 'mlb_teams_2012.csv', 'row': 26}), Document(page_content='Team: Rockies\nPayroll (millions): 78.06\nWins: 64', metadata={'source': 'mlb_teams_2012.csv', 'row': 27}), Document(page_content='Team: Cubs\nPayroll (millions): 88.19\nWins: 61', metadata={'source': 'mlb_teams_2012.csv', 'row': 28}), Document(page_content='Team: Astros\nPayroll (millions): 60.65\nWins: 55', metadata={'source': 'mlb_teams_2012.csv', 'row': 29})]
2. 自定义CSV解析和加载
CSV加载器支持自定义参数,以适应不同格式的CSV文件。例如,可以指定不同的分隔符、引用字符或字段名。例如在下面的代码中,使用自定义参数来指定CSV文件的字段名,从而改变生成的文档对象的内容和结构。
loader = CSVLoader(file_path='mlb_teams_2012.csv', csv_args={
'delimiter': ',',
'quotechar': '"',
'fieldnames': ['MLB Team', 'Payroll in millions', 'Wins']
})
data = loader.load()
print(data)
3. 指定列作为文档来源
在使用CSV文件加载的文档进行问题回答时,可以通过参数source_column指定某一列作为文档的来源。例如在下面的代码中,将每行的“Team”列值作为文档的来源,而不是使用文件路径。
loader = CSVLoader(file_path='mlb_teams_2012.csv', source_column="Team")
data = loader.load()
print(data)
通过上面介绍可知,LangChain中的CSV加载器提供了灵活的方式来加载和解析CSV文件数据。开发者可以根据实际需求自定义解析过程,并将每行数据转换为LangChain可以处理的文档对象。这些文档对象可以用于进一步的数据分析、文本处理或其他应用程序。
5.2.4 目录加载器(DirectoryLoader)
在LangChain中,目录加载器(DirectoryLoader)是一个强大的工具,用于从文件系统中加载文档。DirectoryLoader可以递归地遍历目录,并加载目录中的所有文件。每个文件都会被加载成一个Blob对象,可以进一步由解析器进行处理。
具体来说,DirectoryLoader的核心功能如下所示。
- 文件匹配:通过glob参数,DirectoryLoader可以匹配指定模式的文件,例如"**/*.md"将匹配所有Markdown文件。
- 进度显示:通过show_progress参数,可以在加载过程中显示进度条,便于跟踪加载进度。
- 多线程加载:使用use_multithreading参数,DirectoryLoader可以利用多线程并发加载文件,提高处理速度。
- 自定义加载器:可以通过loader_cls参数指定不同的加载器类,以适应不同类型的文件,如文本文件(TextLoader)或Python源代码文件(PythonLoader)。
- 编码自动检测:对于TextLoader,可以通过autodetect_encoding参数让加载器自动检测文件编码,避免因编码问题导致的加载失败。
请看下面的例子,功能是使用LangChain的目录加载器(DirectoryLoader)来加载一个目录下所有的.txt文件,并将它们打印出来。
实例5-1:用DirectoryLoader加载一个目录下所有的.txt文件(源码路径:codes\5\mulu.py)
实例文件mulu.py的具体实现代码如下所示。
from langchain_community.document_loaders import DirectoryLoader
import os
# 假设我们有一个包含文本文件的目录,我们将从这个目录加载所有.txt文件
directory_path = 'path/to/your/directory' # 替换为你的目录路径
# 定义文件匹配模式,这里我们只加载.txt文件
file_pattern = '**/*.txt'
# 创建DirectoryLoader实例
loader = DirectoryLoader(directory_path, glob=file_pattern)
# 调用load方法加载文档
docs = loader.load()
# 遍历所有加载的文档
for doc in docs:
# 打印文档的内容
print(f"Content of {doc.metadata['source']}:")
print(doc.page_content)
# 打印文档的元数据,例如文件大小
print(f"Metadata for {doc.metadata['source']}:")
for key, value in doc.metadata.items():
print(f" {key}: {value}")
# 打印分隔线,以便区分不同文档的输出
print('---' * 40)
在上述代码中,首先导入了DirectoryLoader。然后,指定了要加载文件的目录路径和文件匹配模式。使用DirectoryLoader创建了一个加载器实例,并通过调用load方法加载了所有匹配的文档。接着,遍历了所有加载的文档,并打印了每个文档的内容和元数据。请注意,在运行时需要将directory_path替换为你的实际目录路径,该目录应该包含你想要加载的.txt文件。此外,确保你有权限访问指定的目录和文件。
执行上述代码后,会输出每个匹配的文本文件的内容和元数据。具体的输出格式如下:
- 文件内容:每个文件的文本内容将被打印出来。
- 文件元数据:每个文件的相关元数据将被列出,通常包括文件的路径(source)、大小(size)等信息。
- 分隔线:为了区分不同文件的输出,每个文件的输出之间将有一个分隔线。
5.2.5 HTML加载器
HTML(超文本标记语言)是用于设计在网页浏览器中显示的文档的标准标记语言,它允许开发者通过一系列标记和属性来定义网页的结构和内容。
1. 使用UnstructuredHTMLLoader
在LangChain框架中,可以使用UnstructuredHTMLLoader加载HTML文档,并将其转换为我们可以在后续流程中使用的文档格式。UnstructuredHTMLLoader的主要作用是将 HTML 文件加载为文档对象,而不对 HTML 的结构进行解析或处理。这意味着 HTML 文件中的所有标记和格式都将被保留,并作为原始文本内容存储在文档对象的 page_content 属性中。
通过使用 UnstructuredHTMLLoader,可以快速地将 HTML 文件的内容导入到 LangChain 系统中,这适用于那些不需要对 HTML 内容进行结构化解析的场景。例如,如果只需要读取 HTML 文件中的文本数据,而不需要关心其布局或样式信息,那么这个加载器将是一个非常合适的选择。
设你有一个名为 fake-content.html 的HTML文件,它的内容如下所示:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Sample HTML Document</title>
</head>
<body>
<h1>My First Heading</h1>
<p>This is my first paragraph. It contains some <strong>important</strong> text that is <em>formatted</em> in different ways.</p>
<ul>
<li>List item 1</li>
<li>List item 2</li>
<li>List item 3</li>
</ul>
<p>If you <a href="https://example.com">click here</a>, you will be redirected to another website.</p>
</body>
</html>
请看下面的例子,演示了使用UnstructuredHTMLLoader加载上述文件fake-content.html的过程。
实例5-1:使用UnstructuredHTMLLoader加载HTML文件(源码路径:codes\5\ht.py)
实例文件ht.py的具体实现代码如下所示。
from langchain_community.document_loaders import UnstructuredHTMLLoader
# 指定 HTML 文件的路径
html_file_path = "example_data/fake-content.html"
# 创建 UnstructuredHTMLLoader 实例
loader = UnstructuredHTMLLoader(html_file_path)
# 加载文档
documents = loader.load()
# 输出加载的文档对象
for document in documents:
print(document.page_content) # 打印文档的原始 HTML 内容
print(document.metadata) # 打印文档的元数据信息,如文件路径等
在上述代码中,首先创建了一个加载器实例,并传入了 HTML 文件的路径。在调用 load 方法后,得到了一个包含文档对象的列表。每个文档对象都包含了 HTML 文件的原始内容和一些元数据信息,如文件的来源路径。执行后会输出:
My First Heading
My first paragraph. It contains some <strong>important</strong> text that is <em>formatted</em> in different ways.
List item 1
List item 2
List item 3
If you <a href="https://example.com">click here</a>, you will be redirected to another website.
注意:UnstructuredHTMLLoader 只是简单地将 HTML 内容作为字符串读取,不会提取或解析任何 HTML 元素或属性。如果你需要对 HTML 内容进行更复杂的处理,比如提取文本、解析表格或提取链接等,可能需要使用其他更高级的加载器,如 BSHTMLLoader,它使用 BeautifulSoup 库来解析和处理 HTML 文档。
2. 使用FireCrawlLoader
FireCrawlLoader是 LangChain 框架中的一个特殊加载器,它利用 FireCrawl 服务来爬取和转换网站内容为 Markdown 格式或其他指定格式。FireCrawl 是一种强大的网页爬虫工具,可以处理各种复杂的网页内容,包括那些通过反向代理、缓存、速率限制和 JavaScript 动态加载的内容。
FireCrawlLoader加载器特别适合于需要从网页中提取信息并将其转换为易于处理格式的场景,通过使用 FireCrawlLoader,开发者可以将任何网站的内容转换为结构化的文档,这些文档可以用于进一步的文本分析、数据提取或其他 NLP 任务。
在使用FireCrawlLoader之前,需要先拥有一个FireCrawl API密钥,这需要在FireCrawl网站上注册来获取一个API密钥。请看下面的代码,首先从 langchain_community.document_loaders 模块导入 FireCrawlLoader。然后,准备了 FireCrawl API 密钥和目标网站的 URL,并创建了 FireCrawlLoader 的实例。然后,通过调用 load 方法加载了目标网站的内容,并遍历了返回的文档对象,最终打印输出每个文档的 Markdown 内容和元数据信息。
from langchain_community.document_loaders import FireCrawlLoader
# 你的 FireCrawl API 密钥
api_key = "YOUR_FIRECRAWL_API_KEY"
# 目标网站的 URL
url = "https://example.com"
# 创建 FireCrawlLoader 实例
loader = FireCrawlLoader(api_key=api_key, url=url, mode="crawl")
# 加载文档
data = loader.load()
# 输出加载的数据
for document in data:
print(document.page_content) # 打印文档的 Markdown 内容
print(document.metadata) # 打印文档的元数据信息
3. 使用AzureAIDocumentIntelligenceLoader
AzureAIDocumentIntelligenceLoader 是 LangChain 框架中的一个加载器类,能够利用微软的 Azure AI Document Intelligence(以前称为 Azure 表单识别器)服务来处理和提取文件内容。这项服务基于机器学习,能够从多种格式的文件中提取文本、表格、文档结构(例如标题、小节标题等)以及键值对。支持的文件格式包括 PDF、JPEG/JPG、PNG、BMP、TIFF、HEIF、DOCX、XLSX、PPTX 和 HTML。
AzureAIDocumentIntelligenceLoader 特别适用于需要从结构化或半结构化文档中提取信息的场景,例如可以自动从合同、发票、报告或其他官方文档中提取关键数据,并将这些数据转换为可进一步处理的格式。
要使用 AzureAIDocumentIntelligenceLoader,需要拥有一个 Azure AI Document Intelligence 资源,并且需要在三个预览区域之一(东美国、西美国2、西欧)中创建该资源。另外,还需要一个 API 密钥和终端节点 URL 来访问该服务。例如下面是一个使用 AzureAIDocumentIntelligenceLoader 的例子。
from langchain_community.document_loaders import AzureAIDocumentIntelligenceLoader
# 你的 Azure AI Document Intelligence API 密钥和终端节点 URL
endpoint = "<your-azure-endpoint>"
key = "<your-azure-key>"
# 文件路径(可以是本地路径或 URL)
file_path = "path/to/your/document.pdf"
# 创建 AzureAIDocumentIntelligenceLoader 实例
loader = AzureAIDocumentIntelligenceLoader(
api_endpoint=endpoint,
api_key=key,
file_path=file_path,
api_model="prebuilt-layout"
)
# 加载文档
documents = loader.load()
# 输出加载的文档
for document in documents:
print(document.page_content) # 打印文档的内容
print(document.metadata) # 打印文档的元数据信息
在上述代码中,首先从 langchain_community.document_loaders 模块导入 了AzureAIDocumentIntelligenceLoader。然后,提供了 Azure AI Document Intelligence 的终端节点 URL、API 密钥和要处理的文件路径,并创建了 AzureAIDocumentIntelligenceLoader 的实例。通过调用 load 方法,加载了文件并输出了每个文档的内容和元数据信息。
未完待续
马上假期了,来福利: