如何使用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
相关产品推荐
相关产品推荐

