Langchain(十三)进阶之长文本拆分

2,834 阅读2分钟

引言:chatpdf背后的主要原理就是通过将文本拆分,然后存储在矢量存储器中,最后通过gpt进行对比分析。今天我们就来介绍一下文本拆分。

默认的文本拆分器是RecursiveCharacterTextSplitter。这个文本拆分器会将一系列的字符作为输入。它试着根据第一个字符来分割文本,如果某个文本块太大了,就会尝试用后面的字符来分割。默认情况下,它会尝试用 ["\n\n", "\n", " ", ""] 这四个字符来分割文本。

除了控制可分割的字符之外,你还可以控制一些其他的东西:

length_function:用于计算文本块长度的方法。默认只是简单的计算字符数,但是在这里传递一个token计数器是非常常见的。

chunk_size:文本块的最大尺寸(由长度函数衡量)。

chunk_overlap:文本块之间的最大重叠量。保留一些重叠可以保持文本块之间的连续性(例如使用滑动窗口)。 ps.可以想象一下上学的时候,有经验的老师都会在上新课前带着同学们回顾一下上节课学到的知识,做一个承上启下。

下面是一个使用RecursiveCharacterTextSplitter拆分长文本的例子:


with open('../../state_of_the_union.txt') as f:

    state_of_the_union = f.read()

from langchain.text_splitter import RecursiveCharacterTextSplitter

text_splitter = RecursiveCharacterTextSplitter(

    # 这里设置了一个很小的chunk_size,只是为了演示。

    chunk_size = 100,

    chunk_overlap  = 20,

    length_function = len,

)

texts = text_splitter.create_documents([state_of_the_union])

print(texts[0])

print(texts[1])

最后两行的输出结果是拆分出来的两个文本块。

当然,理论是理论,我们不会自己拆分文本的,一般是使用现成的工具帮助我们拆分文本,配合矢量存储器达到目的。

今天讲的比较简单,明天继续连载。