亲爱的喵喵们,明天小夕就正式开学啦。开学后每周有几天的课比较多,小夕为了保证每篇文章的质量,可能做不到每天一更啦。但是小夕也会尽量挤出时间来写文章,尽量保证两三天更一篇。希望不要责怪小夕哦...
分词,也叫切词,即通过某种方式将句子中的每个词语识别并切分开来。分词技术不仅仅适用于中文哦,对于日文、韩文等语言也同样适用。在某些特殊场景如手写识别,自带分词属性的英语会因连字而变得分词界限模糊,此时也是需要靠分词技术解决的。
其实呢,分词技术,想一下的话会觉得很难,再想一下又会觉得简单,再思考细节又觉得很难。真正研究起来又会发现很简单QAQ。
难
一开始觉得难是因为没有想到“词典”这个好东西。没有词典的话,好像从那么多计算机看起来长得一样的文字中切成一个个的词是不可思议的(在计算机看来,每个字都是一串01)。
简单
然而想到了词典,就觉得容易啦。直接从一个句子的开头第一个开始,然后查词典不就好啦~比如“我是机智的小夕”,查词典时发现没有“我是”这个词,于是在“我”和“是”之间画一道线。
然后再查“是机”,发现也没有。于是在“是”和“机”之间也划一道。
再查“机智”,诶?有了!于是再查“机智的”,发现没有这个词。那就在“机智”和“的”之间划一道!
假如词典很智能,也能收录人名。于是“我|是|机智|的|小夕”就完成啦~
难
然而问题来了。如果采用查字典的办法,“发展中国家”会怎样分呢?显然从左到右查字典后会变成这样“发展|中国|家”。这显然是不对的呀。(敢说不知道“发展|中|国家”,小夕打你哦)
再仔细一想,好像这种情况非常多。
怎么解决呢?有人说那就从右往左,有人说那就从中间往两头,也有语言学家开始试图编写文法规则。
但是问题难度爆炸了,各种天马行空的改良效果都很一般。
简单
直到某个大师将统计语言模型用在了分词技术上!
那么什么是统计语言模型呢?
统计语言模型其实就是通过计算一个条件概率链来计算出一个句子出现的概率,并将概率的大小抽象为这个句子的得分。出现概率越大的句子,得分越高,句子越正常。反之得分低的句子越不正常,或者说人类一般不会表达这样的句子。
比如“的那问树你发可非受的”这个乱打的句子,利用统计语言模型,可以计算出这个句子的得分非常低,说明这是个不正常的句子。而“今天天气怎么样”这个句子的得分就会非常高。
高能部分
怎么做到计算句子得分/概率的呢?
假设一个句子有n个基元(基元即句子的组成单位,有时可以认为是字,有时认为是词,有时是短语等),该句子就可以表示为w1w2w3…wn ,则该句子的概率就等于
P=p(w1)p(w2|w1)p(w3|w1w2)…p(wn|w1w2…wn-1)
这个公式的意思就是:(第一个词w1出现的概率)*(当第一个词w1出现时,出现第二个词w2的概率)*(前两个出现的词分别是w1,w2时,出现w3的概率)*…
然而这个概率的计算代价实在太大了,计算最后一个词的出现概率时要考虑之前所有的词已经出现的历史。除了计算代价外,还会带来一些其他问题,因此我们可以限定参考的历史词的数量,来近似句子的概率。比如我们限定为1,此时句子的概率等于
P=p(w1)p(w2|w1)p(w3|w2)…p(wn|wn-1)
这条概率链就是随机过程中讲的一阶马尔可夫链。看,这样是不是计算量少多啦?此时的语言模型被称为2-gram模型。
同理,若将历史词的数量限定为2,则句子的概率就是二阶马尔可夫链,此时的语言模型被称为3-gram模型。
若完全不考虑历史词,则此时句子概率计算的考虑就成了基元相互独立的情况了,此时称为1-gram模型。此时的概率
P=p(w1)p(w2)p(w3)…p(wn)
经过小夕的精彩讲解依然没有理解统计语言模型的喵喵可以求助wiki或者查询“自然语言处理”或“信息检索”领域的相关书籍哦。
基于统计语言模型的分词方法有很多种,小夕在这里只讲一种最容易理解的思路。
首先,每个词(基元)出现的概率不是凭空就知道的,往往是通过大量样本从统计方法(别看成统计学习!这里跟机器学习没有半毛钱关系!)近似得到的。
比如,我们手头有人民日报的最近十年的报纸,然后我们把其中所有的句子存在电脑里作为我们的语料库。
然后我们通过某种比较low的不需要语言模型的方法,比如前面提到的查字典的方法,来对人民日报大语料库进行分词(一种效果比较好的方法是后向匹配,即从每个句子的末尾开始往前查字典。且更长的词能匹配到,就放弃已查到的短词)。
可想而知,很多句子都分词分得不对,但是这不影响我们统计每个词出现的概率。当语料库足够大时,那些被分错的词的影响就近乎忽略了。(不理解的喵喵请补概率论的大数定理)
于是我们从语料库中得到了每个词的出现次数,然后除以语料库中所有的词,即得到每个词的出现概率。因此很容易理解,对于“女生”这个词的出现概率会非常大,而对于“嘎玛”这个奇怪的词的出现概率会非常小。单独出现一个“猫”的概率非常大,而单独出现一个“生”的概率会非常小。
基于上面得到的每个词的出现概率,我们计算“北京大学生”的正确分词结果。
我们首先列举出其所有的分词可能性,比如
“北|京大|学|生”;
“北|京|大|学|生”;
“北京|大|学生”;
“北京|大学|生”;
“北京大学|生”等~
小夕不一一列举啦。
然后利用统计语言模型计算每个分词结果的得分。此时小夕为了讲解方便,设语言模型为前面高能部分中的1-gram模型,此时每个句子的得分即每个词出现的概率的乘积(无需考虑条件概率)。而刚才讲了,我们已经从语料库中得到了每个词出现的概率。
于是一经计算,妖怪就原形毕露啦~比如“北|京大|学|生”的概率会非常低,因为单独出现“北“,单独出现“京大”、“学”、“生”这些词的概率都非常小,所以乘起来的结果自然就很小啦~所以这个句子的得分很低。
同样的道理,对于“北京|大学生”这个句子,得分就会很高。因为“北京”的出现概率很大,“大学生”的概率也很大。而“北京大学|生”这种分法的话,虽然“北京大学”的概率比较大,但单独一个“生”的概率很小,乘起来之后会比“北京|大学生”的值小很多!所以“北京大学|生”被干掉咯。
所以,最终得分最高的句子,也就是出现概率最大的句子,自然是“北京|大学生”啦~
完!美!收!工!
最后感谢一位喵喵提醒小夕的转账二维码太小导致有的手机扫不出QAQ,小夕将二维码放大啦。你们的支持是小夕写出精彩文章的动力哦~