You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从计数数组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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.22 02:12:07