【发布时间】:2013-09-28 03:59:30
【问题描述】:
所以我正在学习自然语言处理课程,我需要创建一个三元语言模型来根据一些样本数据生成在一定程度上看起来“真实”的随机文本。
基本上需要创建一个“trigram”来保存各种 3 个字母的语法单词组合。我的教授暗示,这可以通过拥有一个我试图创建的字典字典来完成:
trigram = defaultdict( defaultdict(defaultdict(int)))
但是我收到一条错误消息:
trigram = defaultdict( dict(dict(int)))
TypeError: 'type' object is not iterable
我将如何创建一个 3 层嵌套字典或 int 值的字典的字典?
如果人们不知道如何回答,我猜人们会否决堆栈溢出问题。我将添加一些背景知识,以便为愿意提供帮助的人更好地解释这个问题。
此三元组用于跟踪三字模式。它们用于文本语言处理软件,几乎无处不在自然语言处理“现在想想 siri 或谷歌”。
如果我们将字典的 3 个级别指定为 dict1 dict2 和 dict3,那么解析一个文本文件并读取语句 “The boy runs” 将具有以下内容:
具有“the”键的 dict1。访问该密钥将返回包含密钥“boy”的 dict2。访问该键将返回包含键“运行”的最终 dict3,现在访问该键将返回值 1。
这象征着在这篇文章中“男孩跑”出现了1次。如果我们再次遇到它,那么我们将遵循相同的过程并将 1 增加到 2。如果我们遇到“the girl walks”,那么 dict2 的“the”键字典现在将包含另一个“girl”键,其中 dict3 的键为“walks”,值为 1,依此类推。最终在解析大量文本(并跟踪字数)之后,您将拥有一个三元组,它可以根据它们在先前解析的文本中出现的频率来确定某个起始词导致 3 个词组合的可能性.
这可以帮助您创建语法规则来识别语言,或者在我的例子中创建看起来非常像语法英语的随机生成的文本。我需要一个三层字典,因为在 3 个单词组合的任何位置都可以有另一个单词可以创建一组完全不同的组合。我尽我最大的努力解释了三元组及其背后的目的......当然我几周前刚刚讲过这门课。
现在……说了这么多。我将如何创建一个字典的字典,其基本字典在 python 中包含 int 类型的值?
trigram = defaultdict(defaultdict(defaultdict(int)))
为我抛出错误
【问题讨论】:
-
你确实是疯狂的编码员。
-
@AlexA。就像我说的那样,是班级教授建议我们这样做。我认为这是因为我们正在使用它来构建语言模型,并且每个字典级别的键数量未知
-
呵呵,是的,我刚刚被词典部分的词典逗乐了。对于您的用例,据我所知,这在 Python 世界中似乎是一种相当明智的方法。不要因为投反对票而灰心丧气,因为如果你问我,你的问题似乎是一个公平的问题。
标签: python dictionary