You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用NLTK与Python拆分长文本为段落?

用NLTK实现大文本段落拆分的方案

当然可以用NLTK来搞定这个需求!而且它的工具链正好能和你后续的NLP处理无缝衔接,比单独用正则更贴合NLP工作流。

核心方案:用BlanklineTokenizer直接拆分

NLTK的tokenize模块里自带了BlanklineTokenizer,专门用来按一个或多个空行拆分段落——这正好匹配你提到的“多个换行符分隔段落”的场景,连你之前的正则清理步骤都能省掉!

完整代码示例

from nltk.tokenize import BlanklineTokenizer

# 读取大型文本文件(比如《堂吉诃德》)
with open("don_quijote.txt", "r", encoding="utf-8") as f:
    raw_text = f.read()

# 初始化段落分词器,自动处理连续空行
tokenizer = BlanklineTokenizer()
paragraphs = tokenizer.tokenize(raw_text)

# 统计段落信息(和你之前的输出逻辑对齐)
total_paragraphs = len(paragraphs)
# 由于BlanklineTokenizer会自动跳过空行,空块数量为0
blank_blocks = sum(1 for para in paragraphs if para.strip() == "")
non_empty_blocks = total_paragraphs - blank_blocks

print(f"Total paragraphs: {total_paragraphs}, total blank lines: 0, total non empty blocks: {non_empty_blocks}")

为什么这个方案更适合你?

  1. 无需手动清理文本:BlanklineTokenizer会自动将连续的多个换行(不管是2个还是更多)视为段落分隔符,直接输出干净的段落列表,省去了re.sub的预处理步骤。
  2. 无缝衔接后续NLTK操作:如果你接下来要用NLTK做分句、分词、词性标注等操作,可以直接在拆分好的段落上继续处理,比如:
    from nltk.tokenize import sent_tokenize
    
    # 把每个段落拆成句子
    paragraph_sentences = [sent_tokenize(para) for para in paragraphs]
    
  3. 符合NLP工具链习惯:用NLTK的原生工具处理文本,后续维护和扩展(比如自定义分段规则)会更方便。

自定义分段的扩展思路

如果以后你需要更复杂的分段逻辑(比如除了空行,还要识别特定格式的分隔符),可以基于NLTK的TokenizerI基类自定义分词器,不过对于你当前的需求,BlanklineTokenizer完全够用。

内容的提问来源于stack exchange,提问作者santi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 04:01:41