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

Python词距匹配函数小样本正常但大数据集异常问题求解

问题成因与修复方案

问题成因

你的错误核心来源于对Python字典特性的误用,共3个错误点:

  • 字典键的唯一性导致list(x.keys())是原句子的去重单词列表,和原句子的长度、下标完全不匹配。小样本测试时所有句子没有重复单词,巧合可以正常运行,一旦大数据集的句子存在重复单词,用原单词的下标切分去重列表,得到的结果自然和预期完全无关。
  • 若使用的Python版本低于3.7,字典键不会保留插入顺序,list(x.keys())的单词排列顺序和原句子完全不一致,就算没有重复单词,切分结果也会完全错误。
  • 字典存储单词下标时,相同单词多次出现只会保留最后一次出现的下标,前面满足距离条件的匹配会被直接漏掉;同时你只判断了i2 - i1 <= dist,没有考虑w1出现在w2之后的场景,会漏判大量符合条件的结果。

修复方案

完全放弃预构造字典映射的逻辑,直接基于原句子的下标和内容处理,正确代码如下:

file_cont = [['man', 'once', 'upon', 'time', 'love', 
'princess'], ['python', 'code', 'cool', 'uses', 'java'],
['man', 'help', 'test', 'weird', 'love']]

def myfunc(w1, w2, dist, file_cont):
    result = []
    for sentence in file_cont:
        # 查找两个单词在当前句子的所有出现位置
        pos_w1 = [idx for idx, word in enumerate(sentence) if word == w1]
        pos_w2 = [idx for idx, word in enumerate(sentence) if word == w2]
        # 遍历所有位置对,判断是否符合距离要求
        for i1 in pos_w1:
            for i2 in pos_w2:
                if abs(i1 - i2) <= dist:
                    start = min(i1, i2)
                    end = max(i1, i2)
                    # 直接从原句子切片,避免字典带来的所有问题
                    result.append(sentence[start:end+1])
                    # 若同一个句子只要第一个匹配结果,可取消下方注释
                    # break
            # else:
            #     continue
            # break
    return result

测试调用myfunc("man", "love",4, file_cont)可以得到和之前一致的预期结果,大数据集场景下也不会出现匹配错误的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 19:39:00