【问题标题】:Using SVD to plot word vector to measure similarity使用 SVD 绘制词向量来衡量相似度
【发布时间】:2015-10-07 14:00:38
【问题描述】:

这是我用来计算直接邻居计数的单词共现矩阵的代码。我在网上找到了以下代码,它使用了 SVD。

 import numpy as np
 la = np.linalg
 words = ['I','like','enjoying','deep','learning','NLP','flying','.']
 ### A Co-occurence matrix which counts how many times the word before and after a particular word appears ( ie, like appears after I 2 times)
 arr = np.array([[0,2,1,0,0,0,0,0],[2,0,0,1,0,1,0,0],[1,0,0,0,0,0,1,0],[0,0,0,1,0,0,0,1],[0,1,0,0,0,0,0,1],[0,0,1,0,0,0,0,8],[0,2,1,0,0,0,0,0],[0,0,1,1,1,0,0,0]])
 u, s, v = la.svd(arr, full_matrices=False)
 import matplotlib.pyplot as plt
 for i in xrange(len(words)):
     plt.text(u[i,2], u[i,3], words[i])

在最后一行代码中,U的第一个元素作为x坐标,U的第二个元素作为y坐标来投影单词,看相似度。 这种方法背后的直觉是什么? 为什么他们将每行(每行代表每个单词)中的第一个和第二个元素作为 x 和 y 来表示一个单词?请帮忙。

【问题讨论】:

  • 代码的来源在哪里,可以发链接吗?
  • @alvas - 我的朋友编写代码作为他项目工作的一部分。但它正在工作。我无法直观了解他们选择 U[row,1] 和 U[row,2] 作为 x 和 y 坐标的方式和原因
  • 我很难理解,这对我帮助很大:youtube.com/watch?v=EokL7E6o1AE&t=22s

标签: python matplotlib nlp svd


【解决方案1】:
import numpy as np
import matplotlib.pyplot as plt
la = np.linalg
words = ["I", "like", "enjoy", "deep", "learning", "NLP", "flying", "."]
X = np.array([[0,2,1,0,0,0,0,0], [2,0,0,1,0,1,0,0], [1,0,0,0,0,0,1,0], [0,1,0,0,1,0,0,0], [0,0,0,1,0,0,0,1], [0,1,0,0,0,0,0,1], [0,0,1,0,0,0,0,1], [0,0,0,0,1,1,1,0]])
U, s, Vh = la.svd(X, full_matrices = False)

#plot
for i in range(len(words)):
    plt.text(U[i,0], U[i,1], words[i])
plt.show()

在情节中,将轴向左平移,您将看到所有单词。

【讨论】:

    【解决方案2】:

    SVD的定义方式,你从la.svd方法得到的s矩阵是一个对角矩阵,包含降序的奇异值。挑选u的前2列,确保您选择原始矩阵最重要的组件。

    这个过程也称为降维。请阅读here(第 11.3.3 节)和here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-12-07
      • 1970-01-01
      • 2021-11-20
      • 1970-01-01
      • 2019-05-16
      • 2018-07-15
      • 1970-01-01
      • 2015-02-21
      相关资源
      最近更新 更多