使用奇异值分解(SVD)绘制词向量以衡量相似度

5

这是我使用的代码,用于计算单词共现矩阵以获取相邻计数。我在网上找到了以下代码,它使用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坐标来投影单词,以查看相似性。这种方法背后的直觉是什么?为什么他们要将每行(每行代表每个单词)的第1和第2个元素作为x和y来表示一个单词?请帮忙。

代码的源头在哪里?你能发一下链接吗? - alvas
@alvas - 我的朋友在项目工作中编写了这段代码。但它能够正常运行。我无法理解他们为什么选择U[row,1]和U[row,2]作为x和y坐标。 - Seja Nair
1
我有些难以理解,这个视频帮助了我很多:https://www.youtube.com/watch?v=EokL7E6o1AE&t=22s - Amir Pournasserian
2个回答

3
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 的前两列可以确保选择原始矩阵中最重要的组成部分。这个过程也被称为降维。请阅读 这里(11.3.3 节)和 这里

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接