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

