1 问题引入
最近在做恶意样本的标签信息提取、投票表决方式确定样本的最终最终标签信息,恰好用到了词频统计,或者说查找数组中出现次数最多的元素。
2 词频统计
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| txt = '''in a job interview or in a situation'''
for s in ',.\n ': txt = txt.replace(s, ' ') txt = txt.lower() word_list = txt.split() print(word_list)
count = dict() for i in word_list: count[i] = count.get(i, 0) + 1 print(count)
sorted_word = sorted(count.items(), key=lambda item: item[1], reverse=True) print(sorted_word)
|
2 查找数组(list)中出现次数最多的元素
2.1 np.argmax(np.bincount())
1 2 3 4 5
| import numpy as np
array = [0, 1, 2, 2, 3, 4, 4, 4, 5, 6] print(np.bincount(array)) print(np.argmax(np.bincount(array)))
|
np.argmax
:就是返回数组中最大值对应的下标,
np.bincount
:首先找到数组最大值max,然后返回0~max的各个数字出现的次数,只能处理不含负数的集合
2.2 Counter().most_common
1 2 3 4 5
| from collections import Counter
array = [0, 1, 2, 2, 3, 4, 4, 4, 5, 6, 'aswd'] print(Counter(array)) print(Counter(array).most_common(1)[0][0])
|
Counter用来对数组中元素出现次数进行统计,然后通过most_common函数找到出现次数最多的元素。这种方法对于数组就没有过多限制,甚至是各种类型元素混合的数组也可以。数组只能是array,不能是ndarray。
2.3 自己实现
1 2 3 4 5 6 7 8 9 10
| appear_times = {} for label in [1, 1, 2, 3, 4, 5, 5, 5]: if label in appear_times: appear_times[label] += 1 else: appear_times[label] = 1
most_common = max(appear_times, key=lambda x: appear_times[x]) print(appear_times) print(most_common)
|
用max求最大值默认情况返回value值(出现次数)最大的key值(元素),而不是value值。
X 参考