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
关键修改点
- 移除冗余循环:删掉开头无意义的
for k, v in enumerate(sandhi_long):循环,直接初始化前两个词的处理结果。 - 替换赋值为追加:将
tmp_list = list(return_set2)改为tmp_list.extend(return_set2),确保所有组合结果都被保留,而非被覆盖。 - 简化初始化逻辑:用更简洁的方式初始化
return_set,避免重复代码。
验证结果
修复后调用sandhi_builder('this is bad boy sad boy'),将返回预期的4个结果:
{'thisisbaaoysaaoy', 'thisisbaaoysapoy', 'thisisbapoysaaoy', 'thisisbapoysapoy'}
内容的提问来源于stack exchange,提问作者shantanuo
相关产品推荐
相关产品推荐

