這次改進打算使用中文的word2vec代替原本代碼裏的隨機生成。第一次弄,問題記錄如下:
使用別人訓練好的模型加載
model = word2vec.Word2Vec.load("D:\\work\\Word2Vec訓練好的模型\\搜狐百度120g\\百度百科搜狐新聞.model") # 加載訓練好的語料模型
model = gensim.models.KeyedVectors.load_word2vec_format('D:\\work\\Word2Vec訓練好的模型\\維基百科語料5.7G+訓練模型\\zhwiki_2017_03.sg_50dutf8.word2vec', binary=False)
model = word2vec.Word2Vec.load("D:\\work\\Word2Vec訓練好的模型\\本機訓練好的模型\\200萬標訊標題\\200萬標訊標題測試.model")
model = word2vec.Word2Vec.load("D:\\work\\Word2Vec訓練好的模型\\微信公衆號文章模型\\word2vec_wx")
model = gensim.models.KeyedVectors.load_word2vec_format("D:\\work\\Word2Vec訓練好的模型\\synonyms\\模型\\words.vector",binary=True, unicode_errors='ignore')
以上這幾種加載方式就是之前對網上的模型加載,全部都加載成功了
使用的是268G+訓練好的word2vec模型(中文詞向量),是128維
模型格式有兩種bin和model,使用方式:
a. bin模式:model = gensim.models.KeyedVectors.load_word2vec_format(model_path, binary=True)
b. model模式:model = gensim.models.Word2Vec.load(model_path)
gensim.models.KeyedVectors.load_word2vec_format('word2vec_model/baike_26g_news_13g_novel_229g.bin', binary=True)
未改進前
# emb_dims: 8 (1*8)
zero_embedding = tf.zeros(shape=[1, self.n_emb_dims], dtype=tf.float32)
# voc_size: 12000,emb_dims: 8 ,(12000*8)
# 現在這個要從訓練的詞表裏讀取了!!!
none_zero_embedding = tf.Variable(tf.truncated_normal([self.n_voc_size, self.n_emb_dims], stddev=0.1, dtype=tf.float32), name="embedding_w", dtype=tf.float32)
# embeddings shape: (12001*8)
embeddings = tf.concat([zero_embedding, none_zero_embedding], axis=0, name="embedding_vec")
# 查找embeddings張量中值爲x的元素,這些元素組成一個tensor返回
# 網絡裏需要先把詞的id轉換成對應的向量
# x_input(240*8) 240應該是self.n_item_num * self.n_query_len
# 向量可以是word2vec預訓練好的,也可以是在網絡裏訓練的,在網絡裏需要先把詞的id轉換成對應的向量,這個函數就是做這件事的
x_input = tf.nn.embedding_lookup(embeddings, self.x) # 240*8
# self.x是字的id
# word_dict['公'] = 1
改進後
embedding_file = r'embeddings-100d.txt'
embedding_file = os.path.join(data_path, embedding_file)
max_features = len(word_vocab)
# print(max_features)
#########prepare embeddings
embeddings_index = {}
f = open(embedding_file)
ii = 0
for line in f:
if ii == 0:
ii += 1
continue
values = line.split()
word = values[0]
coefs = np.asarray(values[1:], dtype='float32')
# embeddings_index[word] = coefs
embeddings_index[ii - 1] = coefs
ii += 1
f.close()
# print('Found %s word vectors.' % len(embeddings_index))
##word_index: 詞表
##embedding_matrix: 變量
##embedding_matrix的長度多一行,是的不存在embedding的詞的值都爲0
embedding_matrix = np.zeros((max_features + 1, embedding_dims))
i = 0
for word in word_vocab:
# embedding_vector = embeddings_index.get(word)
embedding_vector = embeddings_index.get(i)
if embedding_vector is not None:
# words not found in embedding index will be all-zeros.
embedding_matrix[i] = embedding_vector
i += 1
參考: