zoukankan      html  css  js  c++  java
  • 初识中文分词(一)MMSEG

        第一次记录一些学习的内容,希望能给和我一样不熟悉中文分词的人一些思路。(写的不好,还请见谅)

    =====================背景======================

        中文分词的学习是想要给公司其他部门的人做一个简介,让不知道中文分词的人有个初步的认识,而我作为一个完全不懂的人要给其他不懂的人做这个讲解 ⊙﹏⊙b 估计是希望我以一个同样的不知道什么是中文分词算法的人来讲解这个,这样能更贴近听者的感受吧。

        硬着头皮看看写写6天多终于有一个我自己还算满意的PPT出山了。

        进入正题

    =================看这边~我就是正题==================

          其实在之前稍微了解了一点关于中文分词的思想,但是对于已经成型的中文分词器的主流思想还是不甚了解,从搜索引擎处找到了开源中国的中文分词库。一眼看上去是几十个分词器列了出来,但其实每个分词器点进去并不会有很长的介绍,基本都是给出来使用的分词算法、一些自有的特点、百分比数据等。稍微聚合一下就会发现,实际使用的分词算法两只手就能数的过来,而算法背后的模型又是可以聚合的(^o^)/,大致看过两遍后心里就有数了。

          我到现在看到的中文分词器,基本都是这三类的任意组合,一般来说,只使用其中一种思想的分词器效果基本无法达到比较理想的分词效果。而在这些组合中,又以前两种的组合居多,这可能也与第三种方法本身的研究进展和难度系数相对较高有关。

    • 第一种思想——基于词典:基于这种思想按照常用的说法也叫机械分词,基本上不太考虑文本本身要表达的含义,只是一个个找到词典中与之匹配的词语进行划分,所以这种方法基本上只是作为分词的前期处理。
    • 第二种思想——基于统计:基于这种思想的已经是经过了对分词这个实际的需求的数学建模、求解的一个过程,而无论是建模还是求解所用的算法,其实每一个问题都可以作为一个专门的课题写个论文,不信你可以拿这些关键字去论文网搜一搜。
    • 第三种思想——基于规则:在我看来,这个有点类似于人工智能一类了,建立一个系统来学习模仿人类是如何去分析一句话并如果对这句话的划分,甚至于可以添加一些标记来表示一句话当中所包含的情感。

          在大概6天的时间里,我只是粗粗的理解了下两种算法:MMSeg和Viterbi。下面就主要是对这两种算法的一个思路的简介,如果有理解错误的地方还请大神指点我一下,不胜感激╰( ̄▽ ̄)╮

    强势插入: 鉴于Viterbi的那部分我觉得放在一起这篇就会过长,暂定放在下一篇细聊 (^o^)/ 希望能继续关注!谢谢!

    MMSeg

          这个算法分词结果能满足很大一部分需求不是特别高的场合,最关键的是这个算法的思路简单粗暴,凭借这一点它就在主流的分词算法中占了一席之地。

          思路:基于词典+基于统计

    ##首先提一下基于词典的三个基本方法

      基于词典的归类下也就是上面列出来的MM(Maximum Matching)、RMM(Reverse Maximum Matching)、最少切分这三种,而这三种方法自由组合一下,也可以提高分词的准确度。

    举个栗子:  

    词典:

    有意
    意见
    分歧

    待宰割的句子:

      有意见分歧

    MM

    肢解:

      就是去词典里面找匹配的词,不过要有顺序哦,从左到右的划分→_→

      有意见分歧:词典里有这个词

      有意见分歧:有意的长度多了一个字,按照Maximum的思想,当然就是有意

      有意分歧:有意已经完成了,开始了,只有一个词是以开头的,那就是它咯

      有意见分歧:词典里面也只有一个以开头的词—分歧

    结果:

      有意/见/分歧

    果然是简单的不能再简单了,但是真的是我们想要的结果么?答案很明显

    如果要是从句末开始呢?

    RMM

    肢解:

      注:这里只是讲解这个思路,实际应用请参照各类开源分词词典

      这次我们从右往左看←_←

      有意见分歧:就这么一个以结尾的词哦,就用它了

      有意分歧:词典里有两个字结尾的词,其一就是这个

      有意见分歧:其二就是这个意见意见要比多了一个字,就意见

      有意见分歧:只剩一个了,那就它自己占一个位子了

    结果:

      有/意见/分歧

    其实思路是一样的,但结果还是有些差别的,浏览过很多个博客的分词文章,出现概率很高的一句话:统计结果表明,单纯使用正向最大匹配的错误率为 1/169,单纯使用逆向最大匹配的错误率为 1/245。

    最少切分

    这个看名字也大概能知道个八九不离十。可以这样想这样一个场景,划分:

    中华人民共和国

    在相当一部分情况下,我们当然希望看到中华人民共和国作为一整个词被划分,而不是中华/人民/共和国

     ## 已经了解了基于词典的三个基本方法,继续MMSeg

    MMSeg = MM + Seg = Maximum Matching + Segmentation

      这个算法的名称很清晰的表明了它使用的基本思想:正向最大匹配规则。

    下面进入另外一个栗子:

      研究生命起源

    当然还是需要给定一个词典:

    研究
    研究生
    生命
    起源

          可能你很想知道我这些词典是从哪里来的,好吧,实话告诉你,是我编的(^o^)/,但这完全不妨碍我讲解这个分词算法,并且它可以更好的给予形象支持。

          根据上面的方法可以知道按照MM方法可以分出来:研究生/命/起源。大部分时候结果肯定是不尽如人意。那是否可以考虑下其他的方案呢?我们最想看到的当然是:研究/生命/起源,聪明的读者肯定可以想到,这个如果用RMM的话就可以轻松办到咯,没错!那我们为什么还要用什么MMSeg的过滤器来拆词呢?

    (在这里搁浅了好久,一方面实在没时间继续写;另一方才是主要原因,我都举不出反例来,果然分析的词还是太少Orz;容贫尼继续吧,先放过这一马吧~等我后面有看到或者有好心人提醒我的时候,再补充上例子来解决这个问题:“为什么我还要用MMSeg呢?”)

          在这里我得先假定我们需要MMSeg了。。然后分词的流程就像下面画的:

    直接从PPT里面截个图。请忽略不好的画工。。。

          最需要解释的大概就是chunk了,chunk是MMSeg里面不可避免的一个名词。其实就是三个字或词构成的一个小组就叫chunk了。上图表示“研究生命起源”从研字开头会有6个chunk,每个都是一个candidate。下面这些candidate就要经过层层筛选了~

    1. 看谁长 —>
    2. 看谁平均水平好 —>
    3. 看谁的稳定度最好(2和3有点像水桶木板的那个理论,就是水桶能盛多少水是取决于最小的板,要是差异比较大的话,那么水桶的容量并不一定好) —>
    4. 这个听上去挺专业的,其实就是词频(即词出现的概率或者次数),当然是露脸的多的比较容易选上,所以说要经常出去混个脸熟~

      4号chunk技压群chunk,入选咯。实际情况中,可以要用的chunk更多,而且很可能在第三步的时候还剩下不少,而本例在第三步结束后就只剩下一个可选的candidate了,自然就不用进行第四步。此时,chunk中的第一个词就能够确定成为一个我们分出来的词了~啊~这么半天candidate也不是全部入选啊。之后做个减法

    研究生命起源 - 研究 = 生命起源

      然后从“生”这个字开始重复上面的步骤,就是MMSeg分词拉~

          如果你仔细看过,就能发现,前3步的确很“机械”,但是最后一步的话,就需要一些数据支持才有据可查了。这一步其实更偏向于统计的方法了,也就是在第一张图里面我们看到的“2基于统计”这个思想。

          想要把分词的效果提升上来,将其他方法的优势融入是最好的提升自己的办法。而且网上还是能找到很多的开源的资源供你使用,当然也有付费的,大家都是要吃饭的嘛。

    =====================后话======================

          我能理解的MMSeg就是这些咯~如果你觉得对你有帮助,烦请点点右下角的推荐哟~本姑娘在此表示感谢~O(∩_∩)O谢谢~

  • 相关阅读:
    CodeForces Gym 100500A A. Poetry Challenge DFS
    CDOJ 486 Good Morning 傻逼题
    CDOJ 483 Data Structure Problem DFS
    CDOJ 482 Charitable Exchange bfs
    CDOJ 481 Apparent Magnitude 水题
    Codeforces Gym 100637G G. #TheDress 暴力
    Gym 100637F F. The Pool for Lucky Ones 暴力
    Codeforces Gym 100637B B. Lunch 找规律
    Codeforces Gym 100637A A. Nano alarm-clocks 前缀和
    TC SRM 663 div2 B AABB 逆推
  • 原文地址:https://www.cnblogs.com/carrotH/p/3979792.html
Copyright © 2011-2022 走看看