列表元素合并:合并连续非'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
相关产品推荐
相关产品推荐

