以元组为键的defaultdict,找不到如何在事件键中设置默认值

defaultdict with tuple as the key, how to set default value in the event key isn't found

假设我有一个 defaultdict,格式如下:

theta = defaultdict(float)

密钥由一个字符串元组组成,即 (label, word),关联值是给定单词符合给定标签(词性标记)的概率。

例如,单词 'stand' 可以是名词或动词。所以我可以做类似的事情:

theta[('NOUN', 'stand')] = 0.4
theta[('VERB', 'stand')] = 0.6
theta[('ADJ', 'stand')] = 0.0

其余词性标签依此类推。

我需要做的是让字典 return 默认值为 1,如果它是用一个它不包含的词调用的,并且关联的标签是 'NOUN',并且 return 0 用于所有其他关联标签。例如:

value = theta[('NOUN', 'wordthatdoesntexist')]  # this should be 1
value = theta[('VERB', 'wordthatdoesntexist')]  # this should be 0

我该怎么做?我可以在初始化步骤中使用 lambda 执行此操作吗?或者有其他方法吗?

defaultdict 无法做到这一点;默认工厂无权访问密钥。您必须编写自己的 dict 子类,使用 __missing__ hook dicts 在您尝试访问丢失的键时查找:

class SomeAppropriateName(dict):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
    def __missing__(self, key):
        val = 1.0 if key[0] == 'NOUN' else 0.0
        # Uncomment the following line if you want to add the value to the dict
        # self[key] = val
        return val

可以使用dictsetdefault()方法:

d.setdefault(u, int(u[0] == "NOUN"))

如果在 d 中找到 u,则设置默认值 returns d[u]。否则,它被插入到字典中,值作为第二个参数提供。