Speech and Language Processing-笔记(一)

Hits: 203

最近这大半个月的时间一直在看一本书《Speech and Language Processing (3rd ed. draft)》(完整版),不得不说这真是一本极好的书,很多概念解释的非常清楚,而且还难能可贵地引入了一些非常前沿的内容(介绍了2017年NLP领域一些比较好的学术成果),看完之后肯定能对NLP在整体上有个很好的感知。因为我没读过其他的NLP书籍,所以不好断言这是最好的入门读物,但我个人强烈推荐此书。然后再说说看完这本书的感受吧。全英文的书看起来有点小累和压抑,主要原因是里面有几个章节涉及到一些语言学(英文语法)的知识让人很头大,的确需要较大的耐心,比较沉闷和乏味吧。虽然看完之后对整个NLP领域有一个清晰的认识,但是也正因如此才感到很失落和失望。那些听起来高大上的NLP技术真的没有想得那么牛逼,比如命名实体识别(Named Entity Recoginition),人机对话(Siri,cotana,Amazon Alex),问答系统(IBM Watson),在明白了其背后的原理后才发现:这些看起来很智能的应用实际上跟智能毫无关系。底层的算法还是太过愚蠢了,本质上还是基于统计的猜测,它并没有真正理解人类所说的话。但是话又说回来,现在火热的人工智能技术哪一个不是基于统计的呢?基于统计的算法虽然能解决很多实际问题,而且可以做出一个看似很智能的应用,但我始终觉得这不是智能,我反倒觉得基于符号,推理的传统AI方法应该是正确的发展方向。好了,废话不多说了,下面就把这本书的读书笔记整理一下吧。

Charpter2:Regular Expressions, Text Normalization & Edit Distance

Text Normalization中的几个概念

Text Normalization指的是把文本转化为一个更方便、更标准的格式,它包含有一系列的操作,比如:

Tokenization/Word Segmentation

  • 概念
    中文居然翻译成令牌化,太搞笑了,不如不翻译。Tokenization就是把输入的字符串分解成为词汇单位,divide text into a sequence of words。经过我多方查证,在NLP中,Tokenization和Word Segmentation就是一个意思:分词。

  • 实现工具
    最简单,最粗糙的的分词工具是Unix命令行:tr,比如:tr -sc ’A-Za-z’ ’\n’ < sh.txt | sort | uniq -c 这玩意儿就是简单的按照空格分割,都不如AWK灵活。所以这是远远不够的,比如有些单词m.p.h, Ph.D.. AT&T, cap’n等是不能这么简单粗暴的分的,所以一个稍微高级点的工具是由Linguistic Data Consortium (LDC)发布的Penn Treebank tokenization。以上是英文的分词,但是中文的分词是不一样的,因为中文的word是多个character组成的。一个基本的算法是maximum matching:MaxMatch。基本原理是一直往后找词库中能匹配到的最长的单词,这个算法虽然简单,但效果却是很好的。它也因此一直被认为是中文分词算法的基准(baseline)。

  • 什么是语素(morpheme)?
    Morphology(词法学) is the study of the way words are built up from smaller meaning-bearing units called morphemes. Morpheme是最小的语法单位,是最小的语音语义结合体。举个例子:英文unbreakable这个字有三个语素:un-(不自由语素)、break(自由语素)、-able(不自由语素)。

Lemmatization

  • 概念
    Lemmatization,中文翻译成词形还原,也就是找到这个单词的词根(root)。Lemmatization is the task of determining that two words have the same root, despite their surface differences. 这可能会让你想到词干提取(Stemming),但两者还不太一样,Stemming只是一个简单版本的Lemmatization,通常它只是去掉一个单词的后缀而已,而Lemmatization会做的更多,比如会把一个词的过去时还原。

  • 实现工具
    morphological parser,最naive的方法是stemming,它最广泛使用的算法是:The Porter Stemmer。这个就是写死一些规则,比如去掉单词最末尾的s/e/ion等,然后去匹配,所以Porter算法的效果很差。

编辑距离(Edit Distance)

这个概念在信息检索里学过,所谓的编辑距离,指的是一个字符串指经过insertion, deletion, substitution操作之后变成另一个字符串的操作数量。我们一般通过最小编辑距离(minimum edit distance)来度量两个字符串之间的相似度,这一方法可以用于拼写检查(spell checking)。最小编辑距离的实现算法是动态规划。

Charpter4 Language Modeling with N- grams

跳过,之前文章里有写,可以参考:自然语言处理入门

Charpter5:Spelling Correction and the Noisy Channel

Spelling Correction

拼写矫正分为两个问题:

  • Non-word spelling correction
    这个指的是拼写错误的单词在字典中找不到,也就是压根就写错了,那么很简单,就在字典里找跟他编辑距离相近的候选词,然后根据语言模型去确定最终用哪个。

  • Real word spelling correction
    现实场景中的单词拼写错误则可能是另一种情况,写错的单词也是正确的,比如把three拼错成there。方法跟Non-word spelling correction差不多,下面我们来介绍一下。

The Noisy Channel Model

Imgur
这个想法很简单:原始单词经过一个所谓的“noisy channel”编码(encode)之后得到n个候选词,然后再去猜测候选词。这里所谓的噪音,指的是对原单词的字母进行一系列操作(替换,删除之类)使得操作之后的词汇无比接近于正确的单词。这个想法背后的思想是贝叶斯推断Bayesian inference:

$$
\hat{w} = \underset{w \in V}{\text{argmax}}P(w|x)
$$
其中,\(x\)是观测数据,也就是拼写错误的单词;然后我们对这个公式应用贝叶斯定理:

$$
P(a|b) = \frac{P(b|a) P(a)}{P(b)}
$$
然后,我们得到:
$$
\hat{w} = \underset{w \in V}{\text{argmax}}\frac{P(x|w) P(w)}{P(x)}
$$
因为\(P(x)\)是固定的,所以我们只需要求解:
$$
\hat{w} = \underset{w \in V}{\text{argmax}}\overbrace{P(x|w)}^\text{channel model} \overbrace{P(w)}^\text{prior}
$$
那么只要把两部分概率分别算出来,然后选择最大的那个\(w\)即可。

  • 求解\(P(w)\)
    \(P(w)\)是先验概率,通过语言模型来确定,我们可以使用n-gram或者uni-gram。

  • 求解\(P(x|w)\)
    那么\(P(x|w)\)如何求解呢? \(P(x|w)\)的意思是:给定了单词\(w\)的情况下,拼写成\(x\)的概率是多少?所以这个概率试图描述的是 \(w\)与\(x\)之间的转换关系。我们知道在英语中m和n是经常会被写错的,不仅仅是他们发音相近,还因为他们在键盘上的位置很接近。所以我们就通过两个字母互相写错的概率来选择,具体的,我们通过一个叫做confusion matrix的东西来做统计,这个矩阵由几个子操作矩阵组成,比如删除,插入,替换,交换。我们对一个拼写错误的语料库进行统计,从而得到由这些操作导致的错误的单词的个数,以此来填充矩阵元素,比如:

    del[x, y]: count(xy typed as x)
    ins[x, y]: count(x typed as xy)
    sub[x, y]: count(x typed as y)
    trans[x, y]: count(xy typed as yx)

    算法如下:
    Imgur

Charpter 6: Naive Bayes and Sentiment Classification

如何使用朴素贝叶斯方法进行情感分类?首先看下什么是朴素贝叶斯分类器(Naive Bayes Classifier)?

bag-of-words

Imgur
英文真的太牛逼了,原来bag-of-words真的就是把一个语料库里的word全部打散放到一个bag里,所以才称之为bag-of-words,太形象了。也因此bag-of-words是跟单词顺序无关的。

Naive Bayes Classifier

原理跟上一节讲述的Spelling Correction所采用的方法是一毛一样的。最终我们会得到如下的求解公式:

$$
\hat{c} = \underset{c \in C}{\text{argmax}}\overbrace{P(d|c)}^\text{likelihood} \overbrace{P(c)}^\text{prior}
$$
其中,\(c\)表示category,所属类别;\(C\)表示所有的类别集合;\(d\)表示文档,document;\(\hat{c}\)表示预测的类别;那么如何计算这个值呢,我们首先来看下先验概率(prior)\(P(c)\),这个值还是很好计算的,直接统计所有的样本中,该类别出现的概率就行。那么这个似然(likelihood)概率\(P(d|c)\)是如何计算的呢?这个概率代表的意思是给定了一个类别,出现这个文档的概率是多少?这个文档\(d\)我们可以把它转化成一个个特征\(f_1,f_2,...,f_n\)(用这些特征来代表这个文档),而这所谓的特征其实就是关键字(或者出现的频次),那么这个概率就转换成:

$$
\hat{c} = \underset{c \in C}{\text{argmax}}\overbrace{P(f_1,f_2,...,f_n|c)}^\text{likelihood} \overbrace{P(c)}^\text{prior}
$$

那么转换为特征之后似然概率又该如何计算呢?这里我们用到了一个假设:在给定类别\(c\)的情况下,\(P(f_i|c)\)之间是独立的,这就是朴素贝叶斯假设(naive Bayes assumption),这也是为什么它被称为naive的原因。于是我们有:

$$
P(f_1,f_2,...,f_n|c) = P(f_1|c) \cdot P(f_2|c) \cdot ... \cdot P(f_n|c)
$$

那么接下来就很好计算了,给定了一个类别,只要统计不同特征\(f_i\)出现的次数就行了。所以本质上朴素贝叶斯方法仍然是一种count-based方法。

Charpter 7: Logistic Regression

跳过,可以参考Machine Learning-逻辑回归(Logistic Regression)

Charpter 8: Neural Networks and Neural Language Models

跳过,可以参考Machine Learning-神经网络(Neural Network)Word2vec初探

Charpter 9: Hidden Markov Model

跳过,可以参考:隐马尔可夫模型(Hidden Markov Model)。

Sequence Model

什么是序列模型呢?
A sequence model or sequence classifier is a model whose job is to assign a label or class to each unit in a sequence, thus mapping a sequence of observations to a sequence of labels.

有哪些任务是sequence model呢?
比如:语音识别(speech recognition),词性标注(part-of-speech tagging),机器翻译(machine translation),语言模型(language model)等。这些任务都有一个特点:存在一个一一对应的关系。

Charpter 10: PART-OF-SPEECH TAGGING

Part-of-speech

also known as POS, word classes, or syntactic categories,指的就是一些word的属性(词类),比如这个单词是属于动词,名词,形容词等。英文中一般常见的part-of-speech是8种:noun, verb, pronoun, preposition, adverb, conjunction, participle, and article。

Part-of-speech tagging

Part-of-speech tagging is the process of assigning a part-of-speech label to each of a sequence of words. 而这个label指的就是词性(part-of-speech),POS tagging也就是我们所说的词性标注。目前有两种方法解决这个问题:

  • Hidden Markov Model (HMM)
  • The Maximum Entropy Markov Model (MEMM).

这两个算法比较有意思,HMM就是我们在第九章提到的decoding问题,它其实是一种生成序列模型(generative sequence model),而MEMM则是一种判别序列模型(discriminative sequence model)。

Discriminative model VS Generative model

In classification, we want to obtain a mapping \(y = f (x)\) from the features \(x\) to the class label \(y\).

  • Discriminative model
    In logistic regression, we learn a conditional distribution \(p(y|x)\), which directly tells us what \(y\) is like for an given input \(x\).This kind of algorithms is called discriminative algorithms.

  • Generative model
    Generative algorithms achieve the same objective indirectly. They

    • Learn \(p(y)\) and \(p(x|y)\) from data.
    • Use Bayes rule get the posterior distribution \(p(y|x)\).

我们用\(W\)表示给定的单词序列,\(T\)表示对应的词性序列,那么POS tagging问题可以表示为:
$$
\hat{T} = \underset{T}{\text{argmax}} P(T|W)
$$

对于HMM而言,它的求解思路是基于贝叶斯定理的,所以称为生成模型:

$$
\hat{T} = \underset{T}{\text{argmax}} P(T|W) \\
= P(W|T) \cdot P(T)
$$

对于MEMM而言,它的求解思路是这样的:

$$
\hat{T} = \underset{T}{\text{argmax}} P(T|W) \\
= \underset{T}{\text{argmax}} P(t_i|w_i,t_{i-1})
$$
它不是通过贝叶斯定理推导求解,而是直接定义了一个判别函数(条件概率):当前单词\(w_i\)的词性\(t_i\)取决于前一个单词的词性\(t_{i-1}\)和当前的单词\(w_i\)。目标就是最大化该函数,它是直接通过学习得到的,所以称为判别模型。

他们之间的区别如下:
Imgur

这两个算法的详细实现就不介绍了,可以参考下Charpter 10: Part-of-Speech Tagging.


发表评论

电子邮件地址不会被公开。 必填项已用*标注