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

Pandas实现的sandhi_builder递归函数结果异常问题求助

问题排查与修复

问题现象

sandhi_builder函数处理短输入时结果符合预期,但处理长输入如'this is bad boy sad boy'时,仅返回2个结果,而预期应为4个组合结果。

原因分析

核心问题出在sandhi_builder函数的后续拼接逻辑中:

  • 处理第三个及以后的词汇时,tmp_list被直接赋值为当前eachv处理后的结果(tmp_list = list(return_set2)),而非追加所有可能的组合。
  • 例如,当处理到'sad boy'阶段,循环遍历return_set中的'thisisbaaoy'和'thisisbapoys'时,第一个元素处理后的结果会被第二个元素的结果覆盖,最终只保留最后一次循环的结果。
  • 此外,函数开头的for k, v in enumerate(sandhi_long):循环完全冗余,它重复执行相同逻辑,对结果无实际贡献。

修复方案

修改后的代码

!echo 't t x' > sandhi_code_out.txt
!echo 'e c y' >> sandhi_code_out.txt
!echo 'e m z' >> sandhi_code_out.txt
!echo 'd b a' >> sandhi_code_out.txt
!echo 'd b p' >> sandhi_code_out.txt

import pandas as pd
df = pd.read_csv('sandhi_code_out.txt', delim_whitespace=True, header=None)

df.columns = ['a', 'b','c']

def _sandhi_builder(my):
    mylist = my.split()
    final = list()
    check = mylist[0] + ' ' + mylist[1]
    for i in [8,7,6,5,4,3,2,1]:
        for p in [0,1,2,3,4,5,6,7]:
            x = mylist[0][-i:]
            y = mylist[1][:p]
            if len(x) > 0 and len(y) > 0:
                try:
                    z = df[(df['a'] == x) & (df['b'] == y)]['c']
                    if len(z) > 0:
                        for myr in z:
                            myt = [mylist[0][-i:], mylist[1][:p]]
                            final.append(check.replace(' '.join(myt), myr))
                except:
                    pass
    return set(final)
    
    
def sandhi_builder(x):
    sandhi_long = x.split()
    # 初始化前两个词的sandhi结果
    return_set = _sandhi_builder(f"{sandhi_long[0]} {sandhi_long[1]}")
    if not return_set:
        return_set = {f"{sandhi_long[0]}{sandhi_long[1]}"}
    
    # 处理后续词汇
    for lr in range(2, len(sandhi_long)):
        tmp_list = list()
        for eachv in return_set:
            return_set2 = _sandhi_builder(f"{eachv} {sandhi_long[lr]}")
            if return_set2:
                # 追加所有可能的结果,而非覆盖
                tmp_list.extend(return_set2)
            else:
                tmp_list.append(f"{eachv}{sandhi_long[lr]}")
        return_set = set(tmp_list)
    return return_set

关键修改点

  1. 移除冗余循环:删掉开头无意义的for k, v in enumerate(sandhi_long):循环,直接初始化前两个词的处理结果。
  2. 替换赋值为追加:将tmp_list = list(return_set2)改为tmp_list.extend(return_set2),确保所有组合结果都被保留,而非被覆盖。
  3. 简化初始化逻辑:用更简洁的方式初始化return_set,避免重复代码。

验证结果

修复后调用sandhi_builder('this is bad boy sad boy'),将返回预期的4个结果:

{'thisisbaaoysaaoy', 'thisisbaaoysapoy', 'thisisbapoysaaoy', 'thisisbapoysapoy'}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 10:24:57