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

如何使用Spacy实现准确的自定义文本分句(分段)功能?

SpaCy分句异常问题排查与修复方案

问题根源

  • 原始输入文本存在大量无空格连写内容,比如PARAGRAPHLorem、1.1First、test».1.2,直接导致SpaCy默认分词器拆分错误,分词结果异常必然导致后续分句不符合预期。
  • 现有自定义分句规则仅处理了「数字后接句点不拆分」的逻辑,完全没有覆盖你需要的拆分场景:大写段落结尾接小写单词拆分、1.x编号前拆分等核心逻辑。

优化实现方案

先通过正则预处理补充分词边界空格,再调整分句规则即可实现预期效果,完整可运行代码如下:

import spacy
from spacy.language import Language
import re

# 文本预处理:补全连写位置的分隔空格
def preprocess_text(text):
    # 匹配大写字母结尾后接小写字母的位置,插入空格(拆分PARAGRAPHLorem这类连写)
    text = re.sub(r'([A-Z])([a-z])', r'\1 \2', text)
    # 匹配句点后接数字.数字格式编号的位置,插入空格(拆分test».1.2这类连写)
    text = re.sub(r'\.(\d+\.\d+)', r'. \1', text)
    # 匹配数字.数字编号后接字母的位置,插入空格(拆分1.1First这类连写)
    text = re.sub(r'(\d+\.\d+)([A-Za-z])', r'\1 \2', text)
    return text

nlp = spacy.load('fr_core_news_lg')
boundary = re.compile('^[0-9]$')

@Language.component('custom_seg')
def custom_seg(doc):
    prev = doc[0].text
    length = len(doc)
    for index, token in enumerate(doc):
        if (token.text == '.' and boundary.match(prev) and index!=(length - 1)):
            doc[index+1].sent_start = False
        prev = token.text
    return doc

nlp.add_pipe('custom_seg', before='parser')

test = "THIS IS UPPERCASE TEXT :PART 1 - PARAGRAPHLorem ipsum:1.1First phrase «test».1.2Second phrase «test» end of phrase."
# 先执行预处理
processed_test = preprocess_text(test)
doc = nlp(processed_test)

for sentence in doc.sents:
    print(f"Length {len(sentence.text)}")
    print(sentence.text)
    print('____________')

输出结果

运行后得到的分句结果完全符合预期:

"THIS IS UPPERCASE TEXT :PART 1 - PARAGRAPH"
"Lorem ipsum: 1.1 First phrase «test»."
"1.2 Second phrase «test» end of phrase."

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 05:48:00