文本分块(Chunking)

1 什么是分块

文本分块(Chunking)是自然语言处理(NLP)和检索增强生成(RAG)中的核心技术,旨在将长文本拆分为更小、更易处理的语义单元。

2 分块作用

  1. 突破模型输入限制
    主流预训练模型(如GPT系列)的输入长度通常在512-2048 tokens之间。分块可确保每段文本在模型处理范围内,避免信息截断。

  2. 提升检索与生成质量
    合理的分块能保留上下文关联性,使RAG系统更精准地定位相关语义片段,生成答案的准确率提升30%以上。

  3. 优化计算效率
    分块后并行处理文本可降低内存消耗,减少约40%的计算时间,尤其在大规模数据处理中优势显著。

3 常用分块方法

3.1 固定长度分块

  • 原理:按预定义字符数或Token数切分,允许部分重叠(如保留10%重复内容防止语义断裂)。
  • 适用场景:格式统一文档(如技术手册)、基础问答系统。
  • 工具示例:Langchain的CharacterTextSplitter。

    text = "..." # your text
    from langchain.text_splitter import CharacterTextSplitter
    text_splitter = CharacterTextSplitter(
    separator = "\n\n",
    chunk_size = 256,
    chunk_overlap  = 20
    )
    docs = text_splitter.create_documents([text])

3.2 语义分块(基于内容意图分块)

  • 原理:基于句点、换行符或语义相似度动态划分,确保每块表达完整主题。
  • 适用场景:逻辑推理任务、专业领域分析(如法律合同)。
  • 工具示例:Chonkie的SemanticChunker。

    # 句分割(最简单)
    text = "..." # 你的文本
    docs = text.split(".")
    
    # NLTK库 -- 提供了一个句子标记器,将文本分成句子,还可以结合LangChain一起使用
    text = "..." # 你的文本
    from langchain.text_splitter import NLTKTextSplitter
    text_splitter = NLTKTextSplitter()
    docs = text_splitter.split_text(text)
    
    #spaCy库 -- 提供复杂的句子切割功能,同样可以结合LangChain使用
    text = "..." # 你的文本
    from langchain.text_splitter import SpacyTextSplitter
    text_splitter = SpaCyTextSplitter()
    docs = text_splitter.split_text(text)

3.3 递归分块

使用一组分隔符以分层和迭代的方式将输入文本分成更小的块。如果分割文本开始的时候没有产生所需大小或结构的块,那么这个方法会使用不同的分隔符或标准对生成的块递归调用,直到获得所需的块大小或结构。这意味着虽然这些块的大小并不完全相同,但它们仍然会逼近差不多的大小。

  • 原理:优先按段落/章节切分,若超长则二次分割,支持多粒度内容覆盖。
  • 适用场景:学术论文、多层级文档(如电子病历)。

    text = "..." # 你的文本
    from langchain.text_splitter import RecursiveCharacterTextSplitter
    text_splitter = RecursiveCharacterTextSplitter(
        # 设置一个非常小的块大小。
        chunk_size = 256,
        chunk_overlap  = 20
    )
    
    docs = text_splitter.create_documents([text])

3.4 基于文档结构分块

  • 原理:利用标题、表格等固有结构划分,需依赖文档格式规范性。
  • 工具示例:HTMLHeaderTextSplitter可处理HTML/Markdown。

    # markdown格式
    from langchain.text_splitter import MarkdownTextSplitter
    markdown_text = "..."
    
    markdown_splitter = MarkdownTextSplitter(chunk_size=100, chunk_overlap=0)
    docs = markdown_splitter.create_documents([markdown_text])
    
    #LaTex格式
    from langchain.text_splitter import LatexTextSplitter
    latex_text = "..."
    latex_splitter = LatexTextSplitter(chunk_size=100, chunk_overlap=0)
    docs = latex_splitter.create_documents([latex_text])

总结

针对不同的业务场景要使用不同的分块策略

参考

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇