3. 基于 SVD 的方法
这是一种构造词嵌入(即词向量)的方法,我们首先会遍历所有的文本数据集,然后统计词出现的次数,接着用一个矩阵来表示所有的次数情况,紧接着对 X 进行奇异值分解得到一个
的分解。然后用
的行(rows)作为所有词表中词的词向量。对于矩阵
,我们有几种选择,咱们一起来比较一下。
3.1 词-文档矩阵
最初的想法是,我们猜测相互关联的词组同时出现在相同的文件中的概率很高。例如,“银行”、“债券”、“股票”、“钱”等都可能出现在一起。但是,“银行”、“章鱼”、“香蕉”和“曲棍球”可能不会一直一起出现。基于这个想法,我们建立一个词组文档矩阵,具体是这么做的:遍历海量的文件,每次词组 i 出现在文件 j 中时,将
的值加 1。不过大家可想而知,这会是个很大的矩阵
,而且矩阵大小还和文档个数 M 有关系。所以咱们最好想办法处理和优化一下。
3.2 基于窗口的共现矩阵 X
我们还是用一样的逻辑,不过换一种统计方式,把矩阵记录的词频变成一个相关性矩阵。我们先规定一个固定大小的窗口,然后统计每个词出现在窗口中次数,这个计数是针对整个语料集做的。可能说得有点含糊,咱们一起来看个例子,假定我们有如下的 3 个句子,同时我们的窗口大小设定为 1(把原始的句子分拆成一个一个的词):
1. I enjoy flying.
2. I like NLP.
3. I like deep learning.
由此产生的计数矩阵如下:
然后我们对 X 做奇异值分解,观察观察奇异值(矩阵的对角元素),并根据我们期待保留的百分比来进行阶段(只保留前 k 个维度):
然后我们把子矩阵视作我们的词嵌入矩阵。也就是说,对于词表中的每一个词,我们都用一个 k 维的向量来表达了。
对 X 采用奇异值分解
通过选择前 K 个奇异向量来进行降维:
这两种方法都能产生词向量,它们能够充分地编码语义和句法的信息,但同时也带来了其他的问题:
- 矩阵的维度会经常变化(新的词语经常会增加,语料库的大小也会随时变化)。
- 矩阵是非常稀疏的,因为大多数词并不同时出现。
- 矩阵的维度通常非常高(
)
- 训练需要
的复杂度(比如 SVD)
- 需要专门对矩阵 X 进行特殊处理,以应对词组频率的极度不平衡的状况
当然,有一些办法可以缓解一下上述提到的问题:
- 忽视诸如“he”、“the” 、“has”等功能词。
- 应用“倾斜窗口”(ramp window),即:根据文件中词组之间的距离给它们的共现次数增加相应的权重。
- 使用皮尔森的相关性(Pearson correlation),将 0 记为负数,而不是它原来的数值。
不过缓解终归只是缓解,咱们需要更合理地解决这些问题,这也就是我们马上要提到的基于迭代的方法。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论