辭彙星空:如何構建一個炫酷的 Word2Vec 可視化
該可視化從高維word2vec嵌入構建了最近鄰居圖(Nearest neighbor graph)。
本文由劉晶翻譯自 github
anvaka/word2vec-graph
1.數據集
1.1GloVe 數據集
用於該可視化的數據集來自GloVe,包含60億詞條,40萬單詞,每個單詞由一個300維向量表示。
- 距離<0.9 - 在該可視化中,當詞向量之間的距離小於0.9時,相應的單詞之間形成連邊。所有帶有非單詞字元和數字的單詞都被刪除。最終的可視化是稀疏但有意義的。
- 距離<1.0 - 與上述類似,但距離要求放寬。距離小於1.0的單詞之間形成連邊。所有帶有非單詞字元和數字的單詞都被刪除。隨著更多詞的加入,可視化變得更加豐富,依舊有意義。
- 未處理;距離<0.9(6.9 MB) - 與上面的可視化不同,這裡並未過濾單詞,因此包含了數據集中的所有單詞。這裡形成的大部分集群都是數字。我沒有發現它特別有趣,但我依舊收錄它來展示word2vec是如何找到數字集群的。
GloVe 項目地址:
Global Vectors for Word Representation
1.2爬蟲數據集
我還利用 Common Crawl 數據集(8400億詞條,220萬單詞,每個單詞由一個300維向量表示)製作了一張可視化圖。包含非單詞字元和數字的單詞都被刪除。
許多仍然存在的集群代表了拼寫錯誤的單詞:
這些集群的含義很難破解。相比之下,維基百科語料的嵌入更有意義。儘管如此,我仍想保留這個可視化,以便讓你探索它:
- Common Crawl 可視化 - 28.4MB -
Code Galaxies Visualization
2.簡介和細節
word2vec是一系列演算法,能夠將單詞嵌入到高維向量空間中。
// For examplecat => [0.1, 0.0, 0.9]dog => [0.9, 0.0, 0.0]cow => [0.6, 1.0, 0.5]
詞向量之間的距離越短,相應單詞在語料中通常有著相似的上下文(語境)。這使我們能夠找出單詞之間的距離:
|cat - dog| = 1.20|cat - cow| = 1.48"cat" is closer to "dog" than it is to the "cow".
2.1如何構建一個圖
我們可以簡單地遍歷字典中的每個單詞,並將它們添加到圖中。但是這個圖中的連邊是什麼?
如果詞向量之間的距離小於給定的閾值,相應的單詞之間就形成一條連邊。
一旦圖構建完成,我使用這裡給出的方法:Your own graphs 來實現可視化。
注意:從實用角度來看,在高維空間搜索所有最近鄰是一項非常耗費CPU的任務。建立矢量的索引對這個問題有幫助。我不知道針對這個任務有沒有一個好的庫,所以我在Twitter上諮詢。 @gumgumeo和@AMZoellner的建議在
https://github.com/spotify/annoy)2.2數據與數據預處理
我使用了GloVe項目的預訓練過的word2vec模型。
我最開始渲染 Word2vec 圖的結果是數量龐大的數字集群。 word2vec模型真的很喜歡把數字放在一起(直觀上我認為這很有道理)。唉,這使得可視化變得無趣。當我從一個集群到另一個集群時,卻發現只是從一個全是2017 - 2300的數字,而另一個是0.501 .. 0.403
在Common Crawl 的word2vec編碼中,我刪除了所有包含非單詞字元或數字的單詞。在我看來,這使得可視化更加有趣,但很多集群仍然不容易理解。
不同單詞的 in-degree 和 out-degree
3.本地設置
3.1環境要求
確保 node.js 已安裝。
git clone https://github.com/anvaka/word2vec-graph.gitcd word2vec-graphnpm install
- 下載詞向量,並將它們提取到圖數據中
- 修改 save_text_edges.py 指向新提取的向量(請參閱文件獲取更多細節)
- 運行 python save_text_edges.py - 取決於輸入詞向量文件的大小,這需要一段時間。輸出文件 edges.txt 將被保存在 graph-data 文件夾中
- 運行 node edges2graph.js graph-data / edges.txt - 這將以二進位格式將圖形保存到graph-data 文件夾(graph-data / labels.json,graph-data / links.bin)
- 現在是時候運行布局了。有兩種選擇。一個很慢,另一個速度更快,尤其是在多線程CPU上。
3.2生成節點的布局
你可以使用
node --max-old-space-size=12000 layout.js
來生成布局。這需要一段時間才能收斂(500次迭代後停止)。還要注意,我們需要增加節點進程的最大允許RAM(max-old-space-size 參數)。我將它設置為?12GB - 這足以滿足我的情況
3.3利用C++生成布局
更快的版本是編譯 layout++ 模塊。您將需要手動下載並編譯 anvaka / ngraph.native
https://github.com/anvaka/ngraph.native)在ubuntu上它非常簡單:只需運行./compile-demo ,layout ++文件會在工作文件夾中被創建。你可以將該文件複製到庫中,然後運行:
./layout++ ./graph-data/links.bin
布局會更快地收斂,但是你需要在500-700次迭代後手動殺死它(Ctrl + C)。
你會發現很多 .bin 文件。只需選擇數字最高的那個,然後將其作為positions.bin複製到graph-data/ 文件夾中。例如:
cp 500.bin ./graph-data/positions.bin
搞定!現在圖和位置布局都準備好了。你可以在 https://anvaka.github.io/pm/#/ 使用 Your own graphs
anvaka/pm里的說明可視化你的新圖。
關注集智AI學園公眾號
獲取更多更有趣的AI教程吧!
搜索微信公眾號:swarmAI
集智AI學園QQ群:426390994
集智AI學園商務合作|zhangqian@swarma.org
投稿轉載|wangjiannan@swarma.org。
推薦閱讀:
※為何讀不懂你的那個TA
※[本人原創]思維(意識)整體論圖Graph假設(記憶-抽象實體化,聯結記憶(工作記憶)-邊關係化)
※《Dialogue Act Sequence Labeling using Hierarchical encoder with CRF》閱讀筆記
※Model, model告訴我,她到底在想什麼?
※【實戰NLP】豆瓣影評情感分析