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

如何基于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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 20:32:39