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

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

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


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

✅ 特点:

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

🔍 示例代码(英文):

from nltk.tokenize import sent_tokenize

text = "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 spacy

nlp = 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 re

def 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 + 正则
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值