1 自然语言处理简介
我们从讨论“什么是NLP”开始本章的内容
1.1 NLP有什么特别之处
自然(人工)语言为什么如此特别?自然语言是一个专门用来表达语义的系统,并且它不是由任何形式的物质表现产生。正因为如此,人工语言与视觉或者其他任何机器学习任务非常不同。
大多数单词只是一个超语言实体的符号:单词是映射到一个表征(想法或事物)的记号。例如,“火箭”一词是指火箭的概念,并且进一步可以指定火箭的实例。有一些单词例外,当我们使用单词和字母代表信号时,想“Whooompaa”一样。除此之外,语言符号可以用多种方式进行编码:语音、手势、文章等。他们可以通过连续的信号传递给大脑,而大脑本身似乎以连续的方式对事物进行编码。(关于语言和语言学的哲学的很多工作已经做到了概念化人类语言,并且可以从语言引用和语义识别单词)。
1.2 应用实例
NLP中有不同级别的任务,从语音处理到语义解释和演讲处理。总而言之,NLP的目标就是为了能够设计算法,是计算机能够理解自然语言。下面是不同难度级别的应用实例:
简单
- 拼写检查
- 关键字搜索
- 查找同义词
中等
- 从网站、文档中分析系信息
困难
- 机器翻译(例如将中文翻译成英文)
- 语义分析 (查询语句的含义是什么)
- 代词(在一个文档中,“它”或者“他”具体指代什么)
- 问答系统(例如回答Jeopardy Questions)
1.3 怎么表示单词
贯穿于整个自然语言处理任务中的第一个也是最重要的共同点就是:如何表示单词并作为我们所具有的任意模型的输入。前期大量的NLP工作将单词作为原子符号,但是我们今后将不会重复这个工作,我们首选需要考虑和具备词之间的相似性和差异概念。和词向量一样,我们可以很容易地将这些特征加入到向量之间(采用一些距离措施,如Jaccard,余弦,欧几里得算法等等)。
2 词向量(Word Vectors)
据估计大约有1300万的英文字符,难道它们之间一点联系也没有吗?猫科动物到猫,酒店到汽车旅馆?我不认为它们之间一点关系也没有。因此,我们想将每个单词字符转化为向量,以代表某种单词空间的一个点。这里有很多使用词向量的原因但是最直观的原因就是也许真正存一些足以包含人工语言所有语义的N-维向量空间。每个维度都会编码我们语言传递的含义。例如,语义维度可能表示时态(过去vs现在vs将来),计数(单数vs复数),性别(男性vs女性)。
所以让我们看看第一个词向量并且也可以说是最简单的,one-hot向量。将每个单词表示成IR|V|x1向量,这个词向量就是有很多0和一个1组成(1的位置就是该单词在排序英文出现的索引位置)。在上面的标记中,|V|是词汇的大小。以这种形式编码的词向量看起来如下:
我们可以将每个单词表示成相互独立的实体。就如我们前面所讨论的,单词表示不会直观地给出单词之间的相似性。例如:
所以也许我们可以尝试将这个空间的大小从R|V|减小到更小的东西,从而找到一个编码词之间关系的子空间。
3 基于奇异值分解(SVD)的方法
对于这一类寻找词嵌入(也称作词向量)的方法,首先在一个大型数据集进行循环,并且从某种形式的矩阵X中积累单词共现的次数,然后对矩阵X执行奇异值分解来获得一个USVT.我们然后将U作为我们词典中所有单词的词嵌入(或词向量)。下面讨论下X的一些形式。
3.1 词-文档矩阵(Word-Document Matrix)
作为刚开始的尝试,我们大胆地推测:相关的单词经常出现在同一个文档中。例如,“银行”、“债券”、“股票”、“钱”等等,可能出现在一起。但是“银行”、“章鱼”、“香蕉”和“曲棍球”可能不会一起同时出现在一篇文章中。我们依据这个事实来创建一个词-文档矩阵X,其形成方式如下:遍历几十亿个文档,并且对于每一个单词i只要出现在文档j中,我们就将X自增1。很明显的是,X将会是一个巨大的矩阵(IR|V|xM)同时与文档数量(M)相关。因此我们或许还有改善的地方。
3.2 基于窗口的词共现矩阵(Window based Co-occurnece Matrix)
在这使用同样的逻辑,矩阵X存储了单词的共现次数,这样将会变成一个附属矩阵。在这个方法中,我们计算每个单词在一个特定大小的窗口内出现的次数,进而计算语料库中所有的单词的技术。下面将展示一个实例,我们语料中包含三个句子,窗口大小为1:
- I enjoy flying.
- I like NLP.
- I like deep learning.
由此产生的计数矩阵将会是:
下面解释下结果:
首先要记住窗口(window)大小1。对于矩阵中(I,I)的值为什么为0呢?对于单词I,我们扫描第一个句子,因为I enjoy flying中单词I出现了,I前面为空,后面紧跟单词
enjoy,所以(I,I)的值为0;然后扫描第二个句子同样前后没有出现I,这是(I,I)为0;同样扫描第三个句子之后,(I,I)值仍为0。对于(I,like)的值为什么为2呢?扫描第一个句子后,I的前后一个单位没有出现like。对于第2个和第3个句子,I的后面出现了like,所以最后(I,like)的值为2,其他同理。
3.3 对共现矩阵使用奇异值分解
我们在X上执行SVD,观察奇异值(结果矩阵S的对角线数据项),并根据所需要的百分比方差在索引k处进行切割:
然后我们把这个子矩阵变成我们的单词嵌入矩阵。这样,能够在词汇表中给出每个单词的k维表示方法。
对X应用SVD:
通过选择第一个k维奇异来减少维度:
这两种方法能够提供给我们编码足够语义和语法信息的词向量,但是也伴随着很多其他问题:
- 矩阵的维度变化非常频繁(新词添加和语料大小变化非常频繁)
- 大多数单词没有共现,矩阵会非常稀疏
- 通常矩阵维度非常高(约为106x106)
- 训练成本比较高
- 为了形成词频的严重不平衡,需要进行对矩阵X进行“打乱”。
目前已经存在了一些方法来解决上面提到的问题: - 忽略一些功能词汇,例如“the”,“he”,“has”,etc。
- 使用一个不规则窗口-根据文档中单词之间的距离来计算共现次数
- 使用Pearson相关系数和将原始计数设置为负数。
正如我们下一节中提到的,基于迭代的方法以更加优雅的方式解决了许多问题。