用中文資料測試 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

results matching ""

    No results matching ""