先記錄一下剛開始最慢最蠢的方法:(第一個函數是用單詞訓練的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)