Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
HackBraid opened this issue Jan 4, 2018 · 12 comments

Comments

@HackBraid
Copy link

兜哥,你好

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

求指导!谢谢了!

@zj1244
Copy link

zj1244 commented Jan 9, 2018

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

@Hecbi
Copy link

Hecbi commented Jan 10, 2018

多谢楼上的回答。

@HackBraid
Copy link
Author

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

@UnnameBao
Copy link

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

@lhwlhw90
Copy link

lhwlhw90 commented Feb 6, 2018

@UnnameBao 我也是100%哎

@aviraonepiece
Copy link

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

@UnnameBao
Copy link

@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个操作命令的指令

@aviraonepiece
Copy link

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

@xiaoyuge16
Copy link

xiaoyuge16 commented Mar 9, 2018

可以利用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个操作命令

@UnnameBao
Copy link

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

@HersinSu
Copy link

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

@zxibang
Copy link

zxibang commented Jan 16, 2021

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

9 participants