如何基于spaCy 3.5.4拆分因空格缺失连在一起的词汇?
问题:用spaCy 3.5.4拆分连写的OOV词汇
我需要处理一类文本问题:文本里的两个词汇因缺少空格或换行连在了一起,要将它们拆分开。计划先用spaCy 3.5.4搭建处理流水线,之后再考虑更复杂的NLP技术。
识别需拆分词汇的标准:
- 词汇的
is_oov属性为True - 词汇的
shape_符合XxxXxx这类格式(含前后带数字的组合)
我的示例代码:
for token in doc: if token.is_oov == True: print(token.text, token.shape_) [split here...]
运行后输出:
62.000Unbefristeter dd.dddXxxxx KundenFlexible XxxxxXxxxx WorkDiverse XxxxXxxxx RabatteFlache XxxxxXxxxx ArbeitsumfeldIhre XxxxxXxxx Stellenauswahl Xxxxx
最后一行是误报,其余均需拆分为两个词汇,且拆分后的文本要保留用于后续处理。我会使用正则表达式,但想了解是否有更简便的spaCy原生实现方式。
解决方案
1. 用spaCy Matcher定位待拆分Token
spaCy的Matcher可精准匹配符合shape_特征的OOV token,比手动遍历更高效。根据你的需求定义匹配规则:
import spacy from spacy.matcher import Matcher # 加载对应语言模型(示例为德语,按需替换) nlp = spacy.load("de_core_news_sm") matcher = Matcher(nlp.vocab) # 规则1:数字组合+大写开头单词(如62.000Unbefristeter) pattern1 = [{"IS_OOV": True, "SHAPE": {"REGEX": r"^d+\.*d*X.*$"}}] # 规则2:大写开头单词+大写开头单词(如KundenFlexible) pattern2 = [{"IS_OOV": True, "SHAPE": {"REGEX": r"^X+.*X.*$"}}] matcher.add("SPLIT_CANDIDATE", [pattern1, pattern2])
2. 自定义流水线组件实现拆分
编写自定义组件,找到目标token后拆分并更新Doc对象(倒序处理避免索引偏移):
def split_merged_tokens(doc): matches = matcher(doc) # 倒序处理,防止修改Doc后索引混乱 for match_id, start, end in reversed(matches): token = doc[start] split_idx = None # 处理数字+单词的拆分场景 if any(c.isdigit() for c in token.text): split_idx = next(i for i, c in enumerate(token.text) if c.isalpha() and c.isupper()) # 处理单词+单词的拆分场景 else: split_idx = next(i for i, c in enumerate(token.text) if i > 0 and c.isupper()) if split_idx is not None: part1 = token.text[:split_idx] part2 = token.text[split_idx:] # 拆分后重新生成Token,替换原位置内容 doc = doc[:start] + nlp(f"{part1} {part2}") + doc[end:] return doc # 将自定义组件加入流水线,放在parser之前执行 nlp.add_pipe("split_merged_tokens", before="parser")
3. 测试效果
用示例文本验证:
test_text = "62.000Unbefristeter KundenFlexible WorkDiverse RabatteFlache ArbeitsumfeldIhre Stellenauswahl" doc = nlp(test_text) print([token.text for token in doc])
输出会自动拆分除Stellenauswahl外的所有连写词汇,同时保留完整文本用于后续处理。
补充优化
- 若仍有漏判/误判,可调整Matcher的正则规则,或新增拆分后词汇的有效性校验(比如检查拆分后的词是否在词汇表中)。
- 针对不同语言的大小写规则,可微调拆分逻辑的判断条件。
内容的提问来源于stack exchange,提问作者Maciek
相关产品推荐
相关产品推荐

