1. 程式人生 > >Windows下執行C語言版Word2Vec訓練詞向量

Windows下執行C語言版Word2Vec訓練詞向量

在Word2vec模型中,演算法可以通過無監督的方法為每個詞計算出一個d維的向量,即將每個詞對映為d維的空間中的一個點,d維空間中點之間的距離(即每個詞對應的d維向量的距離)可反映詞之間的相似性。

dav/word2vec是一個經典的利用多執行緒訓練詞向量的程式碼,非常地好用且非常地高效。然而該程式碼是用Linux C語言寫的,而且程式碼的排程使用的是shell。在Windows上安裝Cygwin即可執行該程式碼。

1.下載Cygwin,安裝包可在官網下載,也可加QQ群426491390從群檔案中下載。
2.在Cygwin中安裝gcc、make、wget、unzip命令。例如,安裝make命令的方法如下圖所示:

這裡寫圖片描述

3.下載並解壓dav/word2vec程式碼,程式碼也可從QQ群426491390從群檔案中下載。
4.開啟Cygwin,進入dav/word2vec所在資料夾(windows目錄在Cygwin的/cygdrive目錄下),實行命令:

cd scripts
sh demo-word.sh

這時候發現報錯了,這是因為word2vec中的src/makefile將word2vec.c編譯成了類似word2vec而並非word2vec.exe,同樣,scripts/demo-word.sh中執行的是bin/word2vec而不是word2vec.exe,因此要對src/makefile和scripts/demo-word.sh都進行一些修改,QQ群426491390

群檔案中的dev/word2vec版本已經修改過這倆檔案。

將src/makefile修改為:

SCRIPTS_DIR=../scripts
BIN_DIR=../bin

CC = gcc
#The -Ofast might not work with older versions of gcc; in that case, use -O2
CFLAGS = -lm -pthread -O2 -Wall -funroll-loops -Wno-unused-result

all: word2vec word2phrase distance word-analogy compute-accuracy
word2vec : word2vec.c $(CC) word2vec.c -o ${BIN_DIR}/word2vec.exe $(CFLAGS) word2phrase : word2phrase.c $(CC) word2phrase.c -o ${BIN_DIR}/word2phrase.exe $(CFLAGS) distance : distance.c $(CC) distance.c -o ${BIN_DIR}/distance.exe $(CFLAGS) word-analogy : word-analogy.c $(CC) word-analogy.c -o ${BIN_DIR}/word-analogy.exe $(CFLAGS) compute-accuracy : compute-accuracy.c $(CC) compute-accuracy.c -o ${BIN_DIR}/compute-accuracy.exe $(CFLAGS) chmod +x ${SCRIPTS_DIR}/*.sh clean: pushd ${BIN_DIR} && rm -rf word2vec.exe word2phrase.exe distance.exe word-analogy.exe compute-accuracy.exe; popd

將scripts/demo-word.sh修改為:

#!/bin/bash

DATA_DIR=../data
BIN_DIR=../bin
SRC_DIR=../src

TEXT_DATA=$DATA_DIR/text8
ZIPPED_TEXT_DATA="${TEXT_DATA}.zip"
VECTOR_DATA=$DATA_DIR/text8-vector.bin

pushd ${SRC_DIR} && make; popd

if [ ! -e $VECTOR_DATA ]; then

  if [ ! -e $TEXT_DATA ]; then
    if [ ! -e $ZIPPED_TEXT_DATA ]; then
        wget http://mattmahoney.net/dc/text8.zip -O $ZIPPED_TEXT_DATA
    fi
    unzip $ZIPPED_TEXT_DATA
    mv text8 $TEXT_DATA
  fi
  echo -----------------------------------------------------------------------------------------------------
  echo -- Training vectors...
  time $BIN_DIR/word2vec.exe -train $TEXT_DATA -output $VECTOR_DATA -cbow 0 -size 200 -window 5 -negative 0 -hs 1 -sample 1e-3 -threads 12 -binary 1

fi

echo -----------------------------------------------------------------------------------------------------
echo -- distance...

$BIN_DIR/distance.exe $DATA_DIR/$VECTOR_DATA

cd scripts進入scripts資料夾,再次執行:

sh demo-word.sh

回車後開始訓練:

這裡寫圖片描述

訓練完成後會自動執行近義詞查詢程式:

這裡寫圖片描述

為什麼示例中與small最相似的近義詞是large?因為Word2vec計算出的近義詞傾向於用法的相似性,而非真正語義的相似性。

更多與Word2vec相關的知識可加QQ群426491390討論。