漫游“词汇的星空”
本文由刘晶翻译自 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
领取专属 10元无门槛券
私享最新 技术干货