辭彙星空:如何構建一個炫酷的 Word2Vec 可視化

該可視化從高維word2vec嵌入構建了最近鄰居圖(Nearest neighbor graph)。

本文由劉晶翻譯自 github

anvaka/word2vec-graph?

github.com圖標

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?

nlp.stanford.edu圖標

1.2爬蟲數據集

我還利用 Common Crawl 數據集(8400億詞條,220萬單詞,每個單詞由一個300維向量表示)製作了一張可視化圖。包含非單詞字元和數字的單詞都被刪除。

許多仍然存在的集群代表了拼寫錯誤的單詞:

這些集群的含義很難破解。相比之下,維基百科語料的嵌入更有意義。儘管如此,我仍想保留這個可視化,以便讓你探索它:

  • Common Crawl 可視化 - 28.4MB -

Code Galaxies Visualization?

anvaka.github.io圖標

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)?

github.com

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

  1. 下載詞向量,並將它們提取到圖數據中
  2. 修改 save_text_edges.py 指向新提取的向量(請參閱文件獲取更多細節)
  3. 運行 python save_text_edges.py - 取決於輸入詞向量文件的大小,這需要一段時間。輸出文件 edges.txt 將被保存在 graph-data 文件夾中
  4. 運行 node edges2graph.js graph-data / edges.txt - 這將以二進位格式將圖形保存到graph-data 文件夾(graph-data / labels.json,graph-data / links.bin)
  5. 現在是時候運行布局了。有兩種選擇。一個很慢,另一個速度更快,尤其是在多線程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)?

github.com

在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

搞定!現在圖和位置布局都準備好了。你可以在 anvaka.github.io/pm/# 使用 Your own graphs

anvaka/pm?

github.com

里的說明可視化你的新圖。


關注集智AI學園公眾號

獲取更多更有趣的AI教程吧!

搜索微信公眾號:swarmAI

集智AI學園QQ群:426390994

集智AI學園?

campus.swarma.org圖標


商務合作|zhangqian@swarma.org

投稿轉載|wangjiannan@swarma.org。

推薦閱讀:

為何讀不懂你的那個TA
[本人原創]思維(意識)整體論圖Graph假設(記憶-抽象實體化,聯結記憶(工作記憶)-邊關係化)
《Dialogue Act Sequence Labeling using Hierarchical encoder with CRF》閱讀筆記
Model, model告訴我,她到底在想什麼?
【實戰NLP】豆瓣影評情感分析

TAG:自然語言處理 | 詞向量 | word2vec |