使用預訓練的word2vec詞向量

2021-08-11 16:23:41 字數 2997 閱讀 9595

之前被這個問題困擾了挺長時間,一直找不到有效的方法,可能是我太菜……

在網上找資料也只找到了一種把bin轉換成txt 檔案的方式,但是效率出奇的低,無法想象,本地一執行程式就宕機,伺服器上也得等很長時間。多虧了有一顆優化模型的心……

山重水複疑無路,柳暗花明又一村啊。

在一篇*****裡面,作者用theano直接對二進位制bin檔案進行了處理。速度上有天壤之別,一種是拖拉機,一種是火箭,遂把它進行改動用到了自己的模型裡。

一、先介紹直接對txt進行處理的方法,該方法缺點,速度太慢,而且兩篇博文裡都是從placeholder裡傳入詞向量資料,對於這種方式,我持保留意見。原因:

1,如果從placeholder裡傳入資料,那在實際應用中,每乙個batch都要傳入全部的詞向量,這對於稍複雜的模型來說顯然很吃力,額外增加了很多計算量。

2,在模型訓練過程中可以控制詞向量可訓練與不可訓練,從palceholdler傳入,降低了靈活性。

3,bin檔案轉換成txt格式,檔案大小變為原來的兩倍,還需要解碼,又增加了讀取時間。

中文)[作者最後提到的unk情況,其實可有可無,看你在對資料進行預處理的時候是否考慮了這種情況,如果已經考慮到了unk則在此處不需要]

英文)二、直接對bin檔案進行處理

1,這種方式跟上面的方式有很大不同,首先是在分離word的時候,是採用從每一行的開始挨個單詞讀到第乙個空格處為止,便是乙個單詞,每一行都重複這種動作,直到整個檔案讀完。

for line in xrange(vocab_size):

word =

while true:

ch = f.read(1)

#print ch

if ch == ' ':

word = ''.join(word)

#print 'single word:',word

break

if ch != '\n':

#print word

2,第二步是從大的詞向量表中,來找到與單詞相對應的詞向量

if word in vocab:

word_vecs[word] = np.fromstring(f.read(binary_len), dtype='float32')

if i==0:

print 'word',word

i=1else:

f.read(binary_len)

3,對於詞表中沒有的單詞進行處理,這裡採用的是uniform隨機初始化

def add_unknown_words(word_vecs, vocab, min_df=1, k=300):

"""for words that occur in at least min_df documents, create a separate word vector.

"""for word in vocab:

if word not in word_vecs and vocab[word] >= min_df:

word_vecs[word] = np.random.uniform(-0.25,0.25,k)

4,在應用之前,也就是傳入embedding lookup之前,需要取出對應詞表,並進行一定預處理。

defget_w(word_vecs, k=300):

"""get word matrix. w[i] is the vector for word indexed by i

"""vocab_size = len(word_vecs)

word_idx_map = dict()

w = np.zeros(shape=(vocab_size+1, k), dtype='float32')

w[0] = np.zeros(k, dtype='float32')

i = 1

forwordinword_vecs:

w[i] = word_vecs[word]

word_idx_map[word] = i

i += 1

returnw, word_idx_map

5,在main函式中呼叫的過程:

if __name__=="__main__":

w2v_file = "googlenews-vectors-negative300.bin"#google news word2vec bin檔案

print "loading data...",

vocab = wordlist('vocab.txt')#自己的資料集要用到的詞表

w2v,pury_word2vec = load_bin_vec(w2v_file, vocab.voc)

add_unknown_words(w2v, vocab.voc)

w, word_idx_map = get_w(w2v)

'''embedding lookup簡單應用'''

wa = tf.variable(w)

embedding_input = tf.nn.embedding_lookup(wa, [0,1,2])#正常使用時要替換成相應的doc

with tf.session() as sess:

sess.run(tf.global_variables_initializer())

input = sess.run(wa)

#print np.shape(wa)

此處僅做了使用的簡單示例,如果應用到自己的專案中去,還需要優化一下結構。以適應自己專案的需要。

補充:關於txt格式的檔案,也找到了速度很快的處理方式,glove和word2vec只要是一樣的格式,**可以通用,可以移步這裡:

github:    

利用Word2Vec訓練詞向量過程

先明確一點,選用不同的詞向量作為模型的初始值,效果的差異非常大!那麼怎麼產生乙個好的詞向量呢?參看文章 1 英文的詞向量可以訓練,也可以用google訓練好的那個模型。2 但是中文就不行了,沒有乙個公布乙個權威的詞向量。語料對詞向量的影響比模型的影響要重要得多得多得多 重要的事說三遍 很多 都提到語...

如何用word2vec 訓練詞嵌入模型

如何用word2vec 訓練詞嵌入模型 一 應用場景 假設你有乙個商品的資料庫,比如 現在通過使用者的輸入來檢索商品的 方法一 直接匹配法 最簡單的方法就是通過字串進行匹配,比如,使用者輸入 椅子 就用 椅子 作為關鍵字進行搜尋,很容易找到椅子的 就是200元 個。方法二 語義相似法 但有時使用者輸...

小小word2vec模型訓練

嗨,好久不見啊!今天我們來完成乙個word2vec模型訓練,學習筆記有挺多人寫的,不瞞您說,小白也是看別人的部落格學習的。所以這次,小白就直接上手例項啦,一起嘛?首先介紹一下模型引數 通過jieba分詞 import jieba import pandas as pd 把文字檔案讀進來,再分詞,去停...