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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 06:36:21