如何将含特殊Token的模型输出字符串转换为列表/字典?
解决方案
核心思路
利用正则表达式匹配以<new_gen>开头的实体块,每个块包含一个实体和其对应的若干<gen>标记的关系,自动适配不同长度的序列,同时移除所有特殊Token。
正则匹配规则
使用以下正则模式匹配每个实体-关系组:
<new_gen>\s+(\S+)(?:\s+<gen>\s+(\S+))*
<new_gen>\s+(\S+):匹配实体开头标记,捕获实体内容(?:\s+<gen>\s+(\S+))*:非捕获组,匹配任意数量的关系标记及关系内容,*适配0或多个关系的场景
Python 代码实现
import re # 模型输出的原始字符串 input_str = "<bos> <new_gen> ent1 <gen> rel1_ent1 <gen> rel2_ent1 <new_gen> ent2 <gen> rel1_ent2 <eos>" # 移除首尾的<bos>和<eos>特殊标记 cleaned_input = input_str.replace("<bos>", "").replace("<eos>", "").strip() # 匹配所有实体-关系组 pattern = re.compile(r'<new_gen>\s+(\S+)(?:\s+<gen>\s+(\S+))*') matches = pattern.finditer(cleaned_input) # 生成列表格式结果 result_list = [] # 生成字典格式结果 result_dict = {} for match in matches: groups = match.groups() entity = groups[0] # 过滤掉无关系时产生的None值 relations = [rel for rel in groups[1:] if rel is not None] result_list.append([entity] + relations) result_dict[entity] = relations print("列表格式结果:") print(result_list) # 输出:[['ent1', 'rel1_ent1', 'rel2_ent1'], ['ent2', 'rel1_ent2']] print("\n字典格式结果:") print(result_dict) # 输出:{'ent1': ['rel1_ent1', 'rel2_ent1'], 'ent2': ['rel1_ent2']}
适配说明
- 不管每个实体对应0个、1个还是多个关系,正则都能准确捕获
- 自动忽略所有特殊Token(
<bos>、<eos>、<new_gen>、<gen>),仅保留实体和关系内容
内容的提问来源于stack exchange,提问作者Rahul Dev
相关产品推荐
相关产品推荐

