使用大型语言模型时,切勿忽略文本分块的重要性,其对处理结果的好坏有重大影响。接下来介绍常用的一些文本分块方法。
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等)结合使用。