第三部分 · 用数字表示词义

怎样从词语出现的次数得到词向量?

先统计词出现在哪些文档里、旁边有哪些词,再用 TF-IDF 或 PPMI 调整这些次数,让有用的联系更明显。

第 7 讲在 PDF 第 8–15 页回顾了本页内容,从分布假设一直到 PPMI,然后才转向稠密向量。本页末尾只点了名的方法,在 word2vec 和 GloVe 两页展开。

不只认出一个词,还要知道它怎样使用 Lec 6 · PDF 第 40–41 页

词向量希望用相近的数字表示意思相近的词。最简单的编码方法却做不到这一点:给词表中的每个词安排一个位置,轮到哪个词,就只把那个位置写成 1,其余位置全写 0。这叫独热编码(one-hot vector)。

能区分 movie 和 film,却看不出它们意思相近
\[ v_{\text{movie}}=[0,0,0,0,1,0],\qquad v_{\text{film}}=[0,0,0,0,0,1] \] \[ v_{\text{movie}}^\top v_{\text{film}}=0,\qquad \cos(v_{\text{movie}},v_{\text{film}})=0 \]

这两个向量没有重合的非零位置,所以点积和余弦相似度都是 0。事实上,任意两个不同词的独热向量都互相垂直,即使它们是同义词。我们需要换一个思路:统计一个词出现在哪些文档里、周围经常有哪些词。这样,用法相近的词才有机会在同样的位置上出现非零数值。

用两种表格记录词的使用情况 Lec 6 · PDF 第 42–51 页

把次数排成行和列,就得到一张共现矩阵。先记住三个集合:\(V\) 是词表,\(D\) 是文档集合,\(C\) 是我们选择观察的上下文。文档可以是一部戏剧、一篇文章,也可以只是一个段落。读表前,最重要的是弄清楚行、列分别代表什么。

表格名称一个格子记录什么行数 × 列数怎样取出一个向量
词—文档矩阵(term-document matrix)词 \(w\) 在文档 \(d\) 中出现多少次\(|V|\times|D|\)取一行,就是一个词在各篇文档中的次数,共 \(|D|\) 个数。取一列,就是一篇文档中各个词的次数,共 \(|V|\) 个数。
词—上下文矩阵(word-context matrix)上下文 \(c\) 在目标词 \(w\) 附近出现多少次\(|V|\times|C|\)取一行,就是一个词周围各种上下文的次数,共 \(|C|\) 个数。如果词表里每个词都算一种上下文,那么 \(|C|=|V|\)。

莎士比亚作品的例子中,battle 和 fool 在不同戏剧里的出现次数很不一样。反过来,两部戏剧如果用词分布相近,它们的文档向量也可能接近。第二种表格把范围缩小了:不再看整篇作品,而是看一个词附近的那一小段文字。

附近,到底是多近?

PDF 第 47 页采用“距离不超过四个词”的规则。若使用左右两侧、半径为 4 的窗口,就数目标词前面最多 4 个词、后面最多 4 个词,不数目标词自己;到了文本边界,能数到的邻词就少一些。让窗口沿着文字移动,就能不断累积词与上下文的配对次数。

屏幕上只展示三列,不代表完整向量只有三维

PDF 第 49 页的小表只展示了 4 个词和 3 种上下文。它是完整 \(|V|\times|V|\) 表格的一部分,所以图里每行只有 3 个数,完整的每行却有 \(|V|\) 个数。上下文的定义一旦改变,每个坐标代表的东西也会改变。

次数多,未必说明关系特别密切 Lec 6 · PDF 第 52–53 页

Sugar 常出现在 apricot 附近,确实能提供词义线索。但 the、it、they 本来就到处出现,在许多互不相关的词旁边也能数到很多次。只比较原始次数,容易把“本来就常见”误当成“特别有关”。

因此,我们要给次数重新分配权重。下面两种方法分别回答一个问题:

  • TF-IDF:一个词虽然在这篇文档里常见,但在别的文档里是否也到处都是?这适合给词—文档矩阵加权。
  • PMI 和 PPMI:两个词一起出现的次数,是否超过了它们各自常见程度所能解释的水平?这适合给词—上下文矩阵加权。

TF-IDF:在这篇里常见,还要有区分度 Lec 6 · PDF 第 54–56 页

TF-IDF 把两件事相乘:这个词在当前文档里出现了多少次,以及它在整个文档集合里有多特别。令 \(\operatorname{count}(t,d)\) 表示词 \(t\) 在文档 \(d\) 中的次数。词频(term frequency,TF)先对次数取对数,让反复出现的影响增长得慢一些:

词频:先看当前文档中的次数(PDF 第 54 页)
\[ \operatorname{tf}_{t,d}=\begin{cases}1+\log\operatorname{count}(t,d),&\operatorname{count}(t,d)>0\\0,&\text{otherwise.}\end{cases} \]
再数有多少篇文档出现过这个词(PDF 第 55 页)
\[ \operatorname{df}_t=\big|\{d\in D:\operatorname{count}(t,d)>0\}\big|,\qquad N=|D| \] \[ \operatorname{idf}_t=\log_{10}\frac{N}{\operatorname{df}_t} \]
最后把两部分相乘
\[ \operatorname{tfidf}_{t,d}=\operatorname{tf}_{t,d}\operatorname{idf}_t \]

这里的文档频率(document frequency,DF)数的是文档篇数,不是词的总次数。逆文档频率(inverse document frequency,IDF)据此衡量区分度:出现过这个词的文档越多,它就越不特别。

PDF 第 55 页给出的 Romeo 和 action 都一共出现了 113 次,但前者集中在 1 篇文档里,后者分布在 31 篇里。在 \(N=37\) 篇文档中,Romeo 的 \(\operatorname{idf}\approx1.57\);如果一个词在全部 37 篇中都出现,它的 IDF 就是 0。

算一算 battle 的权重

这个例子中,TF 和 IDF 都用以 10 为底的对数。battle 出现在 37 部戏剧中的 21 部,即 \(\operatorname{df}=21\),所以 \(\operatorname{idf}=\log_{10}(37/21)\approx0.246\)。若它在某篇中出现 7 次,权重就是 \((1+\log_{10}7)\times0.246\approx0.454\);若一次也没出现,权重就是 0。

核对课件时,注意两种不同的 TF 写法

PDF 第 54 页对正次数写的是 \(1+\log c\),但第 56 页的数值表对应另一种写法 \(\log_{10}(1+c)\)。例如,表中 battle 出现 1 次时的权重是 0.074,约等于 \(\log_{10}2\times0.246\);如果照第 54 页公式计算,应为 0.246。上面的手算例子采用第 54 页公式,并明确使用以 10 为底的对数。

这种权重可以帮助检索文档、比较文档是否相似、进行文本分类,以及提取关键词。它改变的是表格里的数值,不是行列数量,所以加权之后,向量并没有变短。

PMI:一起出现,是否比预期更频繁? Lec 6 · PDF 第 57 页

如果词 \(w\) 和上下文 \(c\) 互不影响,它们一起出现的概率应当是各自概率相乘,也就是 \(P(w)P(c)\)。点互信息(pointwise mutual information,PMI)把实际一起出现的概率与这个基准相比,再取对数:

\[ \operatorname{PMI}(w,c)=\log\frac{P(w,c)}{P(w)P(c)} \] \[ \operatorname{PPMI}(w,c)=\max\big(0,\operatorname{PMI}(w,c)\big) \]

第二行是正点互信息(positive PMI,PPMI):只保留正的 PMI,把负值都改成 0。

PMI 的结果说明什么改成 PPMI 后
正数一起出现的次数,比假设两者独立时预期的更多。保留原来的正值。
零与独立时的预期一致。仍然是 0。
负数一起出现的次数,比预期的更少。改为 0。

为什么舍弃负值?对于很少见的词,很难确定“比预期更少”究竟是不是可靠规律。课件的例子是:两个词各自出现的概率都只有 \(10^{-6}\),独立时一起出现的概率就只有 \(10^{-12}\)。数据不足时,很难对这么小的概率作出准确判断。PPMI 选择只保留正关联,但要记住:一个结果被改成 0,并不证明这两个词真的独立。

怎样从计数表一步步算出 PPMI? Lec 6 · PDF 第 58–59 页

先把表中每格的次数记为 \(f_{ij}\):它表示目标词和上下文组成的配对 \((w_i,c_j)\) 出现了几次。接着算三个总数:整张表的总和 \(T\)、第 \(i\) 行的总和 \(r_i\)、第 \(j\) 列的总和 \(s_j\)。所有概率都要用同一张表、同一种计数规则。

先求总和,再换算成概率
\[ T=\sum_i\sum_j f_{ij},\qquad r_i=\sum_j f_{ij},\qquad s_j=\sum_i f_{ij} \] \[ P(w_i,c_j)=\frac{f_{ij}}{T},\qquad P(w_i)=\frac{r_i}{T},\qquad P(c_j)=\frac{s_j}{T} \]
代回 PMI 中,分式可以化简为次数之间的比值
\[ \frac{P(w_i,c_j)}{P(w_i)P(c_j)}=\frac{f_{ij}/T}{(r_i/T)(s_j/T)}=\frac{f_{ij}T}{r_i s_j} \] \[ \operatorname{PPMI}_{ij}=\max\left(0,\log\frac{f_{ij}T}{r_i s_j}\right) \]

一个格子的次数除以 \(T\),就是两个词一起出现的联合概率;一行或一列的总和除以 \(T\),则是只看其中一边的边缘概率。

注意,\(T\) 数的是目标词与上下文的配对次数,不一定等于整份文字的词数。一个目标词出现一次,周围可能有好几个词,因此会贡献多个配对。若 \(f_{ij}=0\),但两边的边缘概率都大于零,那么不做平滑时 PMI 为 \(-\infty\),PPMI 定义为 0。若整行或整列的总和为零,相应概率就无法用于这个计算,应把它排除。

用课件中的这张表来计算

目标词 / 上下文computerdataresultpiesugar行总和
cherry28944225486
strawberry001601980
digital1670168385543447
information332539823785137703
列总和499756734735126111716
次数很大,PMI 却不一定大

下面使用以 2 为底的对数,结果的单位是比特。先看 information 和 data:\(P(w,c)=3982/11716\approx0.3399\),\(P(w)=7703/11716\approx0.6575\),\(P(c)=5673/11716\approx0.4842\)。代入后得到:

\[ \operatorname{PPMI}(\text{information},\text{data})=\log_2\frac{3982\times11716}{7703\times5673}\approx0.094 \]

虽然一起出现了很多次,但它们各自本来就很常见,所以超出预期的程度不大。再看另外两组:

\[ \operatorname{PPMI}(\text{cherry},\text{pie})=\log_2\frac{442\times11716}{486\times512}\approx4.379 \] \[ \operatorname{PMI}(\text{cherry},\text{computer})=\log_2\frac{2\times11716}{486\times4997}\approx-6.695 \]

Cherry/pie 有很强的正关联;cherry/computer 的 PMI 为负,因此 PPMI 改为 0。换一种对数底数,只会缩放数值,不会改变正负号;比较时应统一底数。

课件中的一处笔误:PDF 第 59 页第一个概率计算式的分母多写了一个 1。表格总和与它旁边的小数结果都要求分母为 \(11716\),这里统一使用这个数。

为什么还希望把向量变短? Lec 6 · PDF 第 60–62 页

计数和 PPMI 都能提供有用的信息,但词表一大,每个向量就可能很长,而且大部分位置是 0。这样的向量叫稀疏向量(sparse vector)。另一条路线是用少得多的数字表示一个词,并让多数位置都包含信息,这叫稠密向量(dense vector)。

稀疏的计数或 PPMI 向量稠密词向量
通常词表中的每种上下文占一个坐标;课件举出的长度为 20,000–50,000。用更少的坐标表示一个词;课件举出的典型长度为 50–1000。
大部分坐标是零,每个坐标都有明确的上下文含义。大部分坐标非零,相似的上下文有机会共享信息。
car 和 automobile 分别占据两个不同坐标。即使周围出现的词不完全相同,也有机会反映它们的相似性。

更短的向量意味着后续模型要调整的特征权重更少,也可能更容易把经验用到新例子上。它还有机会更好地处理同义词:一个词常出现在 car 附近,另一个常出现在 automobile 附近,我们希望能看出两者用法相似,而不是因为坐标不同就错过这条线索。

后面可以沿哪些方向继续学?

  • Word2vec 和 GloVe:本讲把它们列为获得稠密词向量的方法,并提到了 Word2vec 的 skip-gram 与 CBOW 两个名称。
  • 奇异值分解(SVD):这是从矩阵出发的另一条路线,课件同时列出了潜在语义分析(LSA)。
  • 根据当前句子重新表示一个词:静态词向量给每种词固定一组数字;上下文词向量则针对每一次出现计算表示,因此同一个词在不同句子里可以有不同向量。

Word2vec 和 GloVe 虽然出现在大纲里,但第 6 讲 PDF 到这份概览就结束了,没有给出它们的训练目标或优化算法。第 7 讲补上了这一段:word2vec 一页从分类器一直讲到梯度更新,GloVe 一页解释矩阵分解的视角。

把词表示好之后,怎样用来分类?

词向量与余弦相似度解释怎样让数字反映词义;多分类逻辑回归解释怎样把输入特征变成各类得分,再变成总和为 1 的概率。它们分别处理“怎样表示输入”和“怎样作出分类”这两个步骤。

这一页最重要的几点
  • 独热编码只说明是哪个词;统计使用场景,才有机会比较词义。
  • 读表先看行和列。词—文档矩阵中的词向量有 \(|D|\) 个数,完整的词—词矩阵中则有 \(|V|\) 个数。
  • TF-IDF 同时考虑一个词在本篇里多常见、在其他文档里多普遍。PMI 比较共现是否超过预期,PPMI 则把负值改成 0。
  • 联合概率和边缘概率必须来自同一张表;表中总数是词与上下文的配对次数。
  • 加权只改数值,不改维度。更短的稠密向量,以及随语境变化的词向量,是接下来的学习方向。