使用 Python 库 Chonkie 快速上手

在自然语言处理(NLP)领域,文本分块(chunking)是一种常见的任务,它将长文本分割成更小的块,以便于后续处理和分析。无论是构建 RAG(Retrieve-Augment-Generate)模型,还是进行大规模文本处理,分块都是一项基础且关键的步骤。然而,现有的许多分块工具要么功能过于复杂,要么过于简陋,难以满足开发者的实际需求。
幸运的是,现在有了 Chonkie —— 一个简单易用的 Python 库,它专注于提供高效且灵活的文本分块解决方案。本文将详细介绍如何使用 Chonkie 快速上手文本分块,并通过几个实际示例展示其强大的功能。

什么是 Chonkie?

Chonkie 是一个轻量级的 Python 库,旨在简化文本分块的过程。它提供了多种分块策略,包括基于句子的分块、递归分块、语义分块和双通道合并分块等,能够满足不同场景下的需求。Chonkie 的设计目标是简单、高效且易于扩展,让开发者能够专注于核心业务逻辑,而不是被复杂的分块逻辑所困扰。
安装 Chonkie
在开始之前,您需要先安装 Chonkie。可以通过以下命令快速安装:

1
pip install chonkie

示例文本
为了更好地展示 Chonkie 的功能,我们将使用以下示例文本:

1
2
3
4
text = '''团圆年|且行且思谋新篇
编者按:春节,是中华民族传统节日,是万家团圆、辞旧迎新的日子。新时代以来,每到年味渐浓之时,习近平总书记都会深入到群众当中,问冷暖送祝福、听民声解民忧。值此辞旧迎新之际,央视网推出系列特稿,与您一起循着总书记新春足迹,感悟深厚的人民情怀。
在中国传统文化中,春节是一年之始,也是万象更新的时刻。每年春节前夕走基层,习近平总书记总是一路调研、一路思索,为各地发展部署谋划。
为乡村振兴谋新篇'''

句子分块器(SentenceChunker)

句子分块器将文本拆分为多个块,同时保留完整的句子边界。这对于需要保持句子完整性的任务非常有用。

1
2
3
4
5
6
7
8
9
10
11
12
13
from chonkie import SentenceChunker

chunker = SentenceChunker(
tokenizer="gpt2", # 使用 GPT-2 分词器
chunk_size=512, # 每个块的最大字符数
chunk_overlap=128, # 块之间的重叠字符数
min_sentences_per_chunk=1 # 每个块最少包含的句子数
)
chunks = chunker.chunk(text)
for chunk in chunks:
print(f"文本块内容: {chunk.text}")
print(f"令牌数量: {chunk.token_count}")
print(f"句子数量: {len(chunk.sentences)}")

递归分块器(RecursiveChunker)

递归分块器以递归方式将文档分块为较小的块,适用于结构良好的长文档。

1
2
3
4
5
6
7
8
9
10
11
12
from chonkie import RecursiveChunker, RecursiveRules

chunker = RecursiveChunker(
tokenizer="gpt2", # 使用 GPT-2 分词器
chunk_size=512, # 每个块的最大令牌数
rules=RecursiveRules(), # 使用默认的递归规则
min_characters_per_chunk=12 # 每个块最少包含的字符数
)
chunks = chunker.chunk(text)
for chunk in chunks:
print(f"文本块内容: {chunk.text}")
print(f"令牌数量: {chunk.token_count}")

语义分块器(SemanticChunker)

语义分块器根据语义相似性将文本拆分为块,确保相关内容位于同一块中。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
from chonkie import SemanticChunker

chunker = SemanticChunker(
embedding_model="minishlab/potion-base-8M", # 使用嵌入模型
threshold=0.5, # 分块的阈值
chunk_size=512, # 每个分块的最大令牌数
min_sentences=1 # 每个分块最少包含的句子数
)

chunks = chunker.chunk(text)

for chunk in chunks:
print(f"文本块内容: {chunk.text}")
print(f"令牌数量: {chunk.token_count}")
print(f"分块中的句子数量: {len(chunk.sentences)}")

双通道合并分块器(SDPMChunker)

双通道合并分块器通过语义相似性分组,然后在跳过窗口中合并相似的组,适用于具有重复主题的文档。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
from chonkie import SDPMChunker

chunker = SDPMChunker(
embedding_model="minishlab/potion-base-8M", # 使用嵌入模型
threshold=0.5, # 分块的阈值
chunk_size=512, # 每个分块的最大令牌数
min_sentences=1, # 每个分块最少包含的句子数
skip_window=1 # 跳过窗口大小
)

chunks = chunker.chunk(text)

for chunk in chunks:
print(f"分块内容: {chunk.text}")
print(f"令牌数量: {chunk.token_count}")
print(f"分块句子数量: {len(chunk.sentences)}")

总结

Chonkie 提供了多种灵活的分块策略,能够满足不同场景下的需求。无论是基于句子的分块、递归分块,还是语义分块和双通道合并分块,Chonkie 都能以简单高效的方式完成任务。通过本文的介绍,您应该已经掌握了如何使用 Chonkie 进行文本分块。更多详细信息和高级功能,可以参考 Chonkie 官方文档。