LangChain 是一个强大的框架,旨在帮忙完成各种自然措辞处理 (NLP) 任务,紧张侧重于运用大型措辞模型。
其基本功能之一是文档拆分,它利用户能够将大型文档拆分为较小的、可管理的块。
以下是 LangChain 中文档拆分的紧张功能和示例:

LangChain 文档拆分的紧张特点递归字符文本分割器:此方法通过基于字符递归地划分文本来分割文档,确保每个块的长度不超过指定长度。
这对付具有自然段落或句子分隔的文档特殊有用。
标记分割器:此方法利用标记分割文档。
在利用具有标记限定的措辞模型时,此方法非常有用,可确保每个块符合模型的约束。
句子分割器:此方法在句子边界处罚割文档。
它非常适宜保持文本的高下文完全性,由于句子常日代表完全的想法。
正则表达式分割器:此方法利用正则表达式来定义自定义分割点。
它供应了最高的灵巧性,许可用户根据特定于其用例的模式来分割文档。
Markdown Splitter:此方法是为 Markdown 文档量身定制的。
它根据 Markdown 特定的元素(如标题、列表和代码块)拆分文本。
LangChain 中的文档拆分示例1. 递归字符文本分割器

from langchain.text_splitter import RecursiveCharacterTextSplittertext = "Your long document text goes here..."splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=50)chunks = splitter.split_text(text)for chunk in chunks: print(chunk)2. 代币拆分器

from langchain.text_splitter import TokenSplittertext = "Your long document text goes here..."splitter = TokenSplitter(max_tokens=512)chunks = splitter.split_text(text)for chunk in chunks: print(chunk)3. 句子分割器

from langchain.text_splitter import SentenceSplittertext = "Your long document text goes here..."splitter = SentenceSplitter(max_length=5)chunks = splitter.split_text(text)for chunk in chunks: print(chunk)4. 正则表达式分割器

from langchain.text_splitter import RegexSplittertext = "Your long document text goes here..."splitter = RegexSplitter(pattern=r'\n\n+')chunks = splitter.split_text(text)for chunk in chunks: print(chunk)5. Markdown 分割器

from langchain.text_splitter import MarkdownSplittertext = "Your long markdown document goes here..."splitter = MarkdownSplitter()chunks = splitter.split_text(text)for chunk in chunks: print(chunk)引入新方法

在数字内容剖析中,将大规模文档划分为连贯的主题部分是一项重大寻衅。
传统方法(例如上述方法)常日无法准确检测主题转变的细微环节。
在国际人工智能、打算机、数据科学和运用会议 (ACDSA 2024) 上揭橥的一篇论文中,我们提出了一种创新方法来办理这个问题。

核心寻衅

大型文档(例如学术论文、长篇报告和详细文章)非常繁芜,包含多个主题。
传统的分割技能(从大略的基于规则的方法到高等机器学习算法)都难以识别主题转换的精确点。
这些方法常日会错过细微的转换或缺点地识别它们,从而导致部分内容支离破碎或重叠。

我们的方法利用句子嵌入的强大功能来增强分割过程。
该方法利用 Sentence-BERT (SBERT) 为单个句子天生嵌入,从而定量丈量它们的相似性。
随着主题的变革,这些嵌入反响了向量空间的变革,表明潜在的主题转换。

RAG技能研究 文档处理的新分块方法

看看该方法的每个步骤:1. 利用句子嵌入

天生嵌入:

该方法采取 Sentence-BERT (SBERT) 为单个句子天生嵌入。
SBERT 创建句子的密集向量表示,以封装其语义内容。
然后比较这些嵌入以识别连续句子之间的连贯性。

相似度打算:

句子之间的相似度利用余弦相似度或其他间隔丈量(如曼哈顿或欧几里得间隔)来衡量。
这个想法是,同一主题内的句子会有相似的嵌入,而不同问题的句子的相似度会低落。
2. 打算差距分数

定义参数 n:

设置参数 n,指定要比较的句子数。
例如,如果 n=2,则将两个连续的句子与下一对进行比较。
n 的选择会影响比较中考虑的高下文长度,平衡捕捉详细转换的需求和打算效率。

打算余弦相似度:

对付文档中的每个位置,算法都会提取当前位置前后的 n 个句子。
然后,它打算这些序列的嵌入之间的余弦相似度,称为“间隙分数”。
这些差距分数存储在列表中以供进一步处理。

差距分数示例/图片来自作者

3. 平滑

办理噪音问题:

由于文本中的细微差异,原始差距分数可能会产生噪音。
为了抵消这一影响,我们采取了一种平滑算法。
平滑涉及对由参数 k 定义的窗口内的差距分数进行均匀。

选择窗口大小k:

窗口大小 k 决定了平滑程度。
k 值越大,平滑程度越高,噪音越少,但可能会丢失细微的过渡。
k 值越小,保留的细节越多,但可能会引入噪音。
平滑的差距分数可以更明确地指示主题转换发生的位置。

平滑后的差距分数示例/图片来自作者

4.边界检测

识别局部最小值:

剖析平滑的差距分数来识别局部最小值和主题转换的潜在点。
通过对局部最小值与前后值之间的差异求和来打算每个局部最小值的深度分数。

设置阈值c:

阈值参数 c 用于确定主要边界。
c 值越高,分段越少,主要性越高;c 值越低,分段越多,主要性越低。
超过均匀深度得分标准差 c 倍以上的边界被视为有效分割点。

分割示例/作者供应的图像

5. 聚类片段

处理重复主题:

较长的文档可能会在不同点重新谈论类似的主题。
为理解决这个问题,该算法将具有类似内容的片段聚类。
这涉及将片段转换为嵌入并利用聚类技能合并相似的片段。

减少冗余:

聚类可以确保每个主题都有唯一的表示,从而有助于减少冗余,增强分割的整体同等性和准确性。
算法伪代码

差距分数打算:

差距分数平滑:

边界检测:

打算每个局部最小值的深度分数。
利用参数 ccc 运用阈值来确定主要的分割点。
未来发展方向

该研究概述了为增强此方法而须要进一步研究的几个领域:

自动参数优化:利用机器学习技能动态调度参数。
更广泛的数据集试验:在多样化、大型数据集上测试该方法。
实时分割:探索动态文档的实时运用。
模型改进:集成更新的Transformer模型。
多措辞分割:利用多措辞 SBERT 将该方法运用于不同措辞。
分层分割:调查多个层次的分割以进行详细的文档剖析。
用户界面开拓:创建交互式工具,以便更轻松地调度分割结果。
与NLP任务的集成:将算法与其他自然措辞处理任务相结合。
结论

我们的方法提出了一种繁芜的文档分割方法,将传统事理与尖真个句子嵌入相结合。
通过利用 SBERT 和前辈的平滑和聚类技能,该过程为大型文档中的精确主题建模供应了一种强大而有效的办理方案。

论文:https://ieeexplore.ieee.org/document/10467643