NLP入门- 分布语义学(Distributional Semantics)
从语料库中直接学习单词含义,这个领域也被称为 分布语义学(Distributional Semantics)
- 分布假设:可以通过其周围的上下文单词来了解一个目标单词
- 共现文档通常指示了主题(文档(document) 作为上下文)
- 局部上下文反映了一个单词的语义类别(单词窗口(word window) 作为上下文)
- 给定 100 个非常好的例句,我们可以基于这些单词是否出现在这些例句中,将其转换为 100 维的向量。每一行都可以视为一个 词向量(word vector)。
- 它描述了单词的分布特性(目标单词附近的上下文单词信息)。
- 捕获各种语义关系,例如:同义(synonymy)、类比(analogy)等
- 另一种词向量:词嵌入(word embeddings)
1. 基于计数的方法
- 向量空间模型(Vector Space Model,VSM):将单词含义表示为一个向量。 文档(documents)视为上下文。
- TF-IDF 基于文档的词频向量优化
- PMI 基于上下词的词频向量优化
1.1 向量空间模型
一个文档由其所包含的单词表示,一个单词由其出现过的文档表示

单元格中的数字表示该单词在对应文档中出现的频率。如果我们观察每一行,我们可以将其视为每个文档的词袋模型表示;如果我们观察每一列,我们可以将其视为每个单词的词向量表示。
比单纯的词频更好的加权方法:
TF-IDF (Term Frequency-Inverse Document Frequency):通过TF(term-frequency)矩阵,计算该单词对应的 IDF(inverse document frequency)值。
。 |D|是文档总数,df_w是该单词在共多少文档中出现的次数。
分别计算每个单词的 IDF 值,并将其和对应单元格的 TF 值相乘,我们可以得到下面的 TF-IDF 矩阵:
TF-IDF 的核心思想在于:对于在大部分文档中都频繁出现的单词(例如:“the”),我们给予更低的权重,因为它们包含的信息量很少。
- tf-idf权重计算方法经常会和余弦相似性(cosine similarity)一同使用于向量空间模型中,用以判断两份文件之间的相似性
- tf-idf算法是建立在这样一个假设之上的:对区别文档最有意义的词语应该是那些在文档中出现频率高,而在整个文档集合的其他文档中出现频率少的词语,所以如果特征空间坐标系取tf词频作为测度,就可以体现同类文本的特点。另外考虑到单词区别不同类别的能力,tf-idf法认为一个单词出现的文本频数越小,它区别不同类别文本的能力就越大。因此引入了逆文本频度idf的概念
- 在本质上idf是一种试图抑制噪声的加权,并且单纯地认为文本频率小的单词就越重要,文本频率大的单词就越无用,显然这并不是完全正确的。idf的简单结构并不能有效地反映单词的重要程度和特征词的分布情况,使其无法很好地完成对权值调整的功能,所以tf-idf法的精度并不是很高
我们也可以单词作为上下文:
原始频率存在一个明显的问题:整个矩阵被常见单词所主导。但是这里,我们无法采用 TF-IDF,因为这里我们没有涉及到文档。相应地,这里我们可以采用点互信息(PMI)的方法来处理这个问题。
点互信息(Pointwise Mutual Information,PMI):衡量两个事物之间的相关性

PPMI(正点互信息)


- 会偏向于给予低频单词较大的 PMI 值
- colocationness 还行
1.2 TF-idf和pmi总结

我们已经学习了将文档作为上下文的 TF-IDF 矩阵,以及将单词作为上下文的 PMI/PPMI 矩阵。很重要的一点是,无论我们采用文档还是单词作为上下文信息,我们都可以利用 SVD 来创建密集向量。但是,通过不同的上下文信息所捕获到的关系是不一样的,如果我们采用 TF-IDF,我们捕获到的语义学信息会更加宽泛,通常和某种主题关联;如果我们采用 PMI/PPMI,我们捕获到的词向量更多是关于局部单词上下文的语义学信息。
2. 神经网络方法
Word2Vec:学习一个分类器,给定词向量预测上下文向量(skip-gram),或者相反(CBOW)

使用负采样来减少运算量。
2.1. Skip-gram 模型
根据给定的中心单词,生成相应的上下文单词。

对每一项用逻辑回归模型预测:
, 其中c和v都是对应单词的词嵌入。
这里实际上有两个嵌入矩阵:目标单词的嵌入矩阵和上下文单词的嵌入矩阵。

V是词汇表大小。两个矩阵的维度实际上是一样的,但是两个矩阵本身是不同的。当我们需要对目标单词计算嵌入时,我们使用矩阵 W;当我们需要对上下文单词计算嵌入时,我们使用矩阵 C。

第一步lookup table取出词嵌入,之后和上下文矩阵乘的时候需要将词汇表中所有单词对应的上下文词嵌入的点积进行累加,这个过程非常缓慢。
实践中,我们的词汇表可能包含 10,000 甚至 100,000 个单词,这样会使得词汇表的维度变得非常大。
因此,Skip-gram 模型的核心是将问题简化为二分类:相比直接进行 softmax 的相关计算,这里我们只是将真实上下文单词和非上下文单词,又称为 “负样本(negative samples)”,区分开来。
这些负样本单词是从词汇表 V 中随机抽取得到的。
因为词汇表通常非常大,所以从词汇表中随机抽样得到真实上下文单词的概率是非常低的。因此,我们可以假设随机抽样得到的单词都是负样本。
我们可以利用 logistic 函数分别计算正样本和负样本的概率:
, 
其中,t 和 c 表示目标单词和上下文单词(或者负样本)的词嵌入。对于负样本,我们计算时用 1 减去 logistic 函数,目的是 最小化 目标单词和非上下文单词之间的相似度。
因此,我们可以通过简单地将正负样本的 log 概率相加来得到 Skip-gram 模型的总的损失函数:

但是,在实践中,相比仅仅采用一个负样本,我们通常会采用 k 个负样本:


2.2 评估词嵌入
- 使用向量空间中的余弦相似度测试单词对的兼容性
- 单词类比任务(Word analogy task):
