词汇星空:如何构建一个炫酷的 Word2Vec 可视化

漫游“词汇的星空”

本文由刘晶翻译自 github

原项目地址:https://github.com/anvaka/word2vec-graph

1.数据集

1.1GloVe 数据集

用于该可视化的数据集来自GloVe,包含60亿词条,40万单词,每个单词由一个300维向量表示。

距离

距离

未处理;距离

GloVe 项目地址:https://nlp.stanford.edu/projects/glove/

1.2爬虫数据集

我还利用 Common Crawl 数据集(8400亿词条,220万单词,每个单词由一个300维向量表示)制作了一张可视化图。包含非单词字符和数字的单词都被删除。

许多仍然存在的集群代表了拼写错误的单词:

这些集群的含义很难破解。相比之下,维基百科语料的嵌入更有意义。尽管如此,我仍想保留这个可视化,以便让你探索它:

Common Crawl 可视化 - 28.4MB -

地址:https://anvaka.github.io/pm/#/galaxy/word2vec-crawl?cx=-2411&cy=6376&cz=-7215&lx=0.0797&ly=-0.8449&lz=-0.4925&lw=0.1930&ml=150&s=1.75&l=1&v=d300

2.简介和细节

word2vec是一系列算法,能够将单词嵌入到高维向量空间中。

// For example

cat => [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的建议在spotify/annoy(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.git

cd word2vec-graph

npm 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 (https://github.com/anvaka/pm#your-own-graphs)里的说明可视化你的新图。

关注集智AI学园公众号

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

搜索微信公众号:swarmAI

学园网站:campus.swarma.org

商务合作|zhangqian@swarma.org

投稿转载|wangjiannan@swarma.org

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180408G1K1LD00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券