SVD 在文章相似性 单词聚类的应用

  • 前言
  • SVD 在文章相似性 单词聚类的应用


前言

前面学过了 矩阵的 三种变换 :
1, 特征值和特征向量
Ax=λx
2, 矩阵 SVD 分解

Am×n=Um×m Σm×n Vn×n

有时为了降低矩阵的维度到k,其它部分都为0,SVD的分解可以近似的写为:
Am×n≈Um×k Σk×k Vk×n

3, 矩阵分解
A(mn) = U(mk) V(k*n)

SVD 在文章相似性 单词聚类的应用

新闻分类其实就是一个聚类问题,关键是计算两篇新闻的相似程度。问了完成这个任务,我们可以将新闻表示成代表它们内容的实词序列,即向量,然后求两个向量的夹角。夹角越小,表示两篇新闻越相关;当它们垂直正交时,表示两篇新闻无关。从理论上来讲,这种算法非常简单,,也易于实现。但问题是,当我们需要对大量的新闻进行分类时,我们需要两两比较,这需要很多次迭代,因此非常耗时。尤其当新闻数量非常大,同时词汇数量也很大时,这个问题可能会趋于无解。那么我们有没有一种方法,能够一次性地把所有新闻的相关性计算出来呢?答案是肯定的,这就是我们在“线性代数”中学过的SVD(奇异值分解)。

首先,我们可以用一个大矩阵A来描述这一百万篇文章和五十万词的关联性。这个矩阵中,每一行对应一篇文章,每一列对应一个词

NLP 同义词聚类_NLP 同义词聚类

在上面的图中,M=1,000,000,N=500,000。第 i 行,第 j 列的元素,是字典中第 j 个词在第 i 篇文章中出现的加权词频(比如,TF-IDF)。读者可能已经注意到了,这个矩阵非常大,有一百万乘以五十万,即五千亿个元素。

奇异值分解就是把上面这样一个大矩阵,分解成三个小矩阵相乘,如下图所示。比如把上面的例子中的矩阵分解成一个一百万乘以一百的矩阵X,一个一百乘以一百的矩阵B,和一个一百乘以五十万的矩阵Y。这三个矩阵的元素总数加起来也不过1.5亿,仅仅是原来的三千分之一。相应的存储量和计算量都会小三个数量级以上

NLP 同义词聚类_自然语言处理_02

三个矩阵有非常清楚的物理含义。

1. 第一个矩阵X是对词进行分类的结果,每一列表示一类主题,其中的每个非零元素表示一个主题与一篇文章的相关性,数值越大越相关。
2. 最后一个矩阵Y中的每一列表示100个语义类/词类,每个语义类/词类与500,000个词的相关性。
3. 中间的矩阵则表示文章主题和语义类/词类之间的相关性

NLP 同义词聚类_奇异值分解_03

接下来,举例说明一下上述三个矩阵:

NLP 同义词聚类_聚类_04

X的每一行代表一篇文章,每一列代表一个主题,里边的数值代表文章与主题的相关程度。例如对于第一篇文章,它和第一个主题比较相关,和第二个主题不太相关,第二片文章正好相反;第四篇文章和每一个主题都不太相关,因为其对应的元素(0.3,,0.03)都不大,但相对来说,和第一个主题更相关
并且还能得知 每篇文章的分类。

NLP 同义词聚类_自然语言处理_05


Y的每一行代表一个语义类,每一列代表一个词,里边的数值代表词与语义类的相关程度。例如对于第一个词,它和第一个语义类相关,与第二个语义类无关;第二个词则相反。 通过这个矩阵 可以得知两个单词之间的相似性,每个单词列向量 越相似 两个单词的语义越相近 。

这里重点关注一下矩阵B,它表示的是主题和语义类之间的相关性,我们可以用一个矩阵来说明

NLP 同义词聚类_词类_06

在这个矩阵中,第一个主题和第一个语义类相关,和第二个语义类没有太大关系。而第二个主题则相反

因此,我们只要对矩阵A进行一次分解,就可以同时完成文章分类和近义词分类,同时还能得到每个主题和每个语义类之间的相关性