text2num处理中条件逆文本归一化字符串展开问题修复
问题背景
逆文本归一化开发的text2num处理流程中,需要识别double、triple两类触发词完成字符串展开,将处理后的数值类词汇传入text2num函数生成正确结果。现有代码运行后double关键词未被正确替换,实际输出与预期不符:
- 实际输出:
my phone number is nine double eight five eight two eight seven seven seven - 预期输出:
my phone number is nine eight eight five eight two eight seven seven seven
原实现代码如下:
def string_expansion(sent): list_str = sent.split(" ") new_list = [] for index,char in enumerate(list_str): if char == "double": index +=1 new_chars = (' '.join([list_str[index][:]] * 1)) new_list = [x.replace(char , new_chars).replace(char , new_chars) for x in list_str] elif char == "triple": index +=1 new_chars = (' '.join([list_str[index][:]] * 2)) new_list = [x.replace(char , new_chars).replace(char , new_chars) for x in list_str] else: new_list return (" ".join(new_list)) sentence = "my phone number is nine double eight five eight two eight triple seven" result = string_expansion(sentence) print(result)
原代码逻辑缺陷定位
原代码无法得到正确结果,核心问题有5个:
- 循环下标修改无效:用
for index,char in enumerate(list_str)遍历的时候,循环内手动执行index +=1不会改变下一轮迭代的下标值,根本无法跳过触发词后面跟随的目标词汇。 - 重复次数计算错误:语义上
double代表后续数字重复2次,原代码写的是*1只取1次,完全没实现翻倍效果;triple代表后续数字重复3次,原代码写的是*2,少了1次重复。 - 替换逻辑完全错误:每次匹配到触发词时,都是对原始的全量词列表做字符串替换,而且只替换触发词本身,没有删除触发词、同时把后续目标词替换为重复结果;更严重的是匹配到
triple时会直接覆盖之前处理double生成的结果列表,导致double的处理逻辑完全失效。 - 存在无效死代码:else分支只有
new_list没有任何赋值操作,属于完全没用的代码;测试语句写在了函数的return后面,永远不会被执行。 - 无边界异常处理:没有考虑触发词出现在句子末尾、后面没有跟随目标词的场景,会直接触发下标越界报错。
修正后可运行代码
def string_expansion(sent): list_str = sent.split(" ") new_list = [] i = 0 str_len = len(list_str) while i < str_len: current_word = list_str[i] if current_word == "double": # 边界判断防止下标越界 if i + 1 < str_len: target_word = list_str[i+1] # double对应重复2次 new_list.extend([target_word] * 2) # 跳过后续已处理的目标词 i += 2 else: # 句尾无后续词时直接保留原词 new_list.append(current_word) i += 1 elif current_word == "triple": if i + 1 < str_len: target_word = list_str[i+1] # triple对应重复3次 new_list.extend([target_word] * 3) i += 2 else: new_list.append(current_word) i += 1 else: new_list.append(current_word) i += 1 return " ".join(new_list) # 测试用例 sentence = "my phone number is nine double eight five eight two eight triple seven" result = string_expansion(sentence) print(result)
运行代码输出为:my phone number is nine eight eight five eight two eight seven seven seven,与预期结果完全一致。
修正点说明
- 改用
while循环手动控制遍历下标,匹配到double/triple后直接向后偏移2位,跳过已经处理的触发词和目标词,避免重复遍历。 - 修正重复次数逻辑:
double对应将后续词重复2次加入结果,triple对应将后续词重复3次加入结果,符合逆文本归一化的语义要求。 - 逐词构建结果列表,匹配到触发词时直接丢弃触发词本身,把重复后的目标词加入结果,从根源避免触发词残留问题。
- 增加下标越界判断,处理触发词位于句尾的异常场景,不会抛出运行时错误。
- 清理无效代码,将测试逻辑移到函数外部,保证代码执行流程正常。
内容的提问来源于stack exchange,提问作者chalns
相关产品推荐
相关产品推荐

