如何遍历含二维键的字典并计算词的标签分布?
解决标签对应词分布的计算问题
我懂你的需求啦——你想基于现有的字典数据,计算每个标签对应的词频分布比例。不过看你写的代码片段,应该是卡在了如何按标签分组获取对应词的计数这一步,因为原字典d的键是(词, 标签)的元组,直接用d[tag]会触发KeyError哦,这是因为d里根本没有以单个标签为键的项。
下面给你两种可行的实现方式,都能得到你想要的结果:
方法一:分步实现(清晰易懂)
这种方式先按标签分组收集词的计数,再计算比例,逻辑一目了然:
d = {('a','1'):4, ('a','2'):5, ('b','1'):6, ('b','2'):10} tags = ('1','2') d2 = {'1':10, '2':15} # 用来存储最终每个标签的词分布 tag_distributions = {} for tag in tags: # 第一步:收集当前标签下所有词的计数 tag_word_counts = {} for (word, current_tag), count in d.items(): if current_tag == tag: tag_word_counts[word] = count # 第二步:计算每个词的占比(除以d2中对应标签的值) dist_tag = {word: count / d2[tag] for word, count in tag_word_counts.items()} tag_distributions[tag] = dist_tag print(tag_distributions) # 输出结果: # {'1': {'a': 0.4, 'b': 0.6}, '2': {'a': 0.3333333333333333, 'b': 0.6666666666666666}}
方法二:嵌套字典推导式(简洁高效)
如果喜欢更紧凑的代码,可以用嵌套的字典推导式一步完成,逻辑和上面完全一致:
d = {('a','1'):4, ('a','2'):5, ('b','1'):6, ('b','2'):10} tags = ('1','2') d2 = {'1':10, '2':15} tag_distributions = { tag: { word: count / d2[tag] for (word, t), count in d.items() if t == tag } for tag in tags } print(tag_distributions) # 得到和上面一样的结果
额外提示
- 如果需要控制小数位数(比如只保留1位小数),可以把
count / d2[tag]改成round(count / d2[tag], 1),这样标签'2'的结果会变成{'a':0.3, 'b':0.7} - 要确保
d2中每个标签都有对应的值,如果存在缺失的标签,可以用d2.get(tag, 1)来避免KeyError(当然,除以1是临时方案,实际场景要根据需求处理缺失值)
内容的提问来源于stack exchange,提问作者CWeeks
相关产品推荐
相关产品推荐

