Project Icon

semchunk

快速准确的文本语义分块Python库

semchunk是一个高效的Python文本分块库,能将文本分割成语义连贯的片段。与同类库相比,它在语义准确性和处理速度方面都有显著提升。该库采用先进的分块算法,兼容多种分词器和token计数工具,可处理单条或批量文本,并支持多进程加速。semchunk适用于大规模文本处理和各类自然语言分析任务。

semchunk

semchunk是一个快速轻量的Python库,用于将文本分割成语义有意义的块。

由于其复杂而高效的分块算法,semchunk在语义准确性上比langchain.text_splitter.RecursiveCharacterTextSplitter更优(参见工作原理🔍),同时也比semantic-text-splitter快90%以上(参见基准测试📊)。

安装📦

可以使用pip安装semchunk

pip install semchunk

使用👩‍💻

以下代码片段演示了如何使用semchunk对文本进行分块:

import semchunk
from transformers import AutoTokenizer # `transformers`和`tiktoken`都不是必需的,
import tiktoken                        # 这里仅用于演示目的。

chunk_size = 2 # 这里使用较小的块大小仅用于演示。请注意,
               # 除非使用自定义token计数器,否则`semchunk`不会考虑特殊token,
               # 所以你可能需要将块大小减去tokenizer添加的特殊token数量。
text = 'The quick brown fox jumps over the lazy dog.'

# 如下所示,`semchunk.chunkerify`接受所有OpenAI模型名称、OpenAI `tiktoken`编码和
# Hugging Face模型(按此优先顺序),以及具有`encode()`方法的自定义tokenizer
#(如`tiktoken`、`transformers`和`tokenizers`的tokenizer),最后是任何能接受文本
# 并返回其token数量的函数。
chunker = semchunk.chunkerify('umarbutler/emubert', chunk_size) or \
          semchunk.chunkerify('gpt-4', chunk_size) or \
          semchunk.chunkerify('cl100k_base', chunk_size) or \
          semchunk.chunkerify(AutoTokenizer.from_pretrained('umarbutler/emubert'), chunk_size) or \
          semchunk.chunkerify(tiktoken.encoding_for_model('gpt-4'), chunk_size) or \
          semchunk.chunkerify(lambda text: len(text.split()), chunk_size)

# 生成的`chunker`可以处理单个文本或文本列表,分别返回块列表或块列表的列表。
assert chunker(text) == ['The quick', 'brown', 'fox', 'jumps', 'over the', 'lazy', 'dog.']
assert chunker([text], progress = True) == [['The quick', 'brown', 'fox', 'jumps', 'over the', 'lazy', 'dog.']]

# 如果你有大量文本需要分块,且速度是一个考虑因素,你也可以通过将`processes`设置为大于1的数值来启用多进程。
assert chunker([text], processes = 2) == [['The quick', 'brown', 'fox', 'jumps', 'over the', 'lazy', 'dog.']]

Chunkerify

def chunkerify(
    tokenizer_or_token_counter: str | tiktoken.Encoding | transformers.PreTrainedTokenizer | \
                                tokenizers.Tokenizer | Callable[[str], int],
    chunk_size: int = None,
    max_token_chars: int = None,
    memoize: bool = True,
) -> Callable[[str | Sequence[str], bool, bool], list[str] | list[list[str]]]:

chunkerify()构建一个分块器,将一个或多个文本分割成由指定tokenizer或token计数器确定大小的语义有意义的块。

tokenizer_or_token_counter可以是:tiktokentransformers tokenizer的名称(优先考虑前者);具有encode属性的tokenizer(例如tiktokentransformerstokenizers的tokenizer);或返回输入token数量的token计数器。 chunk_size是一个块可能包含的最大令牌数。它默认为None,在这种情况下,它将被设置为与分词器的model_max_length属性相同的值(减去尝试对空字符串进行分词返回的令牌数),如果可能的话;否则将引发ValueError

max_token_chars是一个令牌可能包含的最大字符数。它用于显著加快长输入的令牌计数。它默认为None,在这种情况下,要么不使用它,要么如果可能,将其设置为分词器词汇表中最长令牌的字符数,由token_byte_valuesget_vocab方法确定。

memoize标志是否对令牌计数器进行记忆化。它默认为True

此函数返回一个分块器,它接受单个文本或一系列文本,如果提供了单个文本,则返回最多chunk_size个令牌长的块列表,去除用于分割文本的任何空白;如果提供了多个文本,则返回块的列表列表,每个内部列表对应于所提供输入文本之一的块。

生成的分块器可以传递一个processes参数,指定在对多个文本进行分块时要使用的进程数。

还可以传递一个progress参数,如果设置为True并且传递了多个文本,将显示一个进度条。

从技术上讲,分块器将是semchunk.Chunker类的一个实例,以协助类型提示,尽管这应该不会影响其使用方式。

分块

def chunk(
    text: str,
    chunk_size: int,
    token_counter: Callable,
    memoize: bool = True,
) -> list[str]

chunk()函数将文本分割成语义上有意义的块,大小由提供的令牌计数器确定。

text是要分块的文本。

chunk_size是一个块可能包含的最大令牌数。

token_counter是一个可调用对象,它接受一个字符串并返回其中的令牌数。

memoize标志是否对令牌计数器进行记忆化。它默认为True

此函数返回最多chunk_size个令牌长的块列表,去除用于分割文本的任何空白。

工作原理 🔍

semchunk通过递归分割文本,直到所有结果块等于或小于指定的块大小。具体而言,它:

  1. 使用可能的最具语义意义的分割器分割文本;
  2. 递归分割结果块,直到产生一组等于或小于指定块大小的块;
  3. 将任何小于块大小的块重新合并,直到达到块大小;
  4. 将任何非空白分割器重新附加到块的末尾(除最后一个块外),如果这样做不会使块超过块大小,否则将非空白分割器作为单独的块添加。

为确保块在语义上尽可能有意义,semchunk按以下优先顺序使用以下分割器:

  1. 最大的换行符(\n)和/或回车符(\r)序列;
  2. 最大的制表符序列;
  3. 最大的空白字符序列(由正则表达式的\s字符类定义);
  4. 句子终止符(.?!*);
  5. 子句分隔符(;,()[]""'''"`);
  6. 句子中断符(:);
  7. 单词连接符(/\&-);
  8. 所有其他字符。

基准测试 📊

在一台配备Ryzen 3600、64 GB RAM、Windows 11和Python 3.11.9的台式机上,semchunk花费6.69秒将NLTK的Gutenberg语料库中的每个样本分割成512个令牌长的块,使用GPT-4的分词器(作为参考,该语料库包含18个文本和3,001,260个令牌)。相比之下,semantic-text-splitter需要116.48秒将相同的文本分割成512个令牌长的块——差异为94.26%。

用于对semchunksemantic-text-splitter进行基准测试的代码可在此处获得。

许可证 📄

该库根据MIT许可证授权。

项目侧边栏1项目侧边栏2
推荐项目
Project Cover

豆包MarsCode

豆包 MarsCode 是一款革命性的编程助手,通过AI技术提供代码补全、单测生成、代码解释和智能问答等功能,支持100+编程语言,与主流编辑器无缝集成,显著提升开发效率和代码质量。

Project Cover

AI写歌

Suno AI是一个革命性的AI音乐创作平台,能在短短30秒内帮助用户创作出一首完整的歌曲。无论是寻找创作灵感还是需要快速制作音乐,Suno AI都是音乐爱好者和专业人士的理想选择。

Project Cover

有言AI

有言平台提供一站式AIGC视频创作解决方案,通过智能技术简化视频制作流程。无论是企业宣传还是个人分享,有言都能帮助用户快速、轻松地制作出专业级别的视频内容。

Project Cover

Kimi

Kimi AI助手提供多语言对话支持,能够阅读和理解用户上传的文件内容,解析网页信息,并结合搜索结果为用户提供详尽的答案。无论是日常咨询还是专业问题,Kimi都能以友好、专业的方式提供帮助。

Project Cover

阿里绘蛙

绘蛙是阿里巴巴集团推出的革命性AI电商营销平台。利用尖端人工智能技术,为商家提供一键生成商品图和营销文案的服务,显著提升内容创作效率和营销效果。适用于淘宝、天猫等电商平台,让商品第一时间被种草。

Project Cover

吐司

探索Tensor.Art平台的独特AI模型,免费访问各种图像生成与AI训练工具,从Stable Diffusion等基础模型开始,轻松实现创新图像生成。体验前沿的AI技术,推动个人和企业的创新发展。

Project Cover

SubCat字幕猫

SubCat字幕猫APP是一款创新的视频播放器,它将改变您观看视频的方式!SubCat结合了先进的人工智能技术,为您提供即时视频字幕翻译,无论是本地视频还是网络流媒体,让您轻松享受各种语言的内容。

Project Cover

美间AI

美间AI创意设计平台,利用前沿AI技术,为设计师和营销人员提供一站式设计解决方案。从智能海报到3D效果图,再到文案生成,美间让创意设计更简单、更高效。

Project Cover

稿定AI

稿定设计 是一个多功能的在线设计和创意平台,提供广泛的设计工具和资源,以满足不同用户的需求。从专业的图形设计师到普通用户,无论是进行图片处理、智能抠图、H5页面制作还是视频剪辑,稿定设计都能提供简单、高效的解决方案。该平台以其用户友好的界面和强大的功能集合,帮助用户轻松实现创意设计。

投诉举报邮箱: service@vectorlightyear.com
@2024 懂AI·鲁ICP备2024100362号-6·鲁公网安备37021002001498号