我们将文本切分定义为五个层级:
Level 1:Character Splitting-简单的字符长度切分
Level 2:Recursive Character Text Splitting-通过分隔符切分,然后递归合并
Level 3
ocument Specific Splitting- 针对不同文档格式切分(PDF, Python, Markdown)
Level 4:Semantic Splitting-语义切分
Level 5:Agentic Splitting-使用代理实现自动切分
本篇文章将介绍字符切分的概念和实现。虽然简单,但有助于我们理解一些参数和整体概念。
ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;border-left: 4px solid rgb(248, 57, 41);">字符切分概念字符分割是分割文本的最基本形式。它是简单地将文本分成n个字符大小的块的过程,而不考虑其内容或形式。
不建议在任何应用程序中使用这种方法,但它是我们理解基础知识的一个很好的起点。
优点:简单容易
缺点:非常死板,没有考虑到文本的结构
两个小概念:
Chunk Size(块大小)-块中包含的字符数量。50、100、10万等等。
Chunk Overlap(块重叠)-为了避免重要信息被切开成多个部分,希望有连续块重叠,overlap就是重叠块的大小。
下面看个例子,来看看字符切分逻辑:
text="2024年一季度公司实现营业收入24.56亿元(-12.60%),实现归母净利润19.54亿元(-3.70%),扣非后归母净利润19.37亿元(+2.38%),基本每股收益0.12元,(-3.36%)。"chunks=[]chunk_size = 35for i in range(0, len(text), chunk_size):chunk=text[i:i+chunk_size]#每隔35是一个块chunks.append(chunk)print(chunks)
在实际工程使用中,我们都不是孤立的切分文本,而是对文档进行切分,下面我们使用langchain和llama_index来演示这个过程。
fromlangchain.text_splitterimportCharacterTextSplitter
text_splitter=CharacterTextSplitter(chunk_size=35,chunk_overlap=0,separator='',strip_whitespace=False)print(text_splitter.split_text(text))
text_splitter=CharacterTextSplitter(chunk_size=35,chunk_overlap=5,separator='',strip_whitespace=False)st=text_splitter.split_text(text)pprint(st)
加入separator
先利用separator将文档切分成小块,再使用长度对小块进行切割:
text_splitter=CharacterTextSplitter(chunk_size=35,chunk_overlap=0,separator=',',strip_whitespace=False)print(text_splitter.split_text(text))
fromllama_index.core.text_splitterimportSentenceSplitterfromllama_index.coreimportSimpleDirectoryReader
构建切分器
splitter=SentenceSplitter(chunk_size=200,chunk_overlap=15,)
加载文档
documents=SimpleDirectoryReader(input_files=["./test.txt"]).load_data()
切分文档
nodes=splitter.get_nodes_from_documents(documents)
nodes里面不仅包含了切分的文本信息,也包含了很多额外的相关内容。可以去探索...
至此,你已经学会了字符切分的全部概念和实战,让我们下篇继续吧。
| 欢迎光临 链载Ai (https://www.lianzai.com/) | Powered by Discuz! X3.5 |