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

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

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等)结合使用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值