【風控實踐】徵信模型改進word2vec

這次改進打算使用中文的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

 

參考:

word2vec的一些總結

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章