列表转换为三维矩阵

先记录一下刚开始最慢最蠢的方法:(第一个函数是用单词训练的word2vec,第二个是字符训练的)

'''#相同维度单词级别向量输入(注意列表向数组的转换及向量向数组的转换、向量与列表格式的区别、二维到三维的转换(https://blog.csdn.net/u013044310/article/details/80407220)
def get_wordvec2(url,url_label):
model = gensim.models.Word2Vec.load('./url_w2corpus_word_new')
# print(model['blog.csdn.net'].tolist())#user_w2corpus_word
# model = gensim.models.Word2Vec.load('./user_w2corpus_word')
url_all=url
#将URL转换成去掉空格的列表
url_wordlist=[]
maxlen=0#得到最大长度的URL
for u in url_all:
sentences = u.split('/')
for s in sentences:
if s == '':
sentences.remove(s)
if len(sentences)>maxlen:
maxlen=len(sentences)
url_wordlist.append(sentences)
#将URL用矩阵表示
texts_vec = [] # 将每个计算完单个句子的向量的结果存储到该列表即返回句子向量
text_len=0
for te in range(len(url_all)): # 先对第一个句子循环一次
if te==0:#只对第一个句子处理成矩阵
text_len+=1
text_vec = []
for t in url_wordlist[te]:#对分割后的句子中每个元素循环
print(t)
try:
text_vec.append(model[t].tolist()) # 得到句子向量
except Exception as e:
print('训练的向量集合中没有留下该词汇', e)
#遇到长度不一致的URL用0向量补齐
# for i in range(maxlen-len(text_vec)):
# text_vec.append([0]*100)#用0补齐
text_vec=sequence.pad_sequences(np.array(text_vec).transpose(), maxlen=maxlen,padding='post',dtype='float32')
#将一个句子的所有词向量放同一个列表中
texts_vec.append(text_vec.transpose())
texts_vec=(np.array(texts_vec))
print('初始三维矩阵',texts_vec.shape)
#接下来对剩余句子处理为矩阵
dim = texts_vec.shape # 获取原矩阵的维数
for te in range(1,len(url_all)):
print('第几条文本',te)
text_len+=1
text_vec = [] # 由于默认的w2v训练得到的向量维度为100,所以初始化为100,开始初始化为0,但是如果该句子中只有一个词汇并且该词汇没有训练到,则维度无法与之前保持一致
for t in url_wordlist[te]: # 每个句子中的每个词汇的向量求和
try:
text_vec.append(model[t].tolist()) # 得到句子向量
except Exception as e:
print('训练的向量集合中没有留下该词汇', e)
text_vec = sequence.pad_sequences(np.array(text_vec).transpose(), maxlen=maxlen,padding='post',dtype='float32')
data=np.append(texts_vec,text_vec.transpose())
texts_vec=data
data1 = texts_vec.reshape(dim[0] + len(url_all)-1, dim[1], dim[2]) # 再通过原矩阵的维数重新组合
print('最终三维矩阵输入格式',data1.shape)
# y_train = np.reshape(np.array(url_label),(len(url_label), 1))
y_train=url_label
return data1, y_train

#相同维度字符级别向量输入
def get_wordvec3(url,url_label):
model = gensim.models.Word2Vec.load('./url_w2corpus_char_old')
# print(model['blog.csdn.net'].tolist())
url_all=url
# 每个链接词的个数要一致,否则转换矩阵格式的时候会出错
maxurl_len=max((len(l) for l in url_all))#最大字符长度
texts_vec = [] # 将每个计算完单个句子的向量的结果存储到该列表即返回句子向量
text_len=0
for te in range(len(url_all)): # 只处理第一个句子
if te==0:
text_len+=1
text_vec = []
# 将句子的每个字符循环加入result
result = []
char_num = len(url_all[te])
for ch in range(len(url_all[te])):
result.append(url_all[te][ch])

for t in result:
try:
text_vec.append(model[t].tolist()) # 得到句子向量
except Exception as e:
print('训练的向量集合中没有留下该词汇', e)
#用0向量补充缺失的维度
# for i in range(maxurl_len-char_num):
# text_vec.append(np.zeros(100).tolist())
text_vec = sequence.pad_sequences(np.array(text_vec).transpose(), maxlen=maxurl_len, padding='post',
dtype='float32')
# 将一个句子的所有词向量放同一个列表中
texts_vec.append(text_vec.transpose())

texts_vec=(np.array(texts_vec))
print('初始三维矩阵',texts_vec.shape)
dim = texts_vec.shape # 获取原矩阵的维数
for te in range(1,len(url_all)):
print('第几条文本', te)
text_len+=1
text_vec = [] # 由于默认的w2v训练得到的向量维度为100,所以初始化为100,开始初始化为0,但是如果该句子中只有一个词汇并且该词汇没有训练到,则维度无法与之前保持一致
result = []
char_num=len(url_all[te])
for ch in range(len(url_all[te])):
result.append(url_all[te][ch])
for t in result: # 每个句子中的每个词汇的向量求和
try:
text_vec.append(model[t].tolist()) # 得到句子向量
except Exception as e:
print('训练的向量集合中没有留下该词汇', e)
# for i in range(maxurl_len - char_num):
# text_vec.append(np.zeros(100).tolist())
text_vec = sequence.pad_sequences(np.array(text_vec).transpose(), maxlen=maxurl_len, padding='post',
dtype='float32')
data = np.append(texts_vec, text_vec.transpose())
texts_vec=data
data1 = texts_vec.reshape(dim[0] + + len(url_all)-1, dim[1], dim[2]) # 再通过原矩阵的维数重新组合
print('最终三维矩阵输入格式',data1.shape)
y_train = url_label
return data1, y_train#相同维度字符级别向量输入
'''

接下来是正确写法:
def get_wordvec_word(ifnew,url,url_label):#传入ifnew表示是否用新的词向量;训练集url内容列表、url对应的label(已转化好格式)
if ifnew==1:
model = gensim.models.Word2Vec.load('./url_w2corpus_word_new')
elif ifnew==0:
model = gensim.models.Word2Vec.load(
'./url_w2corpus_word_old')
url_all=url

#将URL(去掉空格)转换成列表
url_wordlist=[]
maxlen=0#得到最大长度的URL,之后将所有训练集样本的长度都设为maxlen
strip_chars = '/.??;+_:-@%="'
for u in url_all:
single_line = u.translate(str.maketrans(dict.fromkeys(strip_chars, '#')))
sentences = single_line.split('#')
for s in sentences:
if s == '':
sentences.remove(s)
if len(sentences)>maxlen:
maxlen=len(sentences)
url_wordlist.append(sentences)

#将URL用三维矩阵表示
texts_vec = [] # 将每个计算完单个句子的向量的结果存储到该列表即返回句子向量
for te in range(len(url_all)): # 将每个句子循环一次
text_vec = []
for t in url_wordlist[te]:#对分割后的句子中每个元素循环
try:
text_vec.append(model[t].tolist()) # 得到句子向量
except Exception as e:
print('训练的向量集合中没有留下该词汇', e)
text_vec=sequence.pad_sequences(np.array(text_vec).transpose(), maxlen=maxlen,padding='post',dtype='float32')
#将一个句子的所有词向量放同一个列表中
texts_vec.append(text_vec.transpose())
texts_vec=(np.array(texts_vec))
print('训练集三维矩阵',texts_vec.shape)
 
原文地址:https://www.cnblogs.com/kjkj/p/10531792.html