在大学的时候参与了一个学校的项目,自己做的工作就是仿冒网站中的数据清洗、特征选择、以及后续的机器学习模型的选择等相关的方面,作为一个入门级别的菜鸟新手来说,中间经历的东西恐怕只有自己懂的,做了很多事情,大学的那段时间大多时间都在实验室里面来摸索,写在这里可能也都是班门弄斧了,我是一个半路出家的progammer,说的这些话写的这些东西是希望能够帮到很多跟我一样在考研的选择上选择了跨度的同学,尽量可以快一点进入自己的状态少走一点不必要的弯路
我在研究生生涯也度过了将近两年的时间,总会有一点体会和感悟,但是不可能全部都有用都能够讲出来,在这里简单写一下自己参与这个事情的前后经历吧:
几年前就进入实验室,在我看来,无论交给你什么任务,最开始接触的往往都是论文,可能在一开始的时候你会感觉没有什么太大的用处,每天看很多的文献,从刚开始的综述层面的文献到后来的实验方法实验数据层面的文献再到后来的创新点方法的文献最后就是你自己的创新设计了,这个可能你听完也会感觉这是一个毕业生硕士论文的流程,的确是的,但是工程层面的东西要求是简单高效,那么自然就不可能跟论文相提并论,但是有一点是不可否认的:工程上面高效有效的实现方法往往来源于文献中,这也就是你为什么一开始不能绕过去读论文,度枯燥的文献的原因了,在最开始看的时候相关的综述、问题背景、已有的方法以及优缺点可以多看看,在明白了自己为什么要做这个事情,以及该怎么着手去做的时候说明问题你心里已经很明确了,接下来的就是怎么计划去实践。
现在不管做什么都有一大堆的方法和文献,要选择的也很多,就比如让你计算两个字符串的相似度,你会怎么计算呢?可以有很多方法:使用有名的编辑距离可以实现计算两个字符串的编辑距离,从而得到两个字符串的相似程度、使用shingle或者slice这样的切片的方法,借助于滑窗的策略可以将字符串切片处理之后使用Jaccard系数来计算相似度、使用最长公共子序列来计算等等,这些方法都是在实践中历经考验被创造出来的,但是不同的实现又会有不同的时间不同的空间复杂度,在不同的问题上就会有针对性的选择需要的方法。
都说现在已经进入了一个数据或者是一个大数据的时代,2012年是中国的数据元年,到现在也已经经历了数年的时间和发展了,在现在的角度看待问题就需要能够保持一定的角度和高度才行,比如最传统的相似度计算方法是否还能够应对海量数据信息的冲击呢?互联网上每天产生的数据是海量的,需要处理的数据也会是海量的,这个时候不可能想着可以一味地去依靠提升机器的性能,要站在数据的角度考虑问题的产生原因和处理方法:对于原始的数据进行清洗和处理是必不可少的一项工作,这样可以有效地在数据的源头降低数据的量级,机器学习和深度学习等方法现在成功主流的研究方法,很完整的实现也都有很多,这些是必须会熟练去运用这些解决自己的问题的,机器学习和深度学习本质上最核心的东西在于特征的选择上面,说道特征选择不得不说完整的工作流程中极为核心的一个步骤就是:特征工程。
这是一个没有办法去讲得很明白的问题,网上大神们写的有很多的方法和经历,我就不多说什么了,对于初学者来说我的建议就是:可以多参加一下比赛,这些比赛可能本身就是针对一个具体的问题或者背景事件给出来的数据让你去解决,大都离不开机器学习的方法,当然中间就必须做好特征工程,在实践中积累,在积累中才能产生应用。在这里简单推荐几个自己觉得很不错的比赛:
当然,比赛还有很多种,可以根据自己的时间、兴趣量力而行,最好的是完整做完一次,明白整个的流程是怎么样的。
好了,上面说着了这么多,现在该回归正题了,简单说一下自己在看论文的时间一篇论文中提到的简单的实现仿冒网站的轻量级的分类模型的实现,这个已经是很早的事情了,今天正好在整理资料整理出来了就想着写一下自己当初简单的经过吧,可能已经很不适用了,只是想抛砖引玉,自己的路还有很长要走,当然要学的东西还有很多很多,希望这些能帮到需要的人或者有一点提示
具体的论文没有找到所以没有办法贴出来具体的文章,简单说一下:论文中把恶意页面的识别看作是一个二分类的问题,这里的话就可以使用经典的特征工程+SVM组合的方式来做,效果的话也都是很不错的,毕竟SVM对于解决小样本数据的性能几乎是无可比拟的。论文的方法是仅仅考虑恶意页面和正常页面在url上面的区别,基于这些统计和观察来提取特征,比如:url中的点的个数,正常页面一般都是三个左右不会超过五个,而恶意页面可能就是需要迷惑用户所以使用很杂乱分级很多的路径作为url;url中是否包含ip,正常网站的话都是使用域名来访问的很少使用ip地址,那么恶意页面可能就是因为注册时间短或者没有合法的域名而世界使用或者包含ip在url中;url或者路径中是否包含敏感词如:bank、account等,因为恶意页面的目的就是诱导用户访问输入个人的隐私数据进而盗取账号获取非法利益,所以一般都是利益或者登陆相关的页面。基于这些特征可以对已有的数据进行清洗、特征提取和选择、机器学习模型的分类,大体的流程就是这样的,接下来看一下具体的实现:
# !/usr/bin/python
#-*-coding:utf-8-*-
import codecs
import sys
import re
import chardet
import warnings
from lxml import etree
from os.path import join as pjoin
import os
from bs4 import BeautifulSoup
from urllib2 import urlparse
RED_KEYWORDS = ["account", "admin", "administrator",
"auth", "bank", "client", "confirm", "email", "host",
"password", "pay", "private", "safe", "secure", "security",
"sign", "user", "validation", "verification", "icbc"]
PATH_KEYWORDS = ["www", "net", "com", "cn"]
def geturlat(url):
'''
判断URL中是否含有@,?,-,_等符号
'''
re_script = re.compile(r'@|-|_|\?|~')
return 1 if re_script.search(url) else 0
def get_has_ip(url):
'''
判断url中是否包含ip,包含返回1,不包含返回0
'''
compile_rule_ip = re.compile(r'(?<![\.\d])(?:\d{1,3}\.){3}\d{1,3}(?![\.\d])')
ip_list=re.findall(compile_rule_ip, url)
if ip_list:
return 1
else:
return 0
def geturldot(url):
'''
判断URL中.的个数
'''
dotnum = 0
for u in url:
if u == '.':
dotnum += 1
return dotnum
def get_url_length(url):
'''
获得URL的总长度
'''
return len(url)
def get_url_number_length(url):
'''
获得URL的最长的数字串长度
'''
result = 0
match = re.findall(r"\d+", url)
if match:
match.sort(key=lambda x: len(x), reverse=True)
result = len(match[0])
return result
def get_red_keyword(url):
'''
判断URL中是否包含敏感词汇
'''
url = url.lower()
for key in RED_KEYWORDS:
if url.find(key) != -1:
return 1
return 0
def get_path_key(url):
'''
判断URL的路径中是否包含敏感词汇
'''
url_parse = urlparse(url)
path = url_parse.path
if path:
for key in PATH_KEYWORDS:
if path.lower().find(key) != -1:
return 1
return 0
def get_url_vector(url):
'''
输入:URL,网页存储路径,关键字列表
输出:当前网页的结果list 包含所有特征的返回值
'''
heuristic_vector = []
#heuristic_vector.append(geturlip(url))
heuristic_vector.append(geturlat(url))
heuristic_vector.append(geturldot(url))
heuristic_vector.append(get_url_length(url))
heuristic_vector.append(get_url_number_length(url))
heuristic_vector.append(get_red_keyword(url))
heuristic_vector.append(get_path_key(url))
return heuristic_vector
if __name__ == '__main__':
white_urlresult = open('result/white_urlresult.txt', 'wb')
#存储白名单数据
white_urlresult.write('url_sign, url_dot, url_length, url_number_length, red_keyword, label')
white_urlresult.write('\n')
urlfile = open('dataset/white.txt', 'r')
urlfile_list = urlfile.readlines()
for one_url in urlfile_list:
heuristic_vector = get_url_vector(one_url.strip())
heuristic_url_str = [str(vector) for vector in heuristic_vector]
#fw.write(url + ',Y,1,' + ','.join(heuristic_vector_str) + '\n')
white_urlresult.write(','.join(heuristic_url_str) + ',' + '0' + '\n')
#存储黑名单数据
black_urlresult = open('black_urlresult.txt', 'wb')
id = 1
black_urlresult.write('id, url_sign, url_dot, url_length, url_number_length, red_keyword, label')
black_urlresult.write('\n')
urlfile = open('dataset/all.txt', 'r')
urlfile_list = urlfile.readlines()
url_list_len = len(urlfile_list)
i = 0
for one1_url in urlfile_list:
heuristic_vector = get_url_vector(one1_url.strip())
heuristic_url_str = [str(vector) for vector in heuristic_vector]
#fw.write(url + ',Y,1,' + ','.join(heuristic_vector_str) + '\n')
i += 1
if i == url_list_len:
black_urlresult.write(str(id) + ',' + ','.join(heuristic_url_str) + ',' + '1' )
id += 1
else:
black_urlresult.write(str(id) + ',' + ','.join(heuristic_url_str) + ',' + '1' + '\n')
id += 1
接下来的事情就是一个纯粹的机器学习模型解决的了,使用分类模型来解决,可以使用的模型有很多,可以使用:SVM、Decision Tree,RandomForest、GBDT等,在这里就选择了使用SVM,关于SVM的介绍网上也有很多,在这里就不具体讲实现了给出几个推荐参考的资料,可以借助这些很容易的实现分类模型的使用,推荐使用python机器学习库scikit-learn,具体的用法用例和参考文档都在参考链接中:
参考链接:
http://scikit-learn.org/stable/
http://www.cnblogs.com/taceywong/p/4568806.html
http://blog.csdn.net/pipisorry/article/details/52251305
http://www.cnblogs.com/CheeseZH/p/5250997.html
中间讲的很多都是自己的个人见解,有理解不对的欢迎指教。