5.3.7 JSON文本分割器
在LangChain中,JSON文本分割器RecursiveJsonSplitter用于递归地将大型JSON文档分割成较小的片段。RecursiveJsonSplitter能够根据指定的最小块大小和最大块大小来拆分JSON文档,并尽可能保持嵌套的JSON对象完整。
LangChain中JSON文本分割器的主要特点如下所示:
- 递归分割:分割器采用深度优先遍历方式递归地遍历JSON数据,并根据指定的条件进行分割。这意味着它会尝试保持嵌套的JSON对象完整,但如果需要保持块的大小在最小和最大块大小之间,则可能会对它们进行拆分。
- 最小和最大块大小:用户可以指定分割后的块的最小和最大大小。如果块的大小超出了指定范围,分割器会对其进行拆分,以确保块的大小在合适的范围内。
- 处理列表:在默认情况下,分割器不会直接拆分列表,而是保留它们的完整性。但是,用户可以选择将列表预处理为字典,并在拆分过程中将其转换回JSON格式。
- 输出格式:分割器可以产生多种输出格式,包括JSON字符串、文档列表等。用户可以根据需要选择合适的输出格式。
- 拆分方法:可以通过调用split_json()方法来分割JSON数据,并获得拆分后的结果。此外,用户还可以选择使用split_text()方法来获取拆分后的JSON文本字符串列表。
请看下面的实例,演示了使用JSON 文本分割器递归地拆分JSON数据的过程。
实例5-1:使用JSON 文本分割器拆分JSON数据(源码路径:codes\5\fen09.py)
实例文件fen09.py的具体实现代码如下所示。
import json
import requests
from langchain_text_splitters import RecursiveJsonSplitter # 导入 JSON 文本分割器
json_data = requests.get("https://api.smith.langchain.com/openapi.json").json() # 从 API 获取 JSON 数据
splitter = RecursiveJsonSplitter(max_chunk_size=300) # 创建 JSON 文本分割器实例
json_chunks = splitter.split_json(json_data=json_data) # 递归地分割 JSON 数据
docs = splitter.create_documents(texts=[json_data]) # 也可以创建文档
texts = splitter.split_text(json_data=json_data) # 或者创建字符串列表
print(texts[0]) # 打印结果的前两个片段
print(texts[1])
print([len(text) for text in texts][:10]) # 打印分割后的片段大小
print(texts[1]) # 打印一个较大的片段
texts = splitter.split_text(json_data=json_data, convert_lists=True) # 启用列表转换,预处理 JSON 中的列表
print([len(text) for text in texts][:10]) # 打印列表转换后的结果
print(texts[1]) # 打印转换后的较大片段
print(docs[1]) # 也可以查看文档
上述代码的实现流程如下所示:
- 导入所需的库,包括 json 用于处理 JSON 数据,requests 用于从 API 获取 JSON 数据,以及 LangChain 中的 RecursiveJsonSplitter 用于拆分 JSON 文本。
- 使用 requests.get()方法从指定的 API 获取 JSON 数据,并将其转换为 Python 字典格式。
- 创建 RecursiveJsonSplitter的实例,并设置最大的分割片段大小为 300。
- 使用创建的JSON分割器实例对JSON数据进行递归分割,得到分割后的 JSON 片段。也可以选择将分割后的结果创建为文档对象或者作为字符串列表。
- 最后,打印输出分割后的结果,包括前两个片段的内容以及它们的大小,以及转换列表后的结果。执行后会输出:
{"openapi": "3.1.0", "info": {"title": "LangSmith", "version": "0.1.0"}, "servers": [{"url": "https://api.smith.langchain.com", "description": "LangSmith API endpoint."}]}
{"paths": {"/api/v1/sessions/{session_id}": {"get": {"tags": ["tracer-sessions"], "summary": "Read Tracer Session", "description": "Get a specific session.", "operationId": "read_tracer_session_api_v1_sessions__session_id__get"}}}}
[171, 231, 126, 469, 210, 213, 237, 271, 191, 232]
{"paths": {"/api/v1/sessions/{session_id}": {"get": {"tags": ["tracer-sessions"], "summary": "Read Tracer Session", "description": "Get a specific session.", "operationId": "read_tracer_session_api_v1_sessions__session_id__get"}}}}
[171, 231, 126, 469, 210, 213, 237, 271, 191, 232]
{"paths": {"/api/v1/sessions/{session_id}": {"get": {"tags": ["tracer-sessions"], "summary": "Read Tracer Session", "description": "Get a specific session.", "operationId": "read_tracer_session_api_v1_sessions__session_id__get"}}}}
page_content='{"paths": {"/api/v1/sessions/{session_id}": {"get": {"tags": ["tracer-sessions"], "summary": "Read Tracer Session", "description": "Get a specific session.", "operationId": "read_tracer_session_api_v1_sessions__session_id__get"}}}}'
5.3.8 语义相似性分割器
在LangChain中,语义相似性分割器(Semantic Chunker)是一种文本分块工具,能够根据文本中句子之间的语义相似性将文本分割成块。语义相似性分割器的工作原理是使用嵌入模型来计算句子之间的语义相似性,并根据预定义的阈值将文本分割成多个语义相关的块。
假设有一篇长文本,需要将其分割成语义相关的块,以便更好地理解和处理。此时可以使用LangChain的语义相似性分割器来完成这个任务,下面的实例演示了这一用法。
实例5-1:使用语义相似性分割器分割文本(源码路径:codes\5\fen10.py)
实例文件fen10.py的具体实现代码如下所示。
# 导入所需的库和模块
from langchain_experimental.text_splitter import SemanticChunker
from langchain_openai.embeddings import OpenAIEmbeddings
# 创建语义相似性分割器实例,并使用OpenAI的嵌入模型初始化
text_splitter = SemanticChunker(OpenAIEmbeddings())
# 定义待分割的长文本
long_text = """
这是一个示例长文本,包含了多个句子。我们将使用语义相似性分割器将这个长文本分割成多个语义相关的块。
这个文本分割器将根据句子之间的语义相似性来确定分割位置。
我们可以进一步处理每个分割块,以便进行后续的分析或处理。
"""
# 使用语义相似性分割器将长文本分割成多个块
docs = text_splitter.create_documents([long_text])
# 打印分割后的文本块
for idx, doc in enumerate(docs):
print(f"Chunk {idx + 1}:")
print(doc.page_content)
print("-" * 50)
在上述代码中,首先导入了所需的库和模块,然后创建了语义相似性分割器实例,并使用OpenAI的嵌入模型进行初始化。接下来,定义了一个长文本,其中包含多个句子。最后,我们使用语义相似性分割器将长文本分割成多个语义相关的块,并打印每个分割块的内容。通过这样的方式,我们可以将长文本分割成更易于理解和处理的语义相关的块,从而更好地进行后续分析和处理。执行后会输出:
Chunk 1:
这是一个示例长文本,包含了多个句子。我们将使用语义相似性分割器将这个长文本分割成多个语义相关的块。
这个文本分割器将根据句子之间的语义相似性来确定分割位置。
我们可以进一步处理每个分割块,以便进行后续的分析或处理。
--------------------------------------------------
上面的输出结果表明我们的代码成功地将长文本分割成了一个块,并将其打印出来。因为在这个例子中只有一个文本块,所以只打印了一个分割块的内容。每个分割块都包含了原始长文本的一部分,这些部分被认为是语义相关的。