主要内容
课程内容
一些关于语言学的内容(a tiny bit about linguistics)
音素(phoneme)
音系学中假定了声音的组成单元:音素,如下图,列出了几种不同的音素发音,例如第一行的p就是一种爆破音(plosive)。
词态(morphology)
一般来说,构成一个单词的词素(morpheme)可以视作一个单词中包含语义的最小单元。
举个例子,单词
u
n
f
o
r
t
u
n
a
t
e
l
y
unfortunately
unfortunately,将其拆分为不同词素则有
[
[
u
n
[
f
o
r
t
u
n
(
e
)
]
a
t
e
]
]
l
y
]
[[un[fortun(e)]ate]]ly]
[[un[fortun(e)]ate]]ly],这样拆分后,可以看到一个完整单词被拆成了有意义的几部分,
u
n
un
un代表一个否定的前缀,
f
o
r
t
u
n
e
fortune
fortune是单词的词根,
a
t
e
ate
ate是一个后缀,作形容词时有“具备。。。的”含义,至于
l
y
ly
ly则是一个词性后缀。
但是,在深度学习领域,很少有词素级的模型,Manning只列出了他本人在13年的一篇文章。
从量级上看,训练模型时,对于词素有另外一种替代方式——就是字符级别的n-gram模型。
对于这样的模型,还可以考虑使用卷积层来提取特征。
单词的书写(words in writing system)
单词的书写可以明显体现出不同语言之间的差异,这也给诸如分词之类的任务带来了麻烦。
比如中文与英文,英文天然就带有空格这一分隔符,而中文在书写时只有标点符号会将句子分开,而一个完整句子中,词与词之间是连在一起书写的。这就需要另想办法进行分词。
此外,还有一些语言也颇有特点,比方说德语,德语的造词能力相当了得。
课件中这个例子就很好:
英文中是一个由四个单词构成的名词短语,而德语中就是一个单词而已。
模型(model)
单词级模型(woed-level model)
单词级模型算是使用最多的模型了,但是其在应用中,由于人类语言的神奇,还是会存在这样那样的问题。课堂上也列举了一些常见的问题:
1、词态上的变化
在不同语言之间,同样的词语可能会有完全不同的形式
2、非常规的形式
在单词的书写中,会有各种各样的缩写,改写。尤其在社交媒体上,单词的各式变化能反应作者的情绪,但对于计算机而言,就不是那么好理解了。
针对这些问题,有人提出利用字符级模型来进行处理的思路。课堂上列出两条主要思路:
1、利用字符级的embedding来构成单词的embedding
这个方法有一个显而易见的好处,未登录词将不复存在,因为每一个词都可以由26个字母构成(对于英文而言)。拼写相近的单词应当获得相近的embedding。问题也同样存在,对于单个字符而言,能够捕捉的信息十分有限。不过在深度学习领域这个方法还是取得了一定的成功。
2、无分割的语言可以通过字符来处理
我觉得对于中文而言尤其如此,中文的单个字符本身就包含十分丰富的含义。
NLP在深度学习领域中利用的数据通常都是书写产生的语句,这是最普遍也是最容易获取的数据,但是这些语句各自的形式也是大相径庭,既有中文这样的型意字。也有英语这样由固定词素经由构词法产生的语言。甚至还有日语这种既有型意字与词素构词相结合的语言。
纯字符级模型(pure character level model)
纯字符的模型,如字面意义,就是模型数据的流动在字符级上进行。
在lecture11中提到的VDCNN就是一个成功的字符级别的模型。在这里Manning只是列举了一系列的文章,之后再找来看。
子词模型(subword model)
所谓子词,实际上与之前提到的字符级n-gram是类似的,不是纯字符,而是一个单词中不同字符构成的片段,不过对于中文而言,这个概念也可以认为对应字符了。
这一领域,课上指出两个方向:
1、与词级模型相同的架构,但是将词替换为子词
2、混合型模型,主要部分仍然词级,在处理特殊情况(OOV)时使用字符级的架构
两个方向均是给了两篇文章。
接下来,介绍了一种能够产生wordpiece的算法——Byte Pair Encoding,当前大火的bert模型在词嵌入层也使用了BPE算法的变种wordpiece embedding。
BPE(Byte Pair Encoding)
BPE可以看作一种按照频度对字符进行聚类的算法。是一种自底向上的聚类。
步骤:
1、将语料中所有单词视作字符的集合,并统计每一个单词的频度。
此时,我们产生的词典只有单个的字符。下图构成的词典包含l, o, w, e, r, n, w, s, t, i, d,11个字符。
2、遍历语料,迭代统计频度最高的bigram。
如图,es这一组合出现了9次,因此作为频度最高的bigram加入词典中。之后,将e,s两个字符构成新的subword。
接下来,如出一辙,继续搜索频度最高的bigram,下一个是est,在下一个是lo,然后是low。以此类推。每一次加入词典后均进行合并操作。
3、在词典达到既定的规模后算法终止。
在具体实施的过程中,每一个单词还需要加上一个特殊的token代表单词结尾。这样就可以避免词尾的subword出现在词头。比方说star,longest两个单词中均有st,但是后一个代表了形容词的最高级,与前一个st有截然不同的语言,显然不能算作同种subword。
编码/解码阶段
得到subword词典之后,就要利用其对一个语句中的单词进行编码,也就是拆解wholeword变为subword的集合。
首先,对词典中的subword按照长度进行排序。随后,对每一个单词,顺序遍历词典,若有符合单词某一子字符串的subword,则认定该subword为构成单词的一部分。
对每一个单词都进行如上操作,若对某一单词,在遍历完词典后还有部分子字符串未能被subword替代,则用一个特殊的"UNK"token代替。
例如highest这样的单词,编码后就变成[high,est]这样的subword集合。
实际应用中,若是对每一个词都这样编码,未免太耗时,常用做法是将BPE运行中使用语料的单词分割方式保存为一个lookup-table,这样,只有未见过的词才需要遍历整个subword词典,其他的直接查表即可。
解码就是将subword拼接起来即可。
此段参考:几种分词算法
此外,还有wordpiece/sentencepiece两种分词法。不过课上没有展开。
字符级/词级混合模型(hybrid character and word level model)
这个部分列举了几个模型。
1、Learning Character-level Representations for Part-ofSpeech Tagging
模型利用卷积层从字符的分布式表示中形成word embedding,并将之应用在词性标注任务。
2、Character-based LSTM to build word representations
原文名称:
Finding Function in Form:
Compositional Character Models for Open Vocabulary Word Representation
该模型利用双向lstm从字符构建word embedding。文章利用这样产生的词向量进行词性标注任务以及语言模型。
3、Hybrid NMT
由Manning及其学生共同提出的结构。混合字符级以及词级模型。仅在需要使用字符级模型时才使用。
大体上,字符级别的模型应用在UNK这一特殊token上。具体细节之后还是得去原文找找看。
FastText
fasttext采用了与CBOW大致的思想进行文本分类任务,只不过,在CBOW中输入的是对应上下文单词的词向量。而fasttext中则是直接将单词的ngram片段直接叠加作为隐藏层的结果。这部分之后单开一篇。