📌GitHub 仓库: PyPI 包名:pysbd | 许可证:MIT | 最新版本:v0.3.4
一、库简介
pySBD(Python Sentence Boundary Disambiguation)是一个基于规则的句子边界检测 Python 库,开箱即用,无需训练模型。
该项目是 Ruby gem Pragmatic Segmenter 的 Python 移植版本,专注于在格式和领域未知的情况下,也能给出逻辑合理的句子切分结果。
相关论文《PySBD: Pragmatic Sentence Boundary Disambiguation》发表于 EMNLP 2020 NLP-OSS Workshop。英文 Golden Rule Set 测试通过率约 97.92%,显著优于同类开源 Python 工具。
二、核心特性
- 规则驱动:不依赖深度学习模型,部署简单、可解释性强
- 多语言支持:目前支持 22 种语言(含 en、zh、ja、de、fr 等)
- 边界歧义处理:能正确处理缩写(如 Dr.、p. 55)、小数、省略号等常见歧义
- 生态集成:可作为 spaCy pipeline 组件使用
- 轻量高效:纯 Python 实现,适合 NLP 预处理流水线
三、安装
pip install pysbd
# 或使用 uv
uv pip install pysbd
四、基础用法 Sample
4.1 最简示例
import pysbd
text = "My name is Jonas E. Smith. Please turn to p. 55."
# 创建分句器(language 指定语言,clean 控制是否清理文本)
seg = pysbd.Segmenter(language="en", clean=False)
sentences = seg.segment(text)
print(sentences)
# 输出:
# ['My name is Jonas E. Smith.', 'Please turn to p. 55.']
4.2 中文分句示例
import pysbd
text = "今天天气很好。我们去公园散步吧!你觉得怎么样?"
seg = pysbd.Segmenter(language="zh", clean=False)
sentences = seg.segment(text)
for i, sent in enumerate(sentences, 1):
print(f"{i}. {sent}")
4.3 批量处理长文本
import pysbd
def split_paragraphs(text: str, language: str = "en") -> list[str]:
"""将长文本按句子切分,返回非空句子列表。"""
segmenter = pysbd.Segmenter(language=language, clean=True)
return [s.strip() for s in segmenter.segment(text) if s.strip()]
long_text = """
Dr. Smith arrived at 3 p.m. He reviewed the report.
The meeting ended at 5:30 p.m. Everyone was satisfied.
"""
sentences = split_paragraphs(long_text, language="en")
print(f"共切分出 {len(sentences)} 个句子:")
for s in sentences:
print(f" - {s}")
五、与 spaCy 集成
pySBD 官方推荐作为 spaCy 的 pipeline 组件,可直接获得 doc.sents 级别的句子对象:
import spacy
from pysbd.utils import PySBDFactory
nlp = spacy.blank("en")
nlp.add_pipe(PySBDFactory(nlp))
doc = nlp("My name is Jonas E. Smith. Please turn to p. 55.")
for sent in doc.sents:
print(sent.text)
# My name is Jonas E. Smith.
# Please turn to p. 55.
六、常用参数说明
| 参数 | 说明 | 示例 |
|---|---|---|
| language | 语言代码,决定分句规则集 | en / zh / ja / de ... |
| clean | 是否对输入文本做预处理清理 | False(保留原文)/ True |
| char_span | 是否返回字符级 span 信息 | segment(text, return_char_spans=True) |
七、适用场景
- LLM / RAG 预处理:将长文档切分为句子级 chunk
- TTS 流水线:按句子合成,降低首包延迟
- 字幕生成:ASR 转写后的句子边界校正
- 信息抽取 / 情感分析:句子粒度的 NLP 任务输入
八、注意事项
- 规则型分句器对极端口语、无标点文本效果有限,此类场景可考虑结合 VAD/标点恢复模型
- 中文分句依赖标点符号,缺少标点的连续文本可能无法正确切分
- 选择正确的 language 参数很重要,不同语言使用不同的 Golden Rules
九、参考资料
GitHub 仓库 | 论文 (arXiv) | Pragmatic Segmenter (Ruby 原版)
文档生成时间:2026-06-26
No comments yet.