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

无特殊模块统计Bigrams频率出错,求排查与修正方案

问题分析与修正方案

你的代码核心问题在于每处理一行输入后,会遍历整个bigrams列表更新频率,而非仅统计当前行新增的双词:

  1. 第一次输入行时,bigrams新增3个双词,遍历这3个后,每个双词的频率被设为1。
  2. 第二次输入相同行时,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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 21:31:10