semchunk

semchunk

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

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

semchunk文本分块Python库语义分析自然语言处理Github开源项目

semchunk

<a href="https://pypi.org/project/semchunk/" alt="PyPI 版本"><img src="https://img.shields.io/pypi/v/semchunk"></a> <a href="https://github.com/umarbutler/semchunk/actions/workflows/ci.yml" alt="构建状态"><img src="https://img.shields.io/github/actions/workflow/status/umarbutler/semchunk/ci.yml?branch=main"></a> <a href="https://app.codecov.io/gh/umarbutler/semchunk" alt="代码覆盖率"><img src="https://img.shields.io/codecov/c/github/umarbutler/semchunk"></a> <a href="https://pypistats.org/packages/semchunk" alt="下载量"><img src="https://img.shields.io/pypi/dm/semchunk"></a>

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许可证授权。

编辑推荐精选

讯飞智文

讯飞智文

一键生成PPT和Word,让学习生活更轻松

讯飞智文是一个利用 AI 技术的项目,能够帮助用户生成 PPT 以及各类文档。无论是商业领域的市场分析报告、年度目标制定,还是学生群体的职业生涯规划、实习避坑指南,亦或是活动策划、旅游攻略等内容,它都能提供支持,帮助用户精准表达,轻松呈现各种信息。

热门AI工具AI办公办公工具讯飞智文AI在线生成PPTAI撰写助手多语种文档生成AI自动配图
讯飞星火

讯飞星火

深度推理能力全新升级,全面对标OpenAI o1

科大讯飞的星火大模型,支持语言理解、知识问答和文本创作等多功能,适用于多种文件和业务场景,提升办公和日常生活的效率。讯飞星火是一个提供丰富智能服务的平台,涵盖科技资讯、图像创作、写作辅助、编程解答、科研文献解读等功能,能为不同需求的用户提供便捷高效的帮助,助力用户轻松获取信息、解决问题,满足多样化使用场景。

模型训练热门AI工具内容创作智能问答AI开发讯飞星火大模型多语种支持智慧生活
Spark-TTS

Spark-TTS

一种基于大语言模型的高效单流解耦语音令牌文本到语音合成模型

Spark-TTS 是一个基于 PyTorch 的开源文本到语音合成项目,由多个知名机构联合参与。该项目提供了高效的 LLM(大语言模型)驱动的语音合成方案,支持语音克隆和语音创建功能,可通过命令行界面(CLI)和 Web UI 两种方式使用。用户可以根据需求调整语音的性别、音高、速度等参数,生成高质量的语音。该项目适用于多种场景,如有声读物制作、智能语音助手开发等。

Trae

Trae

字节跳动发布的AI编程神器IDE

Trae是一种自适应的集成开发环境(IDE),通过自动化和多元协作改变开发流程。利用Trae,团队能够更快速、精确地编写和部署代码,从而提高编程效率和项目交付速度。Trae具备上下文感知和代码自动完成功能,是提升开发效率的理想工具。

热门AI工具生产力协作转型TraeAI IDE
咔片PPT

咔片PPT

AI助力,做PPT更简单!

咔片是一款轻量化在线演示设计工具,借助 AI 技术,实现从内容生成到智能设计的一站式 PPT 制作服务。支持多种文档格式导入生成 PPT,提供海量模板、智能美化、素材替换等功能,适用于销售、教师、学生等各类人群,能高效制作出高品质 PPT,满足不同场景演示需求。

讯飞绘文

讯飞绘文

选题、配图、成文,一站式创作,让内容运营更高效

讯飞绘文,一个AI集成平台,支持写作、选题、配图、排版和发布。高效生成适用于各类媒体的定制内容,加速品牌传播,提升内容营销效果。

AI助手热门AI工具AI创作AI辅助写作讯飞绘文内容运营个性化文章多平台分发
材料星

材料星

专业的AI公文写作平台,公文写作神器

AI 材料星,专业的 AI 公文写作辅助平台,为体制内工作人员提供高效的公文写作解决方案。拥有海量公文文库、9 大核心 AI 功能,支持 30 + 文稿类型生成,助力快速完成领导讲话、工作总结、述职报告等材料,提升办公效率,是体制打工人的得力写作神器。

openai-agents-python

openai-agents-python

OpenAI Agents SDK,助力开发者便捷使用 OpenAI 相关功能。

openai-agents-python 是 OpenAI 推出的一款强大 Python SDK,它为开发者提供了与 OpenAI 模型交互的高效工具,支持工具调用、结果处理、追踪等功能,涵盖多种应用场景,如研究助手、财务研究等,能显著提升开发效率,让开发者更轻松地利用 OpenAI 的技术优势。

Hunyuan3D-2

Hunyuan3D-2

高分辨率纹理 3D 资产生成

Hunyuan3D-2 是腾讯开发的用于 3D 资产生成的强大工具,支持从文本描述、单张图片或多视角图片生成 3D 模型,具备快速形状生成能力,可生成带纹理的高质量 3D 模型,适用于多个领域,为 3D 创作提供了高效解决方案。

3FS

3FS

一个具备存储、管理和客户端操作等多种功能的分布式文件系统相关项目。

3FS 是一个功能强大的分布式文件系统项目,涵盖了存储引擎、元数据管理、客户端工具等多个模块。它支持多种文件操作,如创建文件和目录、设置布局等,同时具备高效的事件循环、节点选择和协程池管理等特性。适用于需要大规模数据存储和管理的场景,能够提高系统的性能和可靠性,是分布式存储领域的优质解决方案。

下拉加载更多