1book icon indicating copy to clipboard operation
1book copied to clipboard

统计最频繁使用的前50个命令和最不频繁50个命令对应的代码疑问

Open HackBraid opened this issue 7 years ago • 12 comments

兜哥,你好

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条。

求指导!谢谢了!

HackBraid avatar Jan 04 '18 02:01 HackBraid

你说的是对的,这个肯定是错误。不止这里有问题,12-3.py也有这个问题。作者好像对于FreqDist这个理解有误了。 dist_max=set(fdist[0:50]) 作者理解的是fdist应该是从大到小的排列,所以才会用[0:50],但是实际上fdist是无序排列的。这也导致了之后的代码都是错的

zj1244 avatar Jan 09 '18 08:01 zj1244

多谢楼上的回答。

Hecbi avatar Jan 10 '18 01:01 Hecbi

多谢楼上的楼上解答了,囧

HackBraid avatar Jan 22 '18 07:01 HackBraid

请问大家改对以后算出的准确率是多少啊,我的是100%....

UnnameBao avatar Jan 24 '18 07:01 UnnameBao

@UnnameBao 我也是100%哎

lhwlhw90 avatar Feb 06 '18 09:02 lhwlhw90

@UnnameBao @lhwlhw90 请问你们是怎么改正的?求代码,我机器学习刚入门,求指教

aviraonepiece avatar Mar 07 '18 14:03 aviraonepiece

@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 avatar Mar 07 '18 14:03 UnnameBao

@UnnameBao 十分感谢!!!!!!follow

aviraonepiece avatar Mar 07 '18 15:03 aviraonepiece

可以利用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 avatar Mar 09 '18 03:03 xiaoyuge16

@xiaoyuge16 学习了,pandas了解的少。

UnnameBao avatar Mar 09 '18 04:03 UnnameBao

到这里才发现代码是python2,orz。 FreqDist.keys()在python3返回的不再是一个列表了 需要自己转换一下

HersinSu avatar Oct 26 '18 02:10 HersinSu

我用的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%,就很迷。。

zxibang avatar Jan 16 '21 06:01 zxibang