**pygen功能:**有关联的随机生成人名,邮箱,ID Card (ssn),电话,地址等信息,并且可以选择保存为 pandas dataframe格式, 数据库".db" 文件, Excel 文件和csv 文件格式,用于机器学习训练。项目地址github

随机生成虚假个人信息具有很大的应用空间。首先,虚假的生成数据可以用于机器学习模型的“准备数据”,当真实的数据比较少或者难以获得的时候,可以使用生成数据进行训练模型,待模型调通之后,然后使用真实的模型。并且,当真实的数据集中缺少某些特征时候,可以使用这种方法进行特征的填充。比如大的数据集中缺少现居城市地址的时候,可以调用该库中的 “city_real” 进行填充。

当前使用最为广泛的是 Faker 开源库用于个人信息的生成,对于中文姓名、邮箱电话等信息支持有限。并且生成的数据是单列的,数据之间没有联系。比如生成的身份证 (ssn) 和姓名所能体现的性别是不匹配(了解更多可以参考这里)、生成的姓名中缺少复姓和电话邮箱等信息不符合我们的使用习惯等等。所以我将从以下几点改进:

  • 增强数据之间相关性
  • 生成名字的多样性
  • 符合国人使用习惯的邮箱电话
  • 提供保存多种保存文件格式,更加适合机器学习的训练

中文名字有很强的性别属性。例如名字中带有“杰”“志”“宏”等字的一般为男性,带有“琬”“佩”“梅”等字的一般为女性。当然也有一些比较中性的字,例如“文”“安”“清”等,比较难猜测性别,关于这点会在另一个博客中展开,请期待。

faker 对中文的支持有限,比如下面这种情况。

1
2
3
4
    from faker import Faker
    fake = Faker('zh_CN')
    for _ in range(10):
        print(fake.name(),fake.ssn(),fake.phone_number())

从图中可以明显的看出 “王玉梅"和 “李桂花"都是两个女性,但是这种身份证信息(ssn)都没有体现这点。关于身份证的科普信息可以从这里获得。简单来说倒数第二位表示性别信息,如果是男性就是奇数如果是女性就是偶数。faker 生成的数据是不具有数据之间的相关性的。

基于此,我们进行了改进。首先是姓名的生成,然后是性别的判断,最后再生成相应性别的身份证号码。

1
2
3
    from pygen import pygen
    db =pygen()
    db.gen_dataframe(fields =['name', 'ssn', 'phone', 'email'])

效果如下:

红色线条表示姓名和性别对应一致,蓝色线条表示结果不确定(“镜阳炎” 像是一个中性的名字),绿色表示生成了含有复姓的名字,增强了数据的多样性。

从上图的 “mail” 一列可以看出邮箱前缀的命名基本上是中文名字中“姓” 和“民”的拼音组合,加强了数据之间的相关性和真实度。

另外,电话号码按照运营商分为三类:0 表示移动,1表示联通,2表示电信。

print('移动字段:')
for _ in range(5):
  print(db.simple_ph_num(types =0))

print('联通字段:')
for _ in range(5):
  print(db.simple_ph_num(types =1))
  
print('电信字段:')
for _ in range(5):
  print(db.simple_ph_num(types =2))

输出:

移动字段: 15023689929 16771753917 16790223946 15950129353 15271129554 联通字段: 13869739303 13786227031 13950354445 15137578545 15240836142 电信字段: 17172983067 15658567011 18562313243 17073127396 15543448286

最后提供了多种文件保存格式,包括”.csv”, “.db” 和".xlsx"等格式。可以使用如下:

1
2
3
4
5
6
    from pygen import pygen
    db =pygen()
    db.gen_table(filename =filename, fields =['name', 'ssn', 'phone', 'email'])
    db.gen_excel(filename =filename, fields =['name', 'ssn', 'phone', 'email'])
    db.gen_csv(filename =filename, fields =['name', 'ssn', 'phone', 'email'])