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

实现trigram N-gram语言模型传入用户输入返回空defaultdict咨询

N-gram语言模型查询返回空问题解决办法

问题根因

  • 训练语料未做大小写归一化
    训练时直接使用路透社语料的原始大小写词汇,保留了首字母大写、全大写等格式,而你处理用户输入时统一转了小写,大小写不匹配导致无法命中训练好的模型键。
  • 输入长度不符合三元模型要求
    你使用的是三元语法模型,查询键必须是长度为2的词组,若用户输入的词数不等于2,自然无法匹配到对应结果。
  • 输入词组未在训练语料中出现
    若用户输入的两个词的组合从未在训练语料的三元组前缀中出现过,也会返回空结果。

修复代码

from nltk.corpus import reuters
from nltk import trigrams
from collections import defaultdict

# 初始化模型
model = defaultdict(lambda: defaultdict(lambda: 0))

# 训练时统一做小写归一化
for sentence in reuters.sents():
    lower_sent = [word.lower() for word in sentence]
    for w1, w2, w3 in trigrams(lower_sent, pad_right=True, pad_left=True):
        model[(w1, w2)][w3] += 1

# 转换计数为概率值
for w1_w2 in model:
    total_count = float(sum(model[w1_w2].values()))
    for w3 in model[w1_w2]:
        model[w1_w2][w3] /= total_count

# 增加输入合法性校验
user_input = input("Hi there! Please enter an incomplete sentence consisting of 2 words, and I can help you finish it!\n").lower().split()
if len(user_input) != 2:
    print("请输入恰好2个词的前缀")
else:
    res = dict(model[tuple(user_input)])
    if res:
        print(res)
    else:
        print("当前输入的词组未在训练语料中出现,无法预测下一词")

验证方法

输入the price即可得到和教程一致的概率分布结果。

内容的提问来源于stack exchange,提问作者Helana Brock

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 13:54:03