如何在SpaCy自定义管道中将Doc按句拆分为独立Doc传入后续组件
可行实现方案
SpaCy原生管道固定为单Doc输入、单Doc输出的线性流转逻辑,不需要强行修改管道核心机制,用以下两种方案都可以实现你的需求,且不会破坏管道原有兼容性:
方案1:组件内部调用textcat处理单句(推荐)
这种方案完全符合管道的输入输出规范,不会影响其他内置组件、批处理逻辑和模型序列化能力,是生产环境最稳妥的实现方式。
核心逻辑是在自定义组件内部,直接将句子对应的Span对象转为独立Doc,手动调用已训练好的textcat组件完成单句推理,最后把筛选结果存在Doc的扩展属性中供后续组件使用。
完整实现代码如下:
import spacy from spacy.language import Language from spacy.tokens import Doc, Span # 注册自定义管道组件工厂 @Language.factory("sent_level_textcat_filter") def create_sent_level_filter(nlp, name): # 组件初始化时提前拿到训练好的textcat组件,避免每次处理Doc重复获取 textcat = nlp.get_pipe("textcat") # 初始化扩展属性,组件创建时仅注册一次 if not Span.has_extension("rel_score"): Span.set_extension("rel_score", default=0.0) if not Doc.has_extension("relevant_sents"): Doc.set_extension("relevant_sents", default=[]) def filter_component(doc): relevant_sents = [] for sent in doc.sents: # 将句子Span转为独立Doc,会继承原Doc已生成的分词、词性、句法标注,无额外算力损耗 sent_doc = sent.as_doc() # 调用textcat完成单句推理 sent_doc = textcat(sent_doc) rel_score = sent_doc.cats.get("RELEVANT", 0.0) # 把单句分类分数存在原句子的Span属性上,方便后续调用 sent._.rel_score = rel_score if rel_score > 0.5: relevant_sents.append(sent) # 把筛选出的相关句子存在Doc扩展属性中 doc._.relevant_sents = relevant_sents # 返回原Doc,符合管道输入输出规范 return doc return filter_component # 组件使用方式:加载训练好的模型后,将该组件添加到句子分割器(senter/parser)之后、其他业务组件之前即可 # nlp.add_pipe("sent_level_textcat_filter", after="senter")
方案2:拼接筛选后的句子为新Doc返回
如果后续组件不需要保留原段落的完整结构,只需要处理命中的相关句子,可以在组件末尾把所有符合阈值的句子拼接为一个新的Doc返回给下游,下游组件接收到的就是仅包含相关句子的Doc对象,同样符合单Doc流转的要求。
只需要把方案1中内部处理函数最后返回原Doc的逻辑替换为以下代码即可:
if relevant_sents: # 将所有相关句子转为Doc后拼接为一个完整Doc filtered_doc = Doc.from_docs([s.as_doc() for s in relevant_sents]) # 给新Doc同步扩展属性 filtered_doc._.relevant_sents = list(filtered_doc.sents) return filtered_doc # 没有命中的相关句子时返回对应词表的空Doc return Doc(doc.vocab)
注意事项
- 不要尝试修改SpaCy管道的核心流转逻辑来支持多Doc传递,这类修改会破坏
nlp.pipe批处理优化、模型序列化、内置组件兼容性,后续版本升级很容易出现兼容问题。 - 用
Span.as_doc()生成单句Doc比把句子文本提取出来重新走一遍完整管道效率高很多,也不会出现分词结果和原Doc不一致的问题。 - 配置管道顺序时,不需要把textcat组件放在自定义组件的下游,避免textcat先对完整Doc做一次全局推理浪费算力,放在自定义组件之后或者直接从管道中排除、仅在组件内调用即可。
内容的提问来源于stack exchange,提问作者Thet Naing
相关产品推荐
相关产品推荐

