詞向量源碼解析:(3.1)GloVe源碼解析

在word2vec之後又出現了很多詞向量模型,其中一個非常流行的模型就是GloVe。GloVe的訓練方式和主流的詞向量不太一樣。主流的詞向量模型是像word2vec那樣掃一遍語料,一個一個單詞的進行訓練。換句話說,每個單詞和周圍的上下文單詞組成訓練的樣本,詞向量在這個中心詞,上下文單詞的對(pair)上面進行訓練(比如<eat, food>這樣的pair上面進行訓練)。但是GloVe不是在pair上面進行訓練,而是需要先把pair進行彙總,得到共現矩陣,在這個共現矩陣上面進行訓練。比如of,the這兩個單詞總共在語料中共現了100萬次,那麼GloVe會利用100萬這個彙總的信息進行訓練。

GloVe從github上面可以下載https://github.com/stanfordnlp/GloVe。GloVe代碼包括了四個.c文件。這四個文件都在src文件下面。要想得到GloVe訓練的詞向量順序的執行這四個文件即可。首先執行vocab_count.c這個文件的功能是掃一遍語料,建立一個字典。然後執行cooccur.c文件。它的功能是從語料中建立共現矩陣,GloVe是在共現矩陣上面進行訓練的。所謂共現矩陣,在GloVe中是大量的三元組<eat, food, 150>,<of, the, 100000>......cooccur.c文件生成的三元組的順序是根據詞頻排好序的。比如<of, the, 100000>在<eat, food, 150>前面,因爲of的頻數大於eat。<of, the, 100000><of, mine, 1000>前面,因爲the的頻數大於mine。然後執行第三個文件shuffle.c。這個文件是用來打亂之前生成的共現矩陣(也就是打亂三元組的順序)。最後執行glove.c。它會在打亂順序的三元組上面訓練詞向量。

  

eval文件中給出了評估詞向量的代碼。評估的方法和word2vec是一模一樣的。數據集也是一模一樣的。只不過GloVe評估的代碼是用python去寫的。運行GloVe的話就執行demo.sh腳本。下面是demo.sh的代碼,從中也可以看到我們上面說的GloVe執行的流程。

#!/bin/bash
set -e


# Makes programs, downloads sample data, trains a GloVe model, and then evaluates it.
# One optional argument can specify the language used for eval script: matlab, octave or [default] python


make //編譯C源代碼
if [ ! -e text8 ]; then//下載語料
  if hash wget 2>/dev/null; then
    wget http://mattmahoney.net/dc/text8.zip
  else
    curl -O http://mattmahoney.net/dc/text8.zip
  fi
  unzip text8.zip
  rm text8.zip
fi

//GloVe訓練的參數
CORPUS=text8
VOCAB_FILE=vocab.txt
COOCCURRENCE_FILE=cooccurrence.bin
COOCCURRENCE_SHUF_FILE=cooccurrence.shuf.bin
BUILDDIR=build
SAVE_FILE=vectors
VERBOSE=2
MEMORY=4.0
VOCAB_MIN_COUNT=5
VECTOR_SIZE=50
MAX_ITER=15
WINDOW_SIZE=15
BINARY=2
NUM_THREADS=8
X_MAX=10

//下面依次執行vocab_count cooccur shuffle glove 我把echo部分去掉了
$BUILDDIR/vocab_count -min-count $VOCAB_MIN_COUNT -verbose $VERBOSE < $CORPUS > $VOCAB_FILE
$BUILDDIR/cooccur -memory $MEMORY -vocab-file $VOCAB_FILE -verbose $VERBOSE -window-size $WINDOW_SIZE < $CORPUS > $COOCCURRENCE_FILE
$BUILDDIR/shuffle -memory $MEMORY -verbose $VERBOSE < $COOCCURRENCE_FILE > $COOCCURRENCE_SHUF_FILE
$BUILDDIR/glove -save-file $SAVE_FILE -threads $NUM_THREADS -input-file $COOCCURRENCE_SHUF_FILE -x-max $X_MAX -iter $MAX_ITER -vector-size $VECTOR_SIZE -binary $BINARY -vocab-file $VOCAB_FILE -verbose $VERBOSE
if [ "$CORPUS" = 'text8' ]; then//評估詞向量
   if [ "$1" = 'matlab' ]; then
       matlab -nodisplay -nodesktop -nojvm -nosplash < ./eval/matlab/read_and_evaluate.m 1>&2 
   elif [ "$1" = 'octave' ]; then
       octave < ./eval/octave/read_and_evaluate_octave.m 1>&2
   else
       echo "$ python eval/python/evaluate.py"
       python eval/python/evaluate.py
   fi
fi

  

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