如何遍历Spacy中Meal标签Span并找出其完全包含的子Span?
解决Spacy中找出Meal Span内完全包含的Span问题
首先,基于你提供的示例代码,我们可以通过以下步骤实现需求:获取所有Meal标签的Span,再逐一检查其他Span是否完全处于其边界范围内。
完整代码示例
import spacy from spacy.tokens import Span sent = 'I eat 5 apples and 2 bananas.' nlp = spacy.load("en_core_web_sm") doc = nlp(sent) # 初始化自定义Span集合 doc.spans['sc'] = [ Span(doc, 2, 3, 'Ingredient'), Span(doc, 5, 6, 'Ingredient'), Span(doc, 2, 6, 'Meal')] # 1. 筛选所有标签为'Meal'的Span meal_spans = [span for span in doc.spans['sc'] if span.label_ == 'Meal'] # 2. 遍历每个Meal Span,找出完全包含在其中的Span for meal_span in meal_spans: print(f"当前Meal Span: {meal_span.text} (位置范围: {meal_span.start}-{meal_span.end})") # 筛选条件:排除自身 + 起始位置≥Meal Span起始 + 结束位置≤Meal Span结束 contained_spans = [ span for span in doc.spans['sc'] if span != meal_span and span.start >= meal_span.start and span.end <= meal_span.end ] # 输出结果 print("完全包含的子Span:") for span in contained_spans: print(f"- 内容: {span.text} | 标签: {span.label_} | 位置: {span.start}-{span.end}")
运行结果
当前Meal Span: 5 apples and 2 bananas (位置范围: 2-6) 完全包含的子Span: - 内容: apples | 标签: Ingredient | 位置: 2-3 - 内容: bananas | 标签: Ingredient | 位置: 5-6
关键说明
- 核心判断逻辑通过
span.start >= meal_span.start and span.end <= meal_span.end确保子Span完全处于Meal Span的边界内 - 用
span != meal_span排除Meal Span自身,避免无效匹配 - 如果你的Span分散在
doc.spans的多个key下,可以先合并所有Span再处理:all_spans = [span for spans in doc.spans.values() for span in spans]
内容的提问来源于stack exchange,提问作者user9092346
相关产品推荐
相关产品推荐

