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
相关产品推荐
相关产品推荐

