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

按句子切分文本、保留 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 + 正则

相关文章:

  • 数据中台-常用工具组件:DataX、Flink、Dolphin Scheduler、TensorFlow和PyTorch等
  • 计算机视觉与深度学习 | 基于Transformer的低照度图像增强技术
  • 从知识图谱到精准决策:基于MCP的招投标货物比对溯源系统实践
  • 【银河麒麟高级服务器操作系统】服务器外挂存储ioerror分析及处理分享
  • flinksql bug : Max aggregate function does not support type: CHAR
  • Debian系统详解
  • UV使用官网
  • 【C语言】--指针超详解(二)
  • 基于Kubernetes的Apache Pulsar云原生架构解析与集群部署指南(上)
  • 408考研逐题详解:2009年第10题
  • 美化IDEA注释:Idea 中快捷键 Ctrl + / 自动注释的缩进(避免添加注释自动到行首)以及 Ctrl + Alt + l 全局格式化代码的注释缩进
  • 从0到1:用Lask/Django框架搭建个人博客系统(4/10)
  • IT/OT 融合架构下的工业控制系统安全攻防实战研究
  • 美化cmd窗格----添加背景图
  • 一文读懂Nginx应用之 HTTP负载均衡(七层负载均衡)
  • 软考知识点汇总
  • 【C++】手搓一个STL风格的string容器
  • 数字孪生市场格局生变:中国2025年规模214亿,工业制造领域占比超40%
  • SpringAI实现AI应用-使用redis持久化聊天记忆
  • 如何在Vue-Cli中使用Element-UI和Echarts和swiper插件(低版本)
  • 中国以“大幅开放市场”回应贸易保护主义
  • 甘肃临夏州政协委员马全成涉嫌诈骗罪,被撤销政协委员资格
  • 国铁集团:铁路五一假期旅客发送量累计已超1亿人次
  • 库里22分赢下抢七大战,火箭10年难破“火勇大战”的魔咒
  • 农村青年寻路纪|劳动者的书信⑤
  • 执掌伯克希尔60年,股神巴菲特宣布年底交出最终决定权:阿贝尔将接任CEO