用中文資料測試 word2vec
MM 06/22/2018
word2vec 是把每個詞本身用一個多維向量來表示,把詞投影到一個向量空間裡。
相同屬性的詞可能會靠得很近,甚至部份的向量有邏輯上的線性關係。
語料
先下載萌典資料[1]。
$ git clone --depth 1 https://github.com/g0v/moedict-data.git
$ git clone --depth 1 https://github.com/g0v/moedict-epub.git
$ cp -v moedict-data/dict-revised.json moedict-epub/
$ cd moedict-epub
$ perl json2unicode.pl > dict-revised.unicode.json
再利用此篇作者寫的extract_json.py檔案,將可供訓練的句子抽出來
python3 extract_json.py < dict-revised.unicode.json > sentences.txt
斷詞
word2vec 的輸入必須是以空白隔開的詞,可選用結巴斷詞來處理句子。
作者寫了cut.py來處理句子。
python cut.py < sentences.txt > sentences.segged.txt
斷出來的結果大約像是
紅樓夢 . 第十七回 : 「 一 槅 一 槅 , 或 有 貯書處 , 或 有 設鼎處 , 或 安置 筆硯 處 , 或供 設瓶花 、 或 安放 盆景 處 。 」
使用 word2vec 訓練詞向量
將工作站的詞丟給 word2vec 訓練
./word2vec -train sentences.segged.txt -output vectors.bin -cbow 0 -size 200 -window 10 -negative 5 -hs 0 -sample 1e-4 -threads 24 -binary 1 -iter 20 -min-count 1
萌典抽出來的資料不算多,所以訓練起來滿快的。
測試
先測試距離相近的字
./distance vectors.bin
效果差強人意,不過還是可以看到相同屬性的字有些群聚效應
Enter word or sentence (EXIT to break): 法國
Word: 法國 Position in vocabulary: 992
Word Cosine distance
------------------------------------------------------------------------
英國 0.763948
德國 0.727664
義大利 0.724732
瑞士 0.724247
西班牙 0.715528
奧地利 0.696855
蘇格蘭 0.689557
接著測試線性關係,A 比 B 就好像 C 比什麼?
./word-analogy vectors.bin
對於國家與都市的推理,也稍有效果
Enter three words (EXIT to break): 法國 巴黎 英國
Word: 法國 Position in vocabulary: 992
Word: 巴黎 Position in vocabulary: 6379
Word: 英國 Position in vocabulary: 822
Word Distance
------------------------------------------------------------------------
倫敦 0.583572
七二年 0.576999
莫斯科 0.566673
四四年 0.566332
一九四一年 0.562817
芝加哥 0.559529
一九六二年 0.556010
羅浮宮 0.555593
油畫院 0.5543
程式碼
相關的程式碼放在 GitHub 上面供參考 [2]
[0]
https://city.shaform.com/blog/2014/11/04/word2vec.html
[1]
https://github.com/g0v/moedict-webkit
[2]
https://github.com/shaform/experiments/tree/master/word2vec_tw