大模型(LLMs)RAG 版面分析——文本分块面

大模型(LLMs)RAG 版面分析——文本分块面

  • 一、为什么需要对文本分块?

  • 二、能不能介绍一下常见的文本分块方法?

  • 2.1 一般的文本分块方法

  • 2.2 正则拆分的文本分块方法

  • 2.3 Spacy Text Splitter 方法

  • 2.4 基于 langchain 的 CharacterTextSplitter 方法

  • 2.5 基于 langchain 的 递归字符切分 方法

  • 2.6 HTML 文本拆分 方法

  • 2.7 Mrrkdown 文本拆分 方法

  • 2.8 Python代码拆分 方法

  • 2.9 LaTex 文本拆分 方法

  • 致谢 一、为什么需要对文本分块? 使用大型语言模型(LLM)时,切勿忽略文本分块的重要性,其对处理结果的好坏有重大影响。 考虑以下场景:你面临一个几百页的文档,其中充满了文字,你希望对其进行摘录和问答式处 理。在这个流程中,最初的一步是提取文档的嵌入向量,但这样做会带来几个问题:

  • 信息丢失的风险:试图一次性提取整个文档的嵌入向量,虽然可以捕捉到整体的上下文,但也 可能会忽略掉许多针对特定主题的重要信息,这可能会导致生成的信息不够精确或者有所缺失。

  • 分块大小的限制:在使用如OpenAI这样的模型时,分块大小是一个关键的限制因素。例如, GPT-4模型有一个32K的窗口大小限制。尽管这个限制在大多数情况下不是问题,但从一开始 就考虑到分块大小是很重要的。

因此,恰当地实施文本分块不仅能够提升文本的整体品质和可读性,还能够预防由于信息丢失或不 当分块引起的问题。这就是为何在处理长篇文档时,采用文本分块而非直接处理整个文档至关重要 的原因。

二、能不能介绍一下常见的文本分块方法?

  1. 一般的文本分块方法 如果不借助任何包,直接按限制长度切分方案:

  2. 正则拆分的文本分块方法

  • 动机:【一般的文本分块方法】能够按长度进行分割,但是对于一些长度偏长的句子,容易从 中间切开;

  • 方法:在中文文本分块的场景中,正则表达式可以用来识别中文标点符号,从而将文本拆分成 单独的句子。这种方法依赖于中文句号、“问号”、“感叹号”等标点符号作为句子结束的标志。

  • 特点:虽然这种基于模式匹配的方法可能不如基于复杂语法和语义分析的方法精确,但它在大 多数情况下足以满足基本的句子分割需求,并且实现起来更为简单直接。 import re def split_sentences(text): # 使用正则表达式匹配中文句子结束的标点符号 sentence_delimiters = re.compile(u'[。?!;]|\n') sentences = sentence_delimiters.split(text) # 过滤掉空字符串 sentences = [s.strip() for s in sentences if s.strip()] return sentences text ="文本分块是自然语言处理(NLP)中的一项关键技术,其作用是将较长的文本切割成更小、更易于处理的片段。这种分割通常是基于单词的词性和语法结构,例如将文本拆分为名词 短语、动词短语或其他语义单位。这样做有助于更高效地从文本中提取关键信息。" sentences = split_sentences(text) print(sentences) >>> #output [ '文本分块是自然语言处理(NLP)中的一项关键技术,其作用是将较长的文本切割成更 小、更易于处理的片段', '这种分割通常是基于单词的词性和语法结构,例如将文本拆分为名词短语、动词短语或其 他语义单位', '这样做有助于更高效地从文本中提取关键信息' ] 在上面例子中,我们并没有采用任何特定的方式来分割句子。另外,还有许多其他的文本分块技术 可以使用,例如词汇化(tokenizing)、词性标注(POS tagging)等。

  1. Spacy Text Splitter 方法

  • import spacy input_text = "文本分块是自然语言处理(NLP)中的一项关键技术,其作用是将较长的文本切割成更小、更易于处理的片段。这种分割通常是基于单词的词性和语法结构,例如将文本拆分为名词短语、动词短语或其他语义单位。这样做有助于更高效地从文本中提取关键信息。" nlp = spacy.load( "zh_core_web_sm" ) doc = nlp(input_text) for s in doc.sents: print (s) >>> [ '文本分块是自然语言处理(NLP)中的一项关键技术,其作用是将较长的文本切割成更 小、更易于处理的片段。', "这种分割通常是基于单词的词性和语法结构,例如将文本拆分为名词短语、动词短语或其 他语义单位。", "这样做有助于更高效地从文本中提取关键信息。" ] 介绍:Spacy是一个用于执行自然语言处理(NLP)各种任务的库。它具有文本拆分器功能, 能够在进行文本分割的同时,保留分割结果的上下文信息。

  1. 基于 langchain 的 CharacterTextSplitter 方法 from langchain.text_splitter import CharacterTextSplitter text_splitter = CharacterTextSplitter(chunk_size = 35, chunk_overlap=0, separator='', strip_whitespace=False) text_splitter.create_documents([text]) >>> [ Document(page_content='我是一个名为 ChatGLM3-6B 的人工智能助手,是基于清华大学'), Document(page_content='KEG 实验室和智谱 AI 公司于 2023 年共同训练的语言模型开发'), Document(page_content='的。我的目标是通过回答用户提出的问题来帮助他们解决问题。 由于我是一个计'), Document(page_content='算机程序,所以我没有实际的存在,只能通过互联网来与用户交 流。') ] 使用CharacterTextSplitter,一般的设置参数为:chunk_size、 chunk_overlap、separator和strip_whitespace。

  2. 基于 langchain 的 递归字符切分 方法 #input text input_text = "文本分块是自然语言处理(NLP)中的一项关键技术,其作用是将较长的文本切割成更小、更易于处理的片段。这种分割通常是基于单词的词性和语法结构,例如将文本拆分为名词短语、动词短语或其他语义单位。这样做有助于更高效地从文本中提取关键信息。" from langchain.text_splitter import RecursiveCharacterTextSplitter text_splitter = RecursiveCharacterTextSplitter( chunk_size = 100 , #设置所需的文本大小 chunk_overlap = 20 ) chunks = text_splitter.create_documents([input_text]) print (chunks) >>> [ Document(page_content='文本分块是自然语言处理(NLP)中的一项关键技术,其作用是 将较长的文本切割成更小、更易于处理的片段。这种分割通常是基于单词的词性和语法结构, 例如将文本拆分为名词短语、动词短语或其他语义单位。这样做有助'), Document(page_content='短语、动词短语或其他语义单位。这样做有助于更高效地从文本 中提取关键信息。')] 使用RecursiveCharacterTextSplitter,一般的设置参数为:chunk_size、 chunk_overlap。 与CharacterTextSplitter不同,RecursiveCharacterTextSplitter不需要设置分隔符,默认的几个分隔 符如下: "\n\n" - 两个换行符,一般认为是段落分隔符"\n" - 换行符 " " - 空格 "" - 字符 拆分器首先查找两个换行符(段落分隔符)。一旦段落被分割,它就会查看块的大小,如果块太 大,那么它会被下一个分隔符分割。如果块仍然太大,那么它将移动到下一个块上,以此类推。

  3. HTML 文本拆分 方法

  • 介绍:HTML文本拆分器是一种结构感知的文本分块工具。它能够在HTML元素级别上进行文本 拆分,并且会为每个分块添加与之相关的标题元数据。

  • 特点:对HTML结构的敏感性,能够精准地处理和分析HTML文档中的内容。 <div> <h2>Mobot主要部分</h2> <p>有关Mobot的一些介绍文本。</p> <h3>Mobot第1小节</h3> <p>有关Mobot第一个子主题的一些文本。</p> <h3>Mobot第2小节</h3> <p>关于Mobot的第二个子主题的一些文字。</p> </div> <div> <h2>Mobot</h2> <p>关于Mobot的一些文字</p> </ div> <br> <p>关于Mobot的一些结论性文字</p> </div> </body> </html> """ headers_to_split_on = [ ( "h1" , "Header 1" ), ( "h2" , "标题 2" ), ( "h3" , "标题 3" ), ] from langchain.text_splitter import HTMLHeaderTextSplitter html_splitter = HTMLHeaderTextSplitter(headers_to_split_on=headers_to_split_on) html_header_splits = html_splitter.split_text(html_string) print(html_header_split) >>> [ Document(page_content='Mobot'), Document(page_content='一些关于Mobot的介绍文字。\nMobot主要部分 Mobot第1小节Mobot第2小节', metadata={'Header 1': 'Mobot'}), Document(page_content='有关Mobot的一些介绍文本。', metadata={'Header 1': 'Mobot', '标题 2': 'Mobot主要部分'}), Document(page_content='有关Mobot第一个子主题的一些文本。', metadata={'Header 1': 'Mobot', '标题 2': 'Mobot主要部分', '标题 3': 'Mobot第1小节'}), Document(page_content='关于Mobot的第二个子主题的一些文字。', metadata={'Header 1': 'Mobot', '标题 2': 'Mobot主要部分', '标题 3': 'Mobot第2小节'}), Document(page_content='Mobot div>', metadata={'Header 1': 'Mobot'}), Document(page_content='关于Mobot的一些文字 \n关于Mobot的一些结论性文字', metadata={'Header 1': 'Mobot', '标题 2': 'Mobot'}) ] 仅提取在header_to_split_on参数中指定的HTML标题。

  1. Mrrkdown 文本拆分 方法

  • 介绍:Markdown文本拆分是一种根据Markdown的语法规则(例如标题、Bash代码块、图片和 列表)进行文本分块的方法。

  • markdown_text = '# Mobot\n\n ## Stone\n\n这是python \n这是\n\n ## markdown\n\n 这是中文文本拆分' from langchain.text_splitter import MarkdownHeaderTextSplitter headers_to_split_on = [ ("#", "Header 1"), ("##", "Header 2"), ("###", "Header 3"), ] markdown_splitter = MarkdownHeaderTextSplitter(headers_to_split_on=headers_to_split_on) md_header_splits = markdown_splitter.split_text(markdown_text) print(md_header_splits) >>> [ Document(page_content='这是python\n这是', metadata={'Header 1': 'Mobot', 'Header 2': 'Stone'}), Document(page_content='这是中文文本拆分', metadata={'Header 1': 'Mobot', 'Header 2': 'markdown'}) ] 特点:具有对结构的敏感性,能够基于Markdown文档的结构特点进行有效的文本分割。 MarkdownHeaderTextSplitter 能够根据设定的 headers_to_split_on 参数,将 Markdown 文本进行拆分。这一功能使得用户可以便捷地根据指定的标题将 Markdown 文件分割成不同部分,从而提高编辑和管理的效率。

  1. Python代码拆分 方法 python_text = """ class Person: def init (self, name, age): self.name = name self.age = age p1 = Person("John", 36) for i in range(10): print (i) """ from langchain.text_splitter import PythonCodeTextSplitter python_splitter = PythonCodeTextSplitter(chunk_size=100, chunk_overlap=0) python_splitter.create_documents([python_text]) >>> [ Document(page_content='class Person:\n def init (self, name, age):\n self.name = name\n self.age = age'), Document(page_content='p1 = Person("John", 36)\n\nfor i in range(10):\n print (i)') ]

  2. LaTex 文本拆分 方法

LaTex文本拆分工具是一种专用于代码分块的工具。它通过解析LaTex命令来创建各个块,这些块按照逻辑组织,如章节和小节等。这种方式能够产生更加准确且与上下文相关的分块结果,从而有 效地提升LaTex文档的组织和处理效率。

#input Latex string

latex_text = """documentclass{article}begin{document}maketitlesection{Introduction} 大型语言模型 (LLM) 是一种机器学习模型,可以在大量文本数据上进行训练,以生成类似人类的语言。近年来,法学硕士在各种自然语言处理任务中取得了重大进展,包括语言翻译、文本生成和情感分析。subsection{法学硕士的历史}最早的法学硕士是在 20 世纪 80 年代开发的和 20 世纪 90 年代,但它们受到可处理的数据量和当时可用的计算能力的限制。然而,在过去的十年中,硬件和软件的进步使得在海量数据集上训练法学硕士成为可能,从而导致subsection{LLM 的应用}LLM 在工业界有许多应用,包括聊天机器人、内容创建和虚拟助理。它们还可以在学术界用于语言学、心理学和计算语言学的研究。end{document}"""

from langchain.text_splitter import LatexTextSplitter

Latex_splitter = LatexTextSplitter(chunk_size= 100 , chunk_overlap= 0 )

latex_splits = Latex_splitter.create_documents([latex_text]) print (latex_splits)

>>> [

Document(page_content='documentclass{article}begin{document}maketitlesection{Introd uction}大型语言模型 (LLM)'),

Document(page_content='是一种机器学习模型,可以在大量文本数据上进行训练,以生成 类似人类的语言。近年来,法学硕士在各种自然语言处理任务中取得了重大进展,包括语言翻译、文本生成和情感分析。subsection{法学硕士的历史'),

Document(page_content='}最早的法学硕士是在'),

Document(page_content='20 世纪 80 年代开发的和 20 世纪 90'),

Document(page_content='年代,但它们受到可处理的数据量和当时可用的计算能力的限制。然而,在过去的十年中,硬件和软件的进步使得在海量数据集上训练法学硕士成为可能, 从而导致subsection{LLM 的应用}LLM'),

Document(page_content='在工业界有许多应用,包括聊天机器人、内容创建和虚拟助理。 它们还可以在学术界用于语言学、心理学和计算语言学的研究。end{document}')

]

在上述示例中,我们注意到代码分割时的重叠部分设置为0。这是因为在处理代码分割过程中,任何重叠的代码都可能完全改变其原有含义。因此,为了保持代码的原始意图和准确性,避免产生误 解或错误,设置重叠部分为0是必要的。

当你决定使用哪种分块器处理数据时,重要的一步是提取数据嵌入并将其存储在向量数据库

(Vector DB)中。上面的例子中使用文本分块器结合 LanceDB 来存储数据块及其对应的嵌入。LanceDB 是一个无需配置、开源且无服务器的向量数据库,其数据持久化在硬盘驱动器上,允许用户在不超出预算的情况下实现扩展。此外,LanceDB 与 Python 数据生态系统兼容,因此你可以将其与现有的数据工具(如 pandas、pyarrow 等)结合使用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/81745.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

解构区块链身份认证:从ID到零知识证明的实战指南

引言 在数字经济高速发展的今天&#xff0c;数字身份已成为个人与数字世界交互的核心凭证。传统中心化身份系统存在数据孤岛、隐私泄露、单点故障等痛点&#xff0c;而区块链技术凭借​​去中心化、不可篡改、可追溯​​的特性&#xff0c;为数字身份验证提供了革命性解决方案…

c#数据结构 线性表篇 非常用线性集合总结

本人能力有限,使用了一些Ai的结论,如有不足还请斧正 目录 1.HashSet <> Dictionary 2.SortedSet <>提供升序方法的List 3.ArrayList<>List 4.BitArray <> Bit[] array 5.StringCollection <>List 6.StringDictionary<>Dictionary 1…

爬虫管理平台-最新版本发布

TaskPyro 是什么&#xff1f; TaskPyro 是一个轻量级的 Python 任务调度平台&#xff0c;专注于提供简单易用的任务管理和爬虫调度解决方案。它能够帮助您轻松管理和调度 Python 任务&#xff0c;特别适合需要定时执行的爬虫任务和数据处理任务。 官方文档&#xff1a;https:/…

过采样处理

一、数据读取与初步观察 首先&#xff0c;使用pandas库读取信用卡交易数据集&#xff1a; data pd.read_csv(r"./creditcard.csv") print(data.head())通过head()方法查看数据集的前几行&#xff0c;初步了解数据的结构和内容。该数据集包含交易时间、交易金额、多…

潮乎盲盒商城系统全开源多级分销推广海报奖品兑换试玩概率OSS云存储多端源码

一、源码描述 这是一套潮乎盲盒商城源码&#xff0c;仿小叮当盲盒商城&#xff0c;后端Laravel框架前端uniappvue&#xff0c;前后端数据库分离&#xff0c;支持四端同步数据&#xff08;H5小程序等&#xff09;&#xff0c;测试环境: php7.4&#xff0c;mysql5.6&#xff0c;…

c++环境和vscode常用的一些有用插件

环境 WSL需要安装cmake 编译器g14 应该是包含了所有std:c23把好像包含部分c26 vscode 需要插件cmake vscode clangd 方便提示吧 File Watch 插件目的在保存.h/.cpp文件时候自动执行vscode 的cmake吧 error lens 方便每次显示错误和警告的提示懒得每次点击去看错误 Edit Sugge…

Spring 转发 form-data 文件上传请求时中文文件名乱码

Spring 转发 form-data 文件上传请求时中文文件名乱码 复现问题找原因解决问题参考 复现问题 后端有两个接口&#xff1a; /upload 是文件上传的接口。 /forward 是转发文件上传请求的接口。 RequestMapping RestController public class FileUploadController {/*** 直接调…

MySQL 8.4.4 安全升级指南:从漏洞修复到版本升级全流程解析

目录 二、升级前关键注意事项 1. 数据安全与备份 2. 版本兼容性与路径规划 三、分步升级操作流程 1. 环境预检与准备 2. 安装包部署 3. 强制升级组件 4. 验证与启动 一、背景与必要性 近期安全扫描发现生产环境的 MySQL 数据库存在多个高危漏洞(CVE 详情参见Oracle 官…

vulkanscenegraph显示倾斜模型(6.4)-多线程下的记录与提交

前言 上章深入分析了帧循环中呈现阶段的具体实现。本章将分析多线程下的记录与提交&#xff0c;进一步剖析vsg帧循环过程中的同步机制&#xff0c;并揭露信号量(VkSemaphore)和围栏(VkFence)以及vsg::FrameBlock与vsg::Barrier在其中的作用。 目录 1 信号量(VkSemaphore)、栅栏…

Python爬虫实战:获取扇贝单词数据并分析,为用户高效学习单词做参考

一、引言 随着互联网的迅猛发展,在线学习资源日益丰富多样。扇贝单词作为一款备受欢迎的在线英语学习平台,积累了海量的单词学习数据。借助 Python 强大的爬虫技术获取这些数据,并运用数据分析和机器学习方法进行深度挖掘,能够为用户量身定制更个性化、更高效的单词学习方…

【Vagrant+VirtualBox创建自动化虚拟环境】Ansible-Playbook

Vagrant 后续Ansible实战&#xff1a;【Ansible自动化运维实战&#xff1a;从Playbook到负载均衡指南】-CSDN博客 Vagrant是一个基于Ruby的工具&#xff0c;用于创建和部署虚拟化开发环境。它使用Oracle的开源VirtualBox虚拟化系统&#xff0c;使用 Chef创建自动化虚拟环境 Do…

Codigger Desktop:重新定义数字工作与生活方式

Codigger Desktop是一款革命性的智能桌面操作系统&#xff0c;专为现代数字生活和工作场景打造。它不仅成为开发者的强大生产力工具&#xff0c;更是普通用户日常数字生活的得力助手&#xff0c;完美实现了专业性与易用性的平衡。 Multimedia Desktop全能数字生活平台 重新定…

Servlet+tomcat

serverlet 定义&#xff1a;是一个接口&#xff0c;定义了java类被浏览器&#xff08;tomcat识别&#xff09;的规则 所以我们需要自定义一个类&#xff0c;实现severlet接口复写方法 通过配置类实现路径和servlet的对应关系 执行原理 当用户在浏览器输入路径&#xff0c;会…

什么是 DDoS 攻击?高防 IP 如何有效防护?2025全面解析与方案推荐

一、DDoS 攻击&#xff1a;互联网时代的 “数字核武器” 1. DDoS 攻击的本质与原理 ** 分布式拒绝服务攻击&#xff08;DDoS&#xff09;** 通过操控海量僵尸设备&#xff0c;向目标服务器发送洪水般请求&#xff0c;耗尽带宽、连接或计算资源&#xff0c;导致合法用户无法访…

Circular Plot系列(一): 环形热图绘制

针对近期多个粉丝咨询环形图的绘制&#xff0c;我意识到&#xff0c;我们似乎没有真正介绍过circle图&#xff0c;但这一类图确是非常常用的图&#xff0c;所以这里详细学习一下circle的绘制&#xff0c;使用的是circlize包&#xff0c;功能很完善&#xff1a;安装包, #https:/…

【数据挖掘】时间序列预测-时间序列预测策略

时间序列预测策略 &#xff08;1&#xff09;单步预测与多步预测&#xff08;2&#xff09;直接多步预测&#xff08;3&#xff09;递归多步预测&#xff08;4&#xff09;直接递归的混合预测&#xff08;5&#xff09;多输入多输出预测 &#xff08;1&#xff09;单步预测与多…

【LLM】deepseek R1之GRPO训练笔记(持续更新)

note 相关框架对比&#xff1a; 需微调模型且资源有限 → Unsloth&#xff1b;本地隐私优先的小规模推理 → Ollama&#xff1b;复杂逻辑或多模态任务 → SGLang&#xff1b;高并发生产环境 → vLLM 微调SFT和GRPO是确实能学到新知识的四种格式&#xff08;messages、sharegpt…

【数据结构】--- 单链表的增删查改

前言&#xff1a; 经过了几个月的漫长岁月&#xff0c;回头时年迈的小编发现&#xff0c;数据结构的内容还没有写博客&#xff0c;于是小编赶紧停下手头的活动&#xff0c;补上博客以洗清身上的罪孽 目录 前言 概念&#xff1a; 单链表的结构 我们设定一个哨兵位头节点给链…

【JAVA】数据类型与变量:深入理解栈内存分配(4)

核心知识点详细解释 Java 的基本数据类型和引用数据类型 基本数据类型 Java 有 8 种基本数据类型&#xff0c;它们可以分为 4 类&#xff1a; 整数类型&#xff1a;byte&#xff08;1 字节&#xff09;、short&#xff08;2 字节&#xff09;、int&#xff08;4 字节&#…

ReentrantLock实现公平锁和非公平锁

在 Java 里&#xff0c;公平锁和非公平锁是多线程编程中用于同步的两种锁机制&#xff0c;它们的主要差异在于获取锁的顺序规则。下面是对二者的详细介绍&#xff1a; 公平锁 公平锁遵循 “先来先服务” 原则&#xff0c;也就是线程获取锁的顺序和请求锁的顺序一致。先请求锁…