基于敏感数据的提取与加密(第一步,词向量的训练)

项目场景:

这个任务是面对与日俱增的数据,我们需要对数据中的敏感数据进行识别提取,并用一定是方式进行降噪,最终得出一份无敏感数据的文件。面对文字的情况,本项目选择了自然语言处理的方法来解决这个问题。

词向量训练

当面对大量文本信息加密,且要与本研究方向相关,我首先想到的是利用词向量,我可以根据自己的需要手头上的文本,甚至是随机一本网络文本作为加密的秘钥,进行词向量训练,训练出的词向量作为最基础的秘钥本,将词向量压缩到1维度,就可以随机打乱词语或者字的顺序,而不是单纯的统计词频,这样增加词序排列的随机性和复杂性。这就意味着,及时我拿到了原秘钥文本,也不会立刻可以根据词频解析出原敏感词。也无法猜测出我们是按照多少维度进行词向量训练。这样就可以大大的增加了文本的安全性。因此,第一步就要进行词向量的训练。词向量训练方式我是根据网上现有的wiki-word2vec代码库原github传送门,这里我们对这份代码做了简单的改动和遇到到问题做了解决。

主要构建思路:

原作者模型思路已经很清楚了这里只是做一下简单思路赘述,第一步是下载中文语料库,上面提供的是使用的语料库是wiki百科的中文语料库,下载地址:https://dumps.wikimedia.org/zhwiki/latest/zhwiki-latest-pages-articles.xml.bz2,将下载好的数据集直接放在运行目录下就好,这里是一个压缩包。第二步运行xml2txt.py文件,是将压缩包解压成txt形式。第三步将繁体转为简体,这一步在自己项目中如果没有繁体字可以省略。第四步分词对于中文来说,分词是必须要经过的一步处理,这一步如果自己有文本也是自己文本的第一步。这一步,我也开始细说,这里我们可以导入自己的文本,如我举例导入test.txt如图1所示,然后根据回车截断,为什么要取line.split(‘\n’)[0],如图二所示,回车截断后默认是一个空数组因此,就取值[0],再把句子中的空格全部替换掉,之后在用jieba分词就行,如果你想用其他的分词工具也是可以的,只是因为jieba分词效率快。最终到这一步如图三所示就已经分好词了,再次强调如果是自己网上找的文本这就是第一步。

# coding:utf-8
import jieba

print('主程序执行开始...')

#input_file_name = 'wiki.cn.simple.txt'
input_file_name = 'test.txt'
output_file_name = 'wiki.cn.simple.separate_test.txt'
input_file = open(input_file_name, 'r', encoding='utf-8')
output_file = open(output_file_name, 'w', encoding='utf-8')

print('开始读入数据文件...')
lines = input_file.readlines()
print('读入数据文件结束!')

print('分词程序执行开始...')
count = 1
for line in lines:
    # jieba分词的结果是一个list,需要拼接,但是jieba把空格回车都当成一个字符处理
    output_file.write(' '.join(jieba.cut(line.split('\n')[0].replace(' ', ''))) + '\n')
    print(line.split('\n'))
    print(line.split('\n')[0])
    count += 1
    if count % 10000 == 0:
        print('目前已分词%d条数据' % count)
print('分词程序执行结束!')

print('主程序执行结束!')

基于敏感数据的提取与加密(第一步,词向量的训练)
基于敏感数据的提取与加密(第一步,词向量的训练)

基于敏感数据的提取与加密(第一步,词向量的训练)

第五步 去除中文具体做法是通过正则表达式判断每一个词是不是符合汉字开头、汉字结尾、中间全是汉字。这一步可以在第四步for循环中结合,在主要代码如下

cn_reg = '^[\u4e00-\u9fa5]+$'

for line in lines:
    line_list = line.split('\n')[0].split(' ')
    line_list_new = []
    for word in line_list:
        if re.search(cn_reg, word):
            line_list_new.append(word)

第六步 词向量训练,这也是基础的所有准备的第一步,因为gensim版本的原因,对源代码做了自适应版本的改动,并且重新加入了一个新的存储格式(w2v_model_wiki_word.vec)是为了第三步压缩方便。改动地方有vector_size=400和model.wv.save_word2vec_format(model_file_name2, binary=False)

# coding:utf-8
import multiprocessing
from gensim.models import Word2Vec
from gensim.models.word2vec import LineSentence

if __name__ == "__main__":
    print('主程序开始执行...')

    input_file_name = 'wiki.txt'
    model_file_name = 'wiki.model'
    model_file_name2 = "w2v_model_wiki_word.vec"
    print('转换过程开始...')
    model = Word2Vec(LineSentence(input_file_name),
                     vector_size=400,  # 词向量长度为100
                     window=5,
                     min_count=5,
                     sg=1,
                     workers=multiprocessing.cpu_count())
    print('转换过程结束!')

    print('开始保存模型...')
    model.save(model_file_name)
    model.wv.save_word2vec_format(model_file_name2, binary=False)
    print('模型保存结束!')

    print('主程序执行结束!')

整体项目GitHub地址:https://github.com/zhichen-roger/Natural-language-processing-based-data-desensitisation.git

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
乘风的头像乘风管理团队
上一篇 2022年5月30日 上午11:33
下一篇 2022年5月30日 上午11:36

相关推荐