1book
1book copied to clipboard
统计最频繁使用的前50个命令和最不频繁50个命令对应的代码疑问
兜哥,你好
WEB安全机器学习入门P78里面有个“统计最频繁使用的前50个命令和最不频繁50个命令”对应的代码如下:
fdist = FreqDist(dist).keys()
dist_max=set(fdist[0:50])
dist_min = set(fdist[-50:])
我看了官网对FreqDist的解释,该函数功能是对词频进行统计,例如这里如果使用临时变量tmp进行遍历即可得到如下结果:
tmp = FreqDist(dist)
for key in tmp:
print key+" : "+str(tmp[key])
gs : 4 tset : 1 basename : 616 uname : 443 touch : 3 ... ... 所以这里已经是去重后的数据,但使用fdist[0:50]和fdist[-50:]并不能得到最频繁使用的前50个命令和最不频繁50个命令,比如fdist[0:10]得到的就是字典前10条。
求指导!谢谢了!
你说的是对的,这个肯定是错误。不止这里有问题,12-3.py也有这个问题。作者好像对于FreqDist这个理解有误了。 dist_max=set(fdist[0:50]) 作者理解的是fdist应该是从大到小的排列,所以才会用[0:50],但是实际上fdist是无序排列的。这也导致了之后的代码都是错的
多谢楼上的回答。
多谢楼上的楼上解答了,囧
请问大家改对以后算出的准确率是多少啊,我的是100%....
@UnnameBao 我也是100%哎
@UnnameBao @lhwlhw90 请问你们是怎么改正的?求代码,我机器学习刚入门,求指教
@aviraonepiece 我是这样改的
把
fdist = FreqDist(dist).keys()
dist_max=set(fdist[0:50])
dist_min = set(fdist[-50:])
改成
fdist = sorted(FreqDist(dist).items(),key = operator.itemgetter(1),reverse = True) #获得操作命令使用频率并排序
dist_max = set([item[0] for item in fdist[:50]]) #取出前50个操作命令的指令
dist_min = set([item[0] for item in fdist[-50:]]) #取出前50个操作命令的指令
@UnnameBao 十分感谢!!!!!!follow
可以利用pandas来做: import pandas as pd fdist=nltk.FreqDist(dist) ser=pd.Series(fdist) sersort = ser.sort_values()#按照升序排列 dist_min = sersort.index[0:50].tolist()#取出频率最小的前50个操作命令 dist_max = sersort.index[-50:].tolist()#取出频率最大的最后50个操作命令
@xiaoyuge16 学习了,pandas了解的少。
到这里才发现代码是python2,orz。 FreqDist.keys()在python3返回的不再是一个列表了 需要自己转换一下
我用的python3.8,这部分代码我改成这样: fdist = FreqDist(dist) keys = np.array(fdist.most_common(len(fdist)))[:,0].tolist() dist_max = keys[:50] #取出频率最大的前50个操作命令 dist_min = keys[-50:] #取出频率最小的前50个操作命令 改完以后算出的准确率是100%,就很迷。。