如何从计数数组x与对应token数组tok中提取出现频率Top k的token
解决方案
之前Counter统计错误的原因
你之前的写法Counter(dict(zip([1,2,1,2,1,2],['a','b','c','a','a','b'])))出错是因为字典的key具备唯一性,zip过程中重复的key会被后续值覆盖,传给Counter后只能统计到最后一次的键值对,完全不符合你要累加token出现次数的需求。
完整实现步骤
步骤1:统计所有token的总出现次数
from collections import defaultdict token_total = defaultdict(int) # 遍历所有数据点 for tok_per_sample, x_per_sample in zip(tok, x): # 遍历单个数据点内的token和对应计数 for token, cnt in zip(tok_per_sample, x_per_sample): token_total[token] += cnt
执行完成后token_total就是所有token的总出现次数字典,格式为{token值: 总次数}。
步骤2:筛选Top K的token集合
k = 2000 # 替换为你需要保留的高频token数量 # 按总次数倒序排序,取前k个token存入集合,提升后续查询效率 top_k_tokens = set(sorted(token_total.keys(), key=lambda t: token_total[t], reverse=True)[:k])
步骤3:过滤原tok和x数组
filtered_tok = [] filtered_x = [] for tok_per_sample, x_per_sample in zip(tok, x): cur_tok = [] cur_x = [] for token, cnt in zip(tok_per_sample, x_per_sample): if token in top_k_tokens: cur_tok.append(token) cur_x.append(cnt) filtered_tok.append(cur_tok) filtered_x.append(cur_x)
最终输出的filtered_tok和filtered_x就是仅保留Top K高频token的结果数组,和原数组的结构完全一致。
你提供的示例修正
如果要得到你预期的{'a': 4, 'b': 4, 'c': 1}结果,正确代码如下:
from collections import Counter cnt_list = [1,2,1,2,1,2] tok_list = ['a','b','c','a','a','b'] counts = Counter() for t, c in zip(tok_list, cnt_list): counts[t] += c print(counts) # 输出:Counter({'a': 4, 'b': 4, 'c': 1})
内容的提问来源于stack exchange,提问作者blue_egg
相关产品推荐
相关产品推荐

