数据处理或提取特征笔记

0.前言

本文章主要记录笔者在写毕业设计时的东西,便于以后回顾时能够快速明白自己当年写的是什么,同时也给予一些读者思路或灵感什么的。

因为笔者实力有限,可能内容会有部分错误或者有更好的方法却未使用,请不要多怪指责。

1.数据生成

因为本次毕设所需要做的作品是人工智能方面的东西,需要用到大量的数据去跑。但是经过笔者一个星期的查询(查询了360实验室、微软的研究院、阿里和腾讯的研究地方)都没找到适用的信息,最后只能自己生成数据

因为需要的是垃圾账号的数据,也就是一个账号的用户名、注册ip、注册邮箱等等,所以直接上github找了个工具一键生成。

2.数据写入

为了方便后续的操作和整理,我将数据写入到csv文件中

写入csv的核心方法就是writerow()这个方法

这个方法会按照你输入的参数的数量,一行写入多少个参数,每个参数之间会以,间隔

1
2
3
4
5
6
with open(filename, 'w',newline="") as csvfile:
writer = csv.writer(csvfile)
writer.writerow(["index", "user_name", "user_email", "user_ip", "user_phone"])
for i in range(num):
writer.writerow([i+1, user(), email(), ip(), phone()])
csvfile.close()

3.数据处理

3.1user_name

对于用户名的处理,我是按照《机器学习互联网业务安全实践》一书里面的处理方法进行处理的。

我们先构建两个池,一个是数字池,一个是字母池

1
2
numPool = u'0123456789'
strPool = u'abcdefghijklmnopqrstuvwxyz'

将传入的用户名(就是字符串)移除字符串头尾的空格或换行符,然后再将字符串的大写字母全部转换为小写字母

1
element = inputFileName.strip().lower()

之后就是利用for循环对每一个字符(数字)进行统计。

返回的内容是一个类似字典一样的东西。这里看对输出的要求做调整。

1
2
3
4
5
6
7
8
9
for c in element:
if c in numPool:
i_num += 1
elif c in strPool:
i_cha += 1
else:
i_other += 1
pattern = getPattern(i_num, i_cha, i_other)
#num:{0},char:{1},zhongwen:{2},sum:{3},num&char:{4},pattern:{5}

代码中的getPattern()是用来统计字数的,如果存在一个数字或者一个字母,就返回1,都存在就返回2,以此类推。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
if i_num and i_cha and i_other:
return 0
elif i_num and i_cha:
return 1
elif i_num and i_other:
return 2
elif i_cha and i_other:
return 3
elif i_num:
return 4
elif i_cha:
return 5
else:
return 6

3.2user_ip

ip的处理也比较简单。

因为我们需要比对的是两个用户注册是不是同一个ip地址段,所以我们需要提取ip的前三个段。

1
ip1 = re.search(r'((2(5[0-5]|[0-4]\d))|[0-1]?\d{1,2})(\.((2(5[0-5]|[0-4]\d))|[0-1]?\d{1,2})){2}', Filename)

正则理解:

我们直接用正则匹配就好了。

3.3user_email

email的处理是提取它的后缀名

依旧使用正则匹配

1
a = re.search(r'@([-\w]{1,63}\.)*[-\w]{1,63}', filename)

正则理解:

@([-\w]{1,63}.):匹配从@开始到.号(第一个)结束的任意字符

*[-\w]{1,63}:匹配前面的子表达式零次或多次

然后除去@符号就好了

1
2
3
b = list(a.group())
b.pop(0)
b = ''.join(b)

3.4写入新的文件

将上述处理好的数据重新写入一个新的csv文件里

1
2
3
4
5
6
7
with open(filename2, 'w', newline="")as file2:
writer = csv.writer(file2)
writer.writerow(['index', 'user_name', 'user_email', 'user_ip', 'user_phone'])
next(fLine)
for i in fLine:
writer.writerow([i[0], generateNameFeatureFromFile(i[1]), getemailfeature(i[2]), getipfeature(i[3]), i[4]])
file2.close()