按句子切分文本、保留 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-zh
、pkuseg
插件) - 和
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 + 正则 |