【人工智能】正经说-自然语言处理(2)


前言

大家猴啊!又到了两周一次正正经经地学知识的时间了,很期待吧!上一篇文章发表之后,发生了一些让正某人很开心的事情,在微信里有几位和IT几乎没半毛钱关系的朋友,跟我说居然全都看懂了,表示要继续跟下去。这让我很欣慰啊,多储备一些知识总是好的,以后你们可以很自豪的喊出来“处处不留爷,老子写代码!”,多押韵啊不过程序员也是有点儿门槛的。从这节课开始,是时候展示真正的技术了。

分词

上节课我们说过,这节课主要讲的是分词。但豪不夸张的说,分词这个事儿一两百字足矣说明它是什么、为什么、怎么用。写到这儿我停下来思考了良久,要不要绕过这里,或者一笔带过,重点换成LDA等一系列的硬点的菜。对于分词很多初出茅庐的人都会觉得这事情比较“low”,没啥可研究的,一走一过儿顺便就处理了,是比较基础的。还有一部分实干派,会觉得现在市场上有那么多分词系统,大多数都是免费的,随便找一个顺手的用就好了。确实,再造*这种事儿是不划算的。很多老牌儿分词系统如jieba,IKAnalyzer,ansj现在都已经深入人心;另外还有很多“青流”的加入,搜狗分词,腾讯文智,新浪云,哈工大语言云都是出场率比较高的分词系统,既然这么多大厂都在做,可见上述两种言论的人(包括我)对分词的理解也是管中窥豹。

网上过半数的关于分词的文章都是在拿这些分词系统作比较,分析效率,对比各行业数据的分词准确度,这些可能后面我们都会涉及到,落实到具体的代码上,手把手教你找到一个适合你的分词系统!现在就不多叙述了。那我们要讲什么呢?我们先来讲一下分词的现状吧!

字典分词

【人工智能】正经说-自然语言处理(2)

1 字典分词的分词树

Long long ago有一种原汁原味的分词方法:字典分词法。该方法简单暴力,完全依赖于你给的字典,想怎么分都在你一手掌控,并且效率奇高。后来人们渐渐地发现,这东西局限性太大了,字典未收录的词切不出来不说,还存在严重的歧义(如图1),需要不断地更新完善字典,在增加了优先长词,引入词频统计之后,还是不足以满足我们需求。不知道你们用没用过,反正我是用过,不得不说对仅限于某一个专业的领域来说这东西还是挺好用的,尤其是处理一些专业术语较多、变数较少的文章。

隐马尔科夫模型

经过业内大神的不断努力,分词的方法通过不断的进化终于趋于稳定和完善。这里值得重点讲的是隐马尔科夫模型了(Hidden Markov Model,以下简称HMM)。HMM作为一种统计分析模型,创立于20世纪70年代。80年代得到了传播和发展,成为信号处理的一个重要方向,现已成功地用于语音识别,行为识别,文字识别以及故障诊断等领域。

20世界90年代起,HMM开始应用于NLP分词,这也标志着开创了一个新的时代。同时,以HMM理论为基础的最大熵隐马尔科夫模型(MEMM),和对HMM优化而生的条件随机场(CRF),都慢慢的开始崭露头角。

通过上面的介绍我们已经知道了HMM是一个具有统计功能的模型了,那它到底在实际工作中能给我们带来什么显著的效果呢?我们来借助jieba分词系统来看一下:

【人工智能】正经说-自然语言处理(2)

2 结巴分词切分句子

以正某人的性格是绝对不会用“我来到清华大学”或者“严守一把手机关了”这种语句当例子的。咳咳看上面句子,第一种把HMM的开关关掉了,jieba应该是用的字典分词法,然后再计算出最有可能的一种分法。显然漏掉了什么。第二次打开HMM的开关,同样一句话,明显的可以看出,分出了一个字典里肯定没有的词!虽然我也不太清楚这句话到底想表达什么意思

HMM到底是怎么做到的呢?首先它巧妙地把分词问题转换成了标注问题,用字母BEMS进行标注。其中:

S:single,代表单字成词;

B:begin,代表词语的起始字;

M:middle,代表词语中间的字,可能有多个;

E:end,词语结束的字。

例如‘我喜欢麦当劳’,就会得到序列:SBEBME,上一张图,直观的看一下语料库是什么样子的。

【人工智能】正经说-自然语言处理(2)

3 对某报纸经过标注的语料库

这样直接提取S或者从B到E就是一个完整的分词。有了标注之后,可以生成隐马尔科夫链这种数据结构:

 

【人工智能】正经说-自然语言处理(2)

4隐马尔科夫链

4为隐马尔科夫链,上下一白一蓝为一组,是一个字。X代表这个汉字本身,例如“我”。Y代表它的标注,当X=我,Y=S。这样一一对应,组成隐马尔科夫链。HMM就是根据大量的打好标的语料(也就是隐马尔科夫链结构的数据),对输入的新句子进行标注。

是怎么样对新句子进行标注的呢?这里是我踩到的一个大坑。起初我很笃定的认为,和图像识别的时候一样,把每个汉字当做一张图片,BEMS当做对这个字打标,扔到CNN中去学习,通过加载训练出的model对汉字直接标注。后来越想越不对,虽然机器学习也是和统计学有关系,但是完全体现不出HMM是一个纯粹的统计模型,而且之所以叫隐马尔科夫模型,隐变量在哪?按照我的理论貌似完全不用其他变量了啊我哔哔哔!只能一切推翻重来。

其实真相一直摆在我们面前,就在公式里面。

 

【人工智能】正经说-自然语言处理(2)

5 HMM的条件概率公式

我会有这种蠢萌的理解也是因为对公式的逃避,啪啪打脸啊TAT事实证明如果对公式不理解要弄懂原理是要曲折的多。之后花了很长时间(你们知道的我这么说就是谦虚一下)弄懂公式之后,才算是理解了HMM到底是怎么标注的。如果你也和我一样对这种外星语言不太能理解,今天我就翻译一下,用地球人的语言讲给你听。先吐槽一下网上各种技术文章、论坛上那种遇到公式就说“大学学过统计学的人都知道这是什么意思”,“上过高中的人都明白这个符号什么意思“,“学过数学的人都懂”等等之类的言论,不要这样好吗?你们自己明白还不讲给我们听,没有你们这样欺负人的小白也有学习的权利啊!如果不是看了很多这样的文章这样说,我也不会一直都不理解公式是啥意思。

咱们来看公式吧,可以看出来这是个条件概率公式,意思就是要求出单个语句的哪一种标注(BEMS标注)组合是概率最高的,那就认为他是正确的标注。从公式的等号右边可以看出来,最终的概率是由两部分相乘得出的,而这两部分,也是我们HMM的核心理论,影响每个汉字标注(除首字)的因素只有两个:

1, 它上一个字的标注。

2, 他是什么字。

参考图4,隐马尔科夫链清晰地表达了这一点,图中与链接的有两个箭头,分别是对应前一个字的标注,对应他本身是什么汉字。下面我们就来分别讲解一下这两部分。

5中,公式前一部分是根据可观测序列Y做文章,首先,分词系统会根据公用语料(如图3)计算出每个句子的第一个字可能是S、B、M、E的概率,如下图:

【人工智能】正经说-自然语言处理(2) 

6 首个汉字分别为BEMS概率

图注:概率是负数的是因为做了对数处理,后面计算概率相乘就可以用对数相加。同时也避免小数相乘结果数位过长,丢失数据导致准确率降低;-3.14e+100可看做负无穷,概率就是0,表示不可能存在该情况。

接下来,我们展开公式的前半段,得到这样一个展开式:【人工智能】正经说-自然语言处理(2)

。不懂没关系。展开它我只是想让大家了解清楚,公式里面连乘的每一步都是只计算,简单地说也就是我们两大因素之一的只受到上一个字的标注的影响。由此理论,我们就知道了所有的概率,比如:B后面是M和E的概率分别是多少,S后面是B的概率是多少,E后面是S和B的概率分别是多少等等。那我们把所有的概率穷举,得到如下4*4的状态转移概率矩阵: 

【人工智能】正经说-自然语言处理(2)

7 状态转移矩阵

这个概率矩阵对于任何一句话都是不变的,下面看公式的后一部分。

后一部分主要是围绕隐含序列X来进行计算的,也是我们说的两大要素第二点,它本身是个什么汉字。通过对语料中的单个字进行计数的方式,来分别计算出该汉字可能被标注为BEMS的概率。听起来很绕实则很简单,举个例子:

被标注为B的字,语料中一共有1000个,其中有50个是‘我’字,概率0.05;

被标注为E的字,语料中一共有800个,其中有10个是‘我’ 字,概率0.0125;

被标注为M的字,语料中一共有500个,其中有20个是‘我’ 字,概率0.04;

被标注为S的字,语料中一共有200个,其中有100个是‘我’ 字,概率0.5;

这个概率就是一个隐含的参数,完全是通过对语料的统计出算来的。

我们把这两部分的概率相乘,当结果达到极大值时,即为该语句最正确的标注方法。

这样目的虽然是达到了,但是仔细想想,这个算法复杂度超高啊!假设一句话有N个字,那复杂度就是,我们已知Y=4,即B、E、M、S四种可能性。那就是,对于几十个字的大长句子已经超出我们计算机的负荷了但是分词系统在使用HMM进行分词的时候显得轻巧无比,瞬间完成。这又是咋回事儿呢?经过探究发现,HMM在运算中使用了一种叫维特比算法(Viterbi Algorithm)的动态规划算法,这里我也只是知道一个大概的意思,没有特别的深究下去,再搞下去又涉及到运筹学的内容了

简单的介绍一下吧,维特比算法会把每一步计算都独立开,动态存储了上一步计算的结果,比如通过,推测出的几率为最大,那我们就把动态的记录下来,下一步计算不需要重复的把从推算出的过程堆叠进去,只需通过这个已知条件,计算出就可以了。通过这个算法,计算难度锐减为,也就是16N,怪不得使用HMM分词如此之快!

注:关于维特比算法,也许说的不是很清楚,其实你就知道他简化了计算过程就可以了。各位看官想要弄清楚请自行搜索“维特比算法”相关资料进行阅读。

到这里总算是吧HMM介绍完了,回过头去看图2,这简简单单的一行代码,里面真是大有乾坤!现在我们已经把里面的乾坤都弄明白了!哈哈!我们可以…….嗯可以……反正,知道总比不知道强吧.汗……

下一篇文章我们可能会讲一下HMM的缺点以及解决办法,或者分词器的选择也说不定,总之我学到哪里我们就讲到哪里吧!多谢各位,我们下期再见了。

【人工智能】正经说-自然语言处理(2)


【人工智能】正经说-自然语言处理(2)


【人工智能】正经说-自然语言处理(2)

微信扫一扫
关注该公众号