当前位置: 首页 > backend >正文

按句子切分文本、保留 token 对齐信息、**适配 tokenizer(如 BERT)**这种需求

在之前的文章中我解释了 把长文本切分成一句一句的小段(chunk),每一段尽量是一个完整的句子,而不是强行按字数截断。 但是这个方法自己写会比较复杂,有很多处理这种场景的工具可以直接拿来用。

下面就 处理按句子切分文本保留 token 对齐信息、**适配 tokenizer(如 BERT)**这种需求,有好用的工具库省去复杂的手动处理工作。下面我列出几个常用的工具库,并说明它们适合什么场景:


🔧 1. NLTK(自然语言工具包)

✅ 特点:

  • 提供强大的句子切分工具(sent_tokenize
  • 适合英文,中文用起来需要配合其它工具

🔍 示例代码(英文):

from nltk.tokenize import sent_tokenizetext = "Today is a good day. Let's go for a walk."
sentences = sent_tokenize(text)
print(sentences)
# 输出: ['Today is a good day.', "Let's go for a walk."]

🚫 局限:

  • 中文切句不准确
  • 不提供 token offset 信息(和 tokenizer 无法对齐)

🔧 2. spaCy

✅ 特点:

  • 句子分割(Sentence Segmentation)精准
  • 多语言支持
  • 可获取 token 的位置信息(offset)

🔍 示例(英文):

import spacynlp = spacy.load("en_core_web_sm")
doc = nlp("This is the first sentence. Here's the second.")for sent in doc.sents:print(sent.text, sent.start_char, sent.end_char)

🚫 局限:

  • 中文支持一般(可用 spacy-zhpkuseg 插件)
  • transformers 的 tokenizer 不一定对齐(除非特殊处理)

🔧 3. Stanza(Stanford NLP)

✅ 特点:

  • 多语言支持,包括中文
  • 分词、句子切分、词性、NER一站式搞定
  • 可拿到每个 token 的原始文本位置

安装:

pip install stanza

示例:

import stanza
stanza.download('zh')  # 下载中文模型
nlp = stanza.Pipeline(lang='zh', processors='tokenize')
doc = nlp("今天天气很好。我们一起去公园吧!")for sentence in doc.sentences:print(sentence.text)

👍 优势:

  • 中文分句表现好
  • 保留原始 token 位置

🔧 4. transformers + jieba(中文分词)

当你用的是 HuggingFace 的 transformers 模型(如 BERT、LLaMA),推荐做法是结合中文分词器(如 jieba)先切句,再送 tokenizer。

import jieba
import redef cut_sent(text):return re.split('(?<=[。!?])', text)  # 保留句号text = "今天天气不错。我们一起去公园玩吧!好不好?"
sentences = cut_sent(text)
print(sentences)

🚫 局限:

  • 只按标点切句,不如 NLP 库智能
  • 没有 token 对齐位置信息(unless 自己配合 tokenizer 来计算)

🔧 5. textsplit / split_into_sentences(轻量工具)

一些轻量的工具库也可用,比如 textsplit,或者你可以使用 GitHub 上流行的 Python 函数(如 split_into_sentences)直接复制到项目中。


✅ 如果你想处理中文、对 tokenizer 精准对齐,还要用于 embedding、RAG,我推荐:

方案说明
Stanza适合中文语料,支持 offset 提取
spaCy + zh_core_web_trf中文大模型句子切分(可调插件)
✅ 自己封装 tokenizer + offset_mapping(这段代码)最精准,适配 HuggingFace 模型,推荐用于高质量任务
🔄 jieba + re.split()简单好用,适合轻量应用场景

🔚 小结:选哪种工具取决于你的需求

场景推荐工具
英文、快速开发nltk / spaCy
中文、需要高质量切句Stanza / spaCy + zh plugin
transformers tokenizer 结果严格对齐自定义 tokenizer + offset 方案(这段代码)
不要求 offset,只想快速切句jieba + 正则
http://www.xdnf.cn/news/4670.html

相关文章:

  • 【25软考网工】第五章(9)路由协议BGP、IS IS
  • PPT画图导出为PDF格式
  • 《云计算》第三版总结
  • Java 24:重构数字信任边界 —— 后量子时代的智能安全防御体系构建
  • 从装饰器出发,优雅处理 UI 自动化中的异常
  • Lost connect to debugger on ‘iphone‘
  • Webug4.0靶场通关笔记21- 第26关URL不安全跳转
  • 【Ubuntu】Netplan静态网络配置
  • 【ArcGIS技巧】用地块生成界址点去重、顺时针编号挂接DKBM属性
  • 四、Hadoop 2.X vs 3.X:特性、架构与性能全解析
  • 趣味编程:爱心
  • 昆仑万维财报解读:AI商业化卷王
  • CF每日5题
  • 《数据结构初阶》【链式二叉树】
  • 【时时三省】(C语言基础)怎样定义和引用二维数组
  • 数字孪生医疗:构建患者特异性数字孪生体路径探析
  • 【NLP 71、常见大模型的模型结构对比】
  • 缓存套餐-01.Spring Cache入门案例
  • 阿里云 golang 一面
  • 【开源】Python打造高效剪贴板历史管理器:实现跨平台生产力工具
  • 使用 Vite 创建 Vue 3 项目并手动配置路由的完整步骤
  • 如何通过服务主体获取 Azure 凭据
  • Ansible 流程控制
  • MySQL的索引和事务
  • @AutoConfigureBefore功能简介-笔记
  • ideal创建Springboot项目(Maven,yml)
  • 在Git历史中移除现有的Commit
  • Python 异常处理与文件 IO 操作:构建健壮的数据处理体系(3/10)
  • 高低比率策略
  • 天选5Pro(锐龙版)设备声音、显卡消失等问题完整解决记录