📌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)

七、适用场景

  1. LLM / RAG 预处理:将长文档切分为句子级 chunk
  2. TTS 流水线:按句子合成,降低首包延迟
  3. 字幕生成:ASR 转写后的句子边界校正
  4. 信息抽取 / 情感分析:句子粒度的 NLP 任务输入

八、注意事项

  • 规则型分句器对极端口语、无标点文本效果有限,此类场景可考虑结合 VAD/标点恢复模型
  • 中文分句依赖标点符号,缺少标点的连续文本可能无法正确切分
  • 选择正确的 language 参数很重要,不同语言使用不同的 Golden Rules

九、参考资料

GitHub 仓库 | 论文 (arXiv) | Pragmatic Segmenter (Ruby 原版)


文档生成时间:2026-06-26