无特殊模块统计Bigrams频率出错,求排查与修正方案
问题分析与修正方案
你的代码核心问题在于每处理一行输入后,会遍历整个bigrams列表更新频率,而非仅统计当前行新增的双词:
- 第一次输入行时,
bigrams新增3个双词,遍历这3个后,每个双词的频率被设为1。 - 第二次输入相同行时,
bigrams再新增3个相同双词(列表总计6个元素),接着遍历整个列表,每个双词会被额外加1两次(因为每个双词在列表中出现两次),最终1+2=3,导致计数错误。
修正方案一:直接统计当前行双词(推荐)
去掉冗余的bigrams列表,在处理每行时直接更新频率字典:
bigram_frequencies = {} # 存储双词及其频率 line = input('Line: ') while line: words = line.lower().split() # 遍历当前行的相邻双词,更新频率 for i in range(len(words) - 1): bigram = f"{words[i]} {words[i+1]}" bigram_frequencies[bigram] = bigram_frequencies.get(bigram, 0) + 1 line = input('Line: ') print(bigram_frequencies)
修正方案二:保留总双词列表,仅统计当前行新增内容
如果需要保留所有双词的记录,可以先收集当前行的双词,仅统计这部分内容:
bigrams = [] # 存储所有双词记录 bigram_frequencies = {} line = input('Line: ') while line: words = line.lower().split() current_bigrams = [] # 收集当前行的双词 for i in range(len(words) - 1): bigram = f"{words[i]} {words[i+1]}" current_bigrams.append(bigram) # 仅统计当前行的双词 for bigram in current_bigrams: bigram_frequencies[bigram] = bigram_frequencies.get(bigram, 0) + 1 # 将当前行双词加入总列表 bigrams.extend(current_bigrams) line = input('Line: ') print(bigram_frequencies)
两种方案都能让输入两行「The big red ball」后,输出正确的{'the big': 2, 'big red': 2, 'red ball': 2}。
内容的提问来源于stack exchange,提问作者QIN YANG
相关产品推荐
相关产品推荐

