使用Python对知识文本进行分块

news2024/11/24 4:58:14
	使用大型语言模型时,切勿忽略文本分块的重要性,其对处理结果的好坏有重大影响。接下来介绍常用的一些文本分块方法。

1.1 一般的文本分块方法

如果不借助任何包,直接按限制长度切分方案。

text =" 我是一个名为 chatGLm3-68 的人工智能助手,是基于清华大学 KEG 实验室和智谱 AI 公司于 2023 年共同训练的语言模型开发的。我的目标是通过回答用户提出的问题来帮助他们解决问题。由于我是一个计算机程序,所以我没有实际的存在,只能通过互联网来与用户交流。"
chunks = []
chunk_size=128
for i in range(0, len(text), chunk_size):
    chunk = text[i:i+chunk_size]
    chunks.append(chunk)
print(chunks)

在这里插入图片描述

2.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)

在这里插入图片描述

2.3 Spacy Text Splitter方法

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

2.4 基于langchain 的Character TextSplitter 方法

# langchain == 0.1.16
# 注意版本!!!
from langchain.text_splitter import CharacterTextSplitter
text_splitter = CharacterTextSplitter(chunk_size=35, chunk_overlap=0, separator='', strip_whitespace=False)
text = "文本分块是自然语言处理(NLP)中的一项关键技术,其作用是将较长的文本切割成更小、更易于处理的片段。这种分割通常是基于单词的词性和语法结构,例如将文本拆分为名词短语、动词短语或其他语义单位。这样做有助于更高效地从文本提取关键信息。"
text_splitter.create_documents([text])

在这里插入图片描述

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

from langchain.text_splitter import RecursiveCharacterTextSplitter
text = "文本分块是自然语言处理(NLP)中的一项关键技术,其作用是将较长的文本切割成更小、更易于处理的片段。这种分割通常是基于单词的词性和语法结构,例如将文本拆分为名词短语、动词短语或其他语义单位。这样做有助于更高效地从文本提取关键信息。"
text_splitter = RecursiveCharacterTextSplitter(chunk_size=100, #设置所需的文本大小
                                               chunk_overlap=20
                                               )
chunks = text_splitter.create_documents([text])
print(chunks)

在这里插入图片描述
与CharacterTextSplitter不同,RecursiveCharacterTextSplitter不需要设置分隔符,默认的几个分隔符如下:

"\n\n" - 两个换行符,一般认为是段落分开符
"\n" - 换行符
" " - 空格
"" - 字符

2.6 HTML文本拆分方法

from langchain.text_splitter import HTMLHeaderTextSplitter
html_text = """
<!DOCTYPE html>
<html>
<body>
    <div>
        <h1>Mobot</h1>
        <p>一些关于Mobot的介绍文字。</p>
        <div>
            <h2>Mobot主要部分</h2>
            <p>有关Mobot的一些介绍文本。</p>
            <h3>Mobot第2小节</h3>
            <p>关于Mobot的第二个子主题的一些文字。</p>
            </div>
        <div>
            <h2>Mobot</h2>
            <p>关于Mobot的第二个子主题的一些文字。</p>
            </div>
        <div>
            <h2>Mobot</h2>
            <p>关于Mobot的一些文字</p>
            </div>
            <br>
            <p>关于Mobot的一些结论性文字</p>
    </div>
</body>
</html>
        
"""
header_to_split_on = [
    ("h1","Header 1"),
    ("h2","标题 2"),
    ("h3","标题 3"),
]
html_splitter = HTMLHeaderTextSplitter(headers_to_split_on=header_to_split_on)
html_header_splitters = html_splitter.split_text(html_text)
print(html_header_splitters)

在这里插入图片描述

2. 7 Markdown文本拆分方法

from langchain.text_splitter import MarkdownHeaderTextSplitter
markdown_text = "# Mobot\n\n ## Stone\n\n这是python \n这是\n\n ## markdown\n\n 这是中文文本拆分"
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)

在这里插入图片描述

2.8 Python代码拆分方法

from langchain.text_splitter import PythonCodeTextSplitter
python_text ="""
class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age
p1 = Person("John",25)
for i in range(10):
    print(i)
"""
python_splitter = PythonCodeTextSplitter(chunk_size=100, chunk_overlap=0)
python_splitter.create_documents([python_text])

在这里插入图片描述

2.9 LaTex文本拆分方法

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

在这里插入图片描述
在上述示例中,我们注意到代码分割时的重叠部分设置为0。这是因为在处理代码分割过程中,任何重叠的代码都可能完全改变其原有含义。因此,为了保持代码的原始意图和准确性,避免产生误解或错误,设置重叠部分为0是必要的。当你决定使用哪种分块器处理数据时,重要的一步是提取数据嵌入并将其存储在向量数据库(Vector DB)中。上面的例子中使用文本分块器结合 LanceDB 来存储数据块及其对应的嵌入。LanceDB 是一个无需配置、开源且无服务器的向量数据库,其数据持久化在硬盘驱动器上,允许用户在不超出预算的情况下实现扩展。此外,LanceDB 与Python 数据生态系统兼容,因此你可以将其与现有的数据工具(如:pandas、pyarrow等)结合使用。

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

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

相关文章

wps云字库字体下载到电脑

下拉字体菜单栏--->查看更多云字体 进入后 云字库里的字体&#xff0c;都只能在wps在线使用。 但是&#xff0c;要想下载到自己的电脑上&#xff0c;安装到电脑系统字体库中&#xff0c;WIN7的字体安装系统路径&#xff1a;C:\Windows\Fonts&#xff0c;以供电脑软件adobe …

Spring IoCDI(上)--初识

1. IoC & DI ⼊⻔ 1.1 Spring 是什么 通过前⾯的学习, 我们知道了Spring是⼀个开源框架, 他让我们的开发更加简单. 他⽀持⼴泛的应⽤场 景, 有着活跃⽽庞⼤的社区, 我们⽤⼀句更具体的话来概括Spring, 那就是: Spring 是包含了众多⼯具⽅法的 IoC 容器 1.1.1 什么是容器…

C#委托(入门)

1、语法 步骤 ①定义一个委托类型, 如Help ②委托类型实例化为委托实例 ③定义函数(与委托类型相匹配的) ④将函数交给委托实例使用 示例一 //方法一 void MyFunc1() {Console.WriteLine("Hello"); }//方法二 void MyFunc2() {Console.WriteLine("World&…

STM32总线和时钟树(速记版)

一、存储器结构 1.1 STM32内存结构 型号说明 以STM32F103RBT6这个型号的芯片为例&#xff0c;该型号的组成为7个部分&#xff0c;其命名规则如下&#xff1a; ST 是公司名&#xff0c;意法半导体。M 代表Cortex-M内核。32 代表32位微控制器。 F103 是芯片系列。 R 代表引脚数…

算法基础知识——11种距离度量

简介&#xff1a;个人学习分享&#xff0c;如有错误&#xff0c;欢迎批评指正。 前言&#xff1a;距离的作用 数据聚类&#xff1a;距离度量在聚类算法&#xff08;如K-means、层次聚类&#xff09;中用于衡量数据点之间的相似性或差异性&#xff0c;帮助确定聚类的中心和边界…

10款开源管理工具大比拼:哪个最适合您的团队?

国内外主流的 10 款开源项目管理系统对比&#xff1a;PingCode、Worktile、Gitee、开源中国 (OSChina)、禅道 (ZenTao)、OpenProject、Redmine、Leantime、MeisterTask、Freedcamp。 在选择合适的开源项目管理工具时&#xff0c;你是否感到困惑和不安&#xff1f;市场上众多的选…

Python | Leetcode Python题解之第338题比特位计数

题目&#xff1a; 题解&#xff1a; class Solution:def countBits(self, n: int) -> List[int]:bits [0]for i in range(1, n 1):bits.append(bits[i & (i - 1)] 1)return bits

SSTI模版注入(初步)

SSTI模版注入&#xff08;初步&#xff09; ssti可能造成任意文件读取和RCE远程控制后台系统 漏洞成因&#xff1a;渲染模版时&#xff0c;没有严格控制对用户的输入&#xff1b; 使用了危险的模版&#xff0c;导致用户可以混合flask程序进行交互。 flask是基于python开发的…

【C++高阶】哈希—— 位图 | 布隆过滤器 | 哈希切分

✨ 人生如梦&#xff0c;朝露夕花&#xff0c;宛若泡影 &#x1f30f; &#x1f4c3;个人主页&#xff1a;island1314 &#x1f525;个人专栏&#xff1a;C学习 ⛺️ 欢迎关注&#xff1a;&#x1f44d;点赞 &#x1f442;&am…

Ubuntu系统安装CH340驱动

今天在使用USB转UART模块连接设备时发现我的Ubuntu虚拟机无法识别USB设备&#xff0c;这个模块使用的CH340芯片&#xff0c;在Windows主机中可以识别到串口并连接&#xff0c;所以初步判断为虚拟机中缺少ch340驱动。实际上自Linux内核版本2.6.24起&#xff0c;Linux主线内核已内…

云原生-Docker安全-容器逃逸系统内核漏洞(解决docker.com无法访问)

云原生-Docker安全-容器逃逸&系统内核漏洞 细节部分在权限提升章节会详解&#xff0c;常用&#xff1a; CVE-2016-5195 CVE-2019-16884 CVE-2021-3493 CVE-2021-22555 CVE-2022-0492 CVE-2022-0847 CVE-2022-23222 云原生-Docker安全-容器逃逸&docker版本漏洞 CVE…

基于Java的医院急诊系统

TOC springboot327基于Java的医院急诊系统 第1章 绪论 1.1选题动因 当前的网络技术&#xff0c;软件技术等都具备成熟的理论基础&#xff0c;市场上也出现各种技术开发的软件&#xff0c;这些软件都被用于各个领域&#xff0c;包括生活和工作的领域。随着电脑和笔记本的广泛…

【中等】 猿人学web第一届 第7题 动态字体,随风漂移

文章目录 获取字体文件映射关系获取页面英雄排序python 代码 这道题是 动态字体文件加密&#xff0c;找出动态字体文件中对应数字相同规律即可 数据接口 https://match.yuanrenxue.cn/api/match/7 数据接口没有加密值 cookie字段也没有 获取字体文件映射关系 多次观察 字体文件…

2.2 Oracle与SQL Server简介

欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;欢迎订阅相关专栏&#xff1a; 工&#x1f497;重&#x1f497;hao&#x1f497;&#xff1a;野老杂谈 ⭐️ 全网最全IT互联网公司面试宝典&#xff1a;收集整理全网各大IT互联网公司技术、项目、HR面试真题.…

仿Muduo库实现高并发服务器——事件监控Poller模块

Poller模块在整个项目的使用 下面代码是对I/O复用接口函数的基本使用。 回顾上篇文章&#xff1a;事件监控管理模块 这个模块是将触发事件的描述符&#xff0c;给到外面&#xff0c;让外面去做对应的处理。 #define MAX_EPOLLEVENTS 1024 class Poller {private:int _epfd;s…

三级_网络技术_18_路由器的配置及使用

1.在Cisco路由器上用于永久保存路由器的开机诊断程序、引导程序和操作系统软件的存储器是()。 Flash NVRAM RAM ROM 2.在Cisco路由器中主要用来永久保存路由器的开机诊断程序、引导程序和操作系统&#xff0c;以完成路由器初始化进程的存储器是()。 RAM Disk Flash RO…

Linux平台使用OPUS对Audio PCM数据进行编解码

1&#xff09;Audio编解码入门级小知识&#xff0c;分享给将要学习或者正在学习Audio编解码开发的同学。 2&#xff09;内容属于原创&#xff0c;若转载&#xff0c;请说明出处。 3&#xff09;提供相关问题有偿答疑和支持。 Opus编码是一个开源的音频编码格式&#xff0c;具…

ArduPilot二次开发零基础教程

文章目录 前言一、概述二、开发环境搭建三、多旋翼MAVROS自主控制接口四、无人船&#xff08;车&#xff09;MAVROS自主控制接口五、二次开发基础六、控制LED灯七、自定义串口驱动八、Guided控制接口九、输出自定义PWM信号十、添加自定义MAVLINK消息和QGC通信十一、自定义日志十…

[MRCTF2020]套娃1

打开题目&#xff0c;查看源代码&#xff0c;有提示 有两层过滤 1.过滤"_"与"%5f" 。 这里要求的参数必须是"b_u_p_t"但是不能检测出"_"。这里看着很作弄人。其实这里要用到php里非法参数名的问题。可以参考一下博客 ?b.u.p.t2333…

探索Pandas的魔力:Python数据分析的终极武器

文章目录 探索Pandas的魔力&#xff1a;Python数据分析的终极武器背景&#xff1a;为何选择Pandas&#xff1f;引言&#xff1a;Pandas是什么&#xff1f;安装Pandas&#xff1a;一键安装的便捷基础函数&#xff1a;Pandas的五大法宝应用场景&#xff1a;Pandas的实战演练常见问…