在天然語言處理中,爲了將天然語言轉化爲計算機所能識別的語言,就要對它從新編碼,起初使用one hot編碼。python
一共能產生14901維。算法
問題:佔用太大空間,詞和詞之間的相識度沒法體現。也就是所說的稀疏化。工具
one hot代碼以下:學習
from sklearn.preprocessing import OneHotEncoder # lables = ['ni','號','ni','meimei'] lables = [0,1,0,4] lables = np.array(lables).reshape(len(lables),-1) enc = OneHotEncoder() enc.fit(lables) target = enc.transform(lables).toarray() print(target)
咱們須要將上面的one hot 編碼轉化爲如圖所示的編碼:編碼
主要有兩種假說,今天咱們只談當今的主流思想: Distributed models3d
Word2vec 是代碼項目的名字,只是計算詞嵌入(word embedding)的一個工具,是CBOW和Skip-Gram這兩個模型的合體,目前這套工具徹底開源。code
CBOW是利用詞的上下文預測當前的單詞;而Skip-Gram則是利用當前詞來預測上下文。orm
Word2Vec代碼blog
# 訓練模型定義 from gensim.models import Word2Vec model = Word2Vec(sentences, sg=1, size=100, window=5, min_count=5, negative=3, sample=0.001, hs=1, workers=4) # 訓練後的模型保存與加載 model.save("model_name") # 加載模型 model = Word2Vec.load("model_name") # 模型的使用 #詞向量加減 model.most_similar(positive=['woman', 'king'], negative=['man']) #輸出[('queen', 0.50882536), ...] # 尋找指定詞語最類似的詞語 print model.most_similar('morning', topn=1) model.doesnt_match("breakfast cereal dinner lunch".split()) #輸出'cereal' # 計算詞語的類似度 model.similarity('woman', 'man') #輸出0.73723527 model['computer'] # raw numpy vector of a word #輸出array([-0.00449447, -0.00310097, 0.02421786, ...], dtype=float32)
Word2Vec參數描述:ip
1.sg=1是skip-gram算法,對低頻詞敏感;默認sg=0爲CBOW算法。
2.size是輸出詞向量的維數,值過小會致使詞映射由於衝突而影響結果,值太大則會耗內存並使算法計算變慢,通常值取爲100到200之間。
3.window是句子中當前詞與目標詞之間的最大距離,3表示在目標詞前看3-b個詞,後面看b個詞(b在0-3之間隨機)。
4.min_count是對詞進行過濾,頻率小於min-count的單詞則會被忽視,默認值爲5。
5.negative和sample可根據訓練結果進行微調,sample表示更高頻率的詞被隨機下采樣到所設置的閾值,默認值爲1e-3。
6.hs=1表示層級softmax將會被使用,默認hs=0且negative不爲0,則負採樣將會被選擇使用。
7.workers控制訓練的並行,此參數只有在安裝了Cpython後纔有效,不然只能使用單核。
Word2Vec中從輸入到隱層的過程就是Embedding的過程。 Embedding的過程就是把多維的onehot進行降維的過程,是個深度學習的過程。知足: