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

列表元素合并:合并连续非'O'标记的元组

我来帮你搞定这个实体合并的需求!这里有个通用的Python实现,能处理任意长度的元组列表,不管有多少连续的非'O'实体都能正确合并:

解决方案

下面是一个适配所有场景的Python函数,核心思路是遍历列表时把连续的非'O'元组临时缓存,遇到'O'或者列表结束时再统一合并:

def merge_consecutive_entities(tuple_list):
    merged_result = []
    current_entity_tokens = []
    current_entity_label = None
    
    for token, label in tuple_list:
        if label != 'O':
            # 碰到非O标签的元素,加入当前实体的缓存列表
            current_entity_tokens.append(token)
            current_entity_label = label
        else:
            # 碰到O标签,先检查有没有缓存的实体需要合并
            if current_entity_tokens:
                merged_result.append((' '.join(current_entity_tokens), current_entity_label))
                current_entity_tokens = []
                current_entity_label = None
            # 把当前O标签的元组直接加入结果
            merged_result.append((token, label))
    
    # 处理列表末尾可能剩下的未合并实体(比如列表最后几个都是非O标签的情况)
    if current_entity_tokens:
        merged_result.append((' '.join(current_entity_tokens), current_entity_label))
    
    return merged_result

用你的例子测试

把你提供的输入列表传入函数,就能得到预期的输出:

input_list = [('fruit', 'O'), ('is', 'O'), ('the', 'O'), ('subject', 'O'), ('of', 'O'), ('a', 'O'), ('Roald', 'PERSON'), ('Dahl', 'PERSON'), ('children', 'O'), ("'s", 'O'), ('book', 'O'), ('?', 'O')]
output = merge_consecutive_entities(input_list)
print(output)
# 输出结果:[('fruit', 'O'), ('is', 'O'), ('the', 'O'), ('subject', 'O'), ('of', 'O'), ('a', 'O'), ('Roald Dahl', 'PERSON'), ('children', 'O'), ("'s", 'O'), ('book', 'O'), ('?', 'O')]

这个方法的通用性

  • 支持任意长度的输入列表,遍历一次即可完成,效率稳定
  • 能处理任意数量的连续非'O'元组,比如三个连续的PERSON标签会合并成一个完整的实体(例如[('John', 'PERSON'), ('Doe', 'PERSON'), ('Smith', 'PERSON')]会变成[('John Doe Smith', 'PERSON')])
  • 兼容混合实体场景,比如列表中同时存在多段不同类型的非'O'实体,也能各自独立合并

内容的提问来源于stack exchange,提问作者Colin Burke

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:32:41