目前,我已经做了两步就数据已经提取出来了,也做了词向量,现在我们要处理的就是,如何进行加密,我的思路是首先将词向量压缩到一维,再根据一维向量的大小进行排序。最后在根据提取出的词按照自己定义的方法进行加密,我的就比较简单往后加一步,如果这个字没有怎么办那个就统一定义一个数组,再或者用gensim,里面的wv.most_similar找最相关的字符。例子如。
from gensim.models import Word2Vec
word2vec_model = Word2Vec.load('wiki.model')
testwords = ['孩子', '数学', '学术', '白痴', '篮球']
for i in range(5):
res = word2vec_model.wv.most_similar(testwords[i])
print(testwords[i])
print(res)
读取大量词组并压缩一维
这里我们采用了PCA方式压缩到一维,那会问为什么采用PCA方式,不用其他的呢,这个我倒是尝试了一些方式例如MDS这种,我也把尝试代码放到了github中。那为什么选用了PCA呢,是因为我之前看过有关图像理解的文章,里面有用PCA进行降维,因此我也用了。这里词向量.vec也刚好呼应了我们前面压缩到vec的方式(步骤1)
import gensim
import numpy as np
from sklearn.decomposition import PCA
def load_txt_vec(file, threshold=0, dtype='float'): # 读取txt文件格式的word2vec词向量
print('读取词向量文件中......')
header = file.readline().split(' ')
count = int(header[0]) if threshold <= 0 else min(threshold, int(header[0]))
dim = int(header[1])
words = []
matrix = np.empty((count, dim), dtype=dtype)
for i in range(count):
word, vec = file.readline().split(' ', 1)
words.append(word)
matrix[i] = np.fromstring(vec, sep=' ', dtype=dtype)
return (words, matrix)
if __name__ == '__main__':
result=[]
try:
w2v_txt_file = open('newsblogbbs.vec', 'r', encoding='utf-8', errors='surrogateescape') # txt格式的词向量文件
words, vectors = load_txt_vec(w2v_txt_file) # 载入txt文件格式的word2vec词向量
for i in range(len(vectors)):
result.append(vectors[i][:4])
# for r in range(len(result)):
# print(result[r])
#print(result)
X = np.array(result)
pca = PCA(n_components=1) # 降到2维
pca.fit(X) # 训练
newX = pca.fit_transform(X) # 降维后的数据
f1 = open("middleyas.txt", "w", encoding='utf-8')
for index in range(len(newX)):
print(newX[index][0])
f1.write(str(words[index])+'n'+str(newX[index][0]) + 'n')
#print(result)
f1.close()
except ImportError as ex:
print(ex)
结果如图
词向量分类:
这里我们把词向量和对应文字分成两个文本,这是为了进行下一步排序做准备。
word = []
vector = []
Dict = []
num = 0
# 打开字典并去掉换行符
with open("middleyas.txt", "r", encoding="utf-8") as f:
lines = f.readlines()
# 去除换行符
result = ([x.strip() for x in lines if x.strip() != ''])
#print(result)
for x in result:
Dict.append(x)
# 将整理好字典提取成为全局字典
for k in range(len(Dict) - int(len(Dict) % 2)):
if num == 1:
vector.append(Dict[k])
else:
num = 0
word.append(Dict[k])
num += 1
#添加到两份文件夹中
f1 = open("word.txt", "w", encoding='utf-8')
for index in range(len(word)):
f1.write(str(word[index]) + 'n')
print(len(word))
f1.close()
f2 = open("vector.txt", "w", encoding='utf-8')
for index in range(len(vector)):
f2.write(str(vector[index]) + 'n')
print(len(vector))
f2.close()
结果如图所示:
连接到词典并排序
我根据分类好的两个文件,放到词典里面进行排序,最后再分别放到两个文件里面,为啥呢因为最后一步需求我还没做,有总有合到时候遇到需求都好做。
words=[]
wordsrange=[]
vectors=[]
vectorsrange=[]
# 词语打开字典并去掉换行符
with open("word.txt", "r", encoding="utf-8") as f:
lines = f.readlines()
# 去除换行符
result = ([x.strip() for x in lines if x.strip() != ''])
# 将整理好字典提取成为全局字典
for x in result:
words.append(x)
# 向量打开字典并去掉换行符
with open("vector.txt", "r", encoding="utf-8") as f:
lines = f.readlines()
# 去除换行符
result = ([x.strip() for x in lines if x.strip() != ''])
# 将整理好字典提取成为全局字典
for x in result:
vectors.append(float(x))
dict = {word:vector for word,vector in zip(words,vectors )}# dict={'张三': 90, '李四': 80, '王五': 70, '赵六': 60}
orderdict = sorted(dict.items(),key=lambda item:item[1],reverse=True)
for index in range(len(orderdict)):
wordsrange.append(orderdict[index][0])
vectorsrange.append(orderdict[index][1])
dictrange = {wordr:vectorr for wordr,vectorr in zip(wordsrange,vectorsrange )}
f3 = open("middlerange.txt", "w", encoding='utf-8')
for key, value in dictrange.items():
print(key+" "+str(value))
f3.write(key+" "+str(value) + 'n')
f3.close()
#添加到两份文件夹中
f1 = open("wordrange.txt", "w", encoding='utf-8')
for index in range(len(wordsrange)):
f1.write(str(wordsrange[index]) + 'n')
print(len(wordsrange))
f1.close()
f2 = open("vectorrange.txt", "w", encoding='utf-8')
for index in range(len(vectorsrange)):
f2.write(str(vectorsrange[index]) + 'n')
print(len(vectorsrange))
f2.close()
github地址如下:https://github.com/zhichen-roger/Natural-language-processing-based-data-desensitisation.git



