如何将 Word2Vec 模型表示为图形? (或将 1x300 numpy 数组转换为 1x2 数组)

How to represent Word2Vec model to graph? (or convert a 1x300 numpy array to just 1x2 array)

我的 Word2Vec 模型有一个 1x300 numpy 数组,它是 returns 像这样:

[ -2.55022556e-01   1.06162608e+00  -5.86191297e-01  -4.43067521e-01
   4.46810514e-01   4.31743741e-01   2.16610283e-01   9.27684903e-01
  -4.47879761e-01  -9.11142007e-02   3.27048987e-01  -8.05553675e-01
  -8.54483843e-02  -2.85595834e-01  -2.70745698e-02  -3.08014955e-02
   1.53204888e-01   3.16114485e-01  -2.82659411e-01  -2.98218042e-01
  -1.03240972e-02   2.12806061e-01   1.63605273e-01   9.42423999e-01
   1.20789325e+00   4.11570221e-01  -5.46323597e-01   1.95108235e-01
  -4.53743488e-01  -1.28625661e-01  -7.43277609e-01   1.11551750e+00
  -4.51873302e-01  -1.14495361e+00  -6.69551417e-02   6.88364863e-01
  -6.01781428e-01  -2.36386538e-01  -3.64305973e-01   1.18274912e-01
   2.03438237e-01  -1.01153564e+00   6.67958856e-01   1.80363625e-01
   1.26524955e-01  -2.96024203e-01  -9.93479714e-02  -4.93405871e-02
   1.02504417e-01   7.63318688e-02  -3.68398607e-01   3.03587675e-01
  -2.90227026e-01   1.51891649e-01  -6.93689287e-03  -3.99766594e-01
  -1.86124116e-01  -2.86920428e-01   2.04880714e-01   1.39914978e+00
   1.84370011e-01  -4.58923727e-01   3.91094625e-01  -7.52937734e-01
   3.05261135e-01  -4.55163687e-01   7.22679734e-01  -3.76093656e-01
   6.05900526e-01   3.26470852e-01   4.72957864e-02  -1.18182398e-01
   3.51043999e-01  -3.07209432e-01  -6.10330477e-02   4.14131492e-01
   7.57511556e-02  -6.48704231e-01   1.42518353e+00  -9.20495167e-02
   6.36665523e-01   5.48510313e-01   5.92754841e-01  -6.29535854e-01
  -4.47180003e-01  -8.99413109e-01  -1.52441502e-01  -1.98326513e-01
   4.74154204e-01  -2.07036674e-01  -6.70400202e-01   6.67807996e-01
  -1.04234733e-01   7.16163218e-01   3.32825005e-01   8.20083246e-02
   5.88186264e-01   4.06852067e-01   2.66174138e-01  -5.35981596e-01
   3.26077454e-02  -4.04357493e-01   2.19569445e-01  -2.74264365e-01
  -1.65187627e-01  -4.06753153e-01   6.12065434e-01  -1.89857081e-01
  -5.56927800e-01  -6.78636551e-01  -7.52498448e-01   1.04564428e+00
   5.32510102e-01   5.05628288e-01   1.95120305e-01  -6.40793025e-01
   5.73082231e-02  -1.58281475e-02  -2.62718409e-01   1.74351722e-01
  -6.95129633e-02   3.44214857e-01  -4.24746841e-01  -2.75907904e-01
  -6.60992935e-02  -1.19041657e+00  -6.01056278e-01   5.67718685e-01
  -6.47478551e-02   1.55902460e-01  -2.48480186e-01   5.56753576e-01
   1.29889056e-01   3.91534269e-01   1.28707469e-01   1.29670590e-01
  -6.98880851e-01   2.43386969e-01   7.70289376e-02  -1.14947490e-01
  -4.31593180e-01  -6.16873622e-01   6.03831768e-01  -2.07050622e-01
   1.23276520e+00  -1.67524610e-02  -4.67656374e-01   1.00281858e+00
   5.17916441e-01  -7.99495637e-01  -4.22653735e-01  -1.45487636e-01
  -8.71369673e-04   1.25453219e-01  -1.25869447e-02   4.66426492e-01
   5.07026255e-01  -6.53024793e-01   7.53435045e-02   8.33864748e-01
   3.37398499e-01   7.50920832e-01  -4.80326146e-01  -4.52838868e-01
   5.92808545e-01  -3.57870340e-01  -1.07011057e-01  -1.13945460e+00
   3.97635132e-01   1.23554178e-01   4.81683850e-01   5.47445454e-02
  -2.18614921e-01  -2.00085923e-01  -3.73975009e-01   8.74632657e-01
   6.71471596e-01  -4.01738763e-01   4.76147681e-01  -5.79257011e-01
  -1.51511624e-01   1.43170074e-01   5.00052273e-01   1.46719962e-01
   2.43085429e-01   5.89158475e-01  -5.25088668e-01  -2.65306592e-01
   2.18211919e-01   3.83228660e-01  -2.51622144e-02   2.32621357e-01
   8.06669474e-01   1.37254462e-01   4.59401071e-01   5.63044667e-01
  -5.79878241e-02   2.68106610e-01   5.47239482e-01  -5.05441546e-01]

阅读起来非常令人沮丧,因为我只想得到一个像 [12,19] 这样的 1x2 数组,这样我就可以将它表示为图形并对 1x2 数组进行余弦距离测量。

怎么做?或者如何将 1x300 Word2Vec 模型表示为二维图形?

有很多方法可以将 "dimensionality reduction" 应用于高维数据,以帮助解释或绘图。

一种将 300 维减少到仅 2 维的超级简单方法,用于在平面上绘图 screen/paper:只需丢弃 298 维!如果仅采用示例向量的第一个和第二个维度,您将有一些东西可以绘制 - 例如点 (-0.255022556, 1.06162608)

但是,从 word2vec 向量开始,这些可能不会是非常有趣的点,无论是单独的还是当您开始绘制多个单词时。此类向量的确切轴维度不太可能对人类具有直观意义,并且您丢掉了每个向量 99.7% 的所有意义——而且很可能(相互一致)捕获语义意义关系的维度。

所以你更有可能做一些更周到的降维。一种超级简单的技术是选择两个被认为有意义的矢量方向作为新的 X 轴和 Y 轴。在 word2vec 世界中,这些不一定是集合中的现有向量——尽管它们可能是——但可能是两个向量之间的差异。 (word2vec 向量的类比解决能力本质上来自发现两个向量 A 和 B 之间的差异,然后将该差异应用于第三个向量 C 以找到第四个向量 D,此时 D 通常具有相同的人类直觉与 C 的类比关系就像 B 必须与 A 一样。)

例如,您可以区分 'man' 和 'woman' 的词向量,以获得引导新 X 轴的向量。然后区分 'parent' 和 'worker' 的词向量,以获得引导新 Y 轴的向量。然后,对于要绘制的每个候选 300 维向量,通过计算其在 X 方向向量上的投影大小来找到该候选向量的 "new X"。然后,通过计算候选向量在 Y 方向向量上的投影大小来找到候选向量的 "new Y"。这 可能 产生一组相对值,在二维图表上,这些值与人类对性别和 familial/workplace 角色之间经常观察到的语言关系的直觉模糊匹配。

正如@poorna-prudhvi 的评论所提到的,PCA 和 t-SNE 是其他技术——它们可能在保留全维数据的某些有趣特性方面做得更好。 t-SNE,特别是为了支持机器学习和绘图而发明,并试图使存在于较高维数中的距离关系与较低维数中的距离关系保持相似。

除了@gojomo 的回答,如果只是为了实验,我建议使用 tensorflow's projector,它为开箱即用的(大约)PCA 和 t-SNE 提供了一个很好的 GUI。

只需使用 numpy.savetxt 正确格式化您的矢量。