zoukankan      html  css  js  c++  java
  • 最大概率法分词中词频惩处因子的作用探究


            在最大概率法分词的程序中,因为每一个词出现的次数分布很不均匀。并且我们要计算每一个词出现的概率,对于出现次数比較少的词概率就很小,求句子中词的概率之积的时候,须要将好多很小的数作乘法,可能会将超出计算机所能表示的数的最小范围。为了便于计算。经常要将每一个词的概率求对数后在进行计算,可是因为对概率求对数后变为负值,因此要求相应的相反数。所以一个词出现的次数越多,最后求得相应的值越小。我们将这个值称为这个单词的代价。单词出现的次数越多。该单词的代价越低。否则代价越高。

    第一部分 公式推导

            如果:单词S出现的频数为s,词典中全部单词出现的总数为M,则单词S的代价为:
                    cost(S) = - log(s/M)                                                          (公式1)
            为了不至于词的频数悬殊过大,我们对全部的词都乘以一个惩处因子k,使词的频数同步的扩张或缩小,观察k的取值对于分词准确率的影响。因此。公式(1)就变为:
                    cost(S) = - log(ks/M)                                                        (公式2)

            如今来分析分词的过程:
            假设对于一个汉字串(比如:年前),能够分为一个词(即:年前),也能够分为两个词(即:年/前),如今来分析什么情况下会分为两个词。在上面的样例中。假定用A、B、C分别代表例如以下内容:A为“年”,B为“前”,C为“年前”。

    而且“年”和“前”出现的概率极低,“年前”出现概率较高。那么,上面的样例中。汉字串有没有可能被切分为两个词呢?如前所述,终于分词算法会选择一种费用最低的切分方式。

    假设该字串要分为两个词。则必需要满足:
                    cost(A) + cost(B) < cost(C)                                                   (公式3)
            当中A和B为拆分后的字串。C为未拆分的字串。若用a、b、c分别代表A、B、C的频数,将公式2代入公式3,则有:
                    - log(ka/M) – log(kb/M) < - log(kc/M)                                    (公式4)
            将公式4展开:
                    - [ log(k) + log(a) – log(M) ] + - [ log(k) + log(b) – log(M) ] < - [ log(k) + log(c) – log(M) ]
            整理:
                    log(M) – log(a) – log(b) – log(k) < - log(c)
            即:
                    log(Mc/abk) < 0
            也就是:
                    Mc < abk
            亦即:
                    abk > Mc                                                                                  (公式5)

            从公式5能够看出。在a、b、c和M的大小固定的情况下,仅仅要k的值大于某一个数,公式5就成立,从而公式4和公式3成立。也就是说,当k的值大于一个确定的值的时候。汉字串会被拆为A/B两部分。

            更复杂一点,对于以下的样例:“2日出生于”,仅仅考虑当中的四个汉字。能够有以下两种切分方式:“日/出生/于”和“日出/生于”。假设要切分为三个词,必须满足例如以下的公式:
                    - log(ka/M) – log(kb/M) – log(kc/M) < - log(kp/M)  – log(kq/M)          (公式6)
            展开,整理得:
                    abck > Mpq                                                                             (公式7)

            从公式7能够看出,即便是a、b、c远远低于于p、q的频数。仅仅要k的取值合适。总会有公式7成立,继而公式6成立。

    因此上面的样例是有可能切分为三个词的。


     
            观察公式7,将公式两边都乘以k*k。得到:
                    abckkk > Mpqkk                                                                      (公式8)
                    ak*bk*ck > M*pk*qk                                                                (公式9)    

            你看出了什么规律?当对全部的单词的频数都乘以一个固定值的时候。频数较少的词也有可能是整体费用较低的。

            更一般的情况,将公式9延伸到很多其它的词,说明了什么?


            结论:

            (1)随着k值增大。程序有将句子切分为很多其它的较短的词的倾向。

    即使这些较短的词出现的频率并不多。可是词的长度短意味着能够切出的词的数量多。

    因为k的存在,每一个词都会获得一定比例的权重加成,积少成多。众多的词的累积效应终于会超过出现次数较多可是较长的词。通俗来说就是。双拳难敌四手,哈哈。

            (2)随着k值减小,程序有将句子切分为更少的较长的词的倾向。理由通上。


    第二部分 实例验证

            对语料选取200个句子进行測试,分别取惩处系数k为表中所列数字。測试结果例如以下:

    序号 系数 准确率 召回率 交集型歧义 未登录词语 组合型歧义 总数 标准切分数目 切分得到数目 切分正确数目
    1 0.1 95.26% 98.98% 10 255 44 309 5377 5587 5322
    2 0.3 95.28% 99.03% 9 255 42 306 5377 5589 5325
    3 0.5 95.30% 99.07% 8 255 42 305 5377 5590 5327
    4 0.8 95.30% 99.07% 8 255 42 305 5377 5590 5327
    5 1 95.28% 99.07% 9 255 41 305 5377 5591 5327
    6 5 95.21% 99.33% 6 263 30 299 5377 5610 5341
    7 10 94.85% 99.42% 6 284 25 315 5377 5636 5346


            1.对上表的内容进行验证:

            (1)当k的值为0.1、0.3、0.5、0.8和1.0时。有例如以下切分错误。当k的值为5.0和10.0时,错误消失。
                      组合型歧义: 半年    正确切分: 半/年    错误切分: 半年
                      组合型歧义: 身为    正确切分: 身/为    错误切分: 身为

            (2)当k的值为0.1时,有例如以下切分错误。当k的值为0.3、0.5、0.8、1.0、5.0和10.0时,错误消失。
                      组合型歧义: 不是    正确切分: 不/是    错误切分: 不是

            (3)当k的值为0.1、0.3时,有例如以下切分错误。当k的值为0.5、0.8、1.0、5.0和10.0时,错误消失。
                      交集型歧义: 地表如今    正确切分: 地/表现/在    错误切分: 地表/如今

            2.对上表内容的分析:
            (1)组合型歧义
            通过分析发现,出错的组合型歧义都是类似于以下的形式,应该是将词语切开而实际上没有切开,通过增大k值。使一些类似的错误得到解决。但仍然有大部分没有解决。理论上来讲。仅仅要k增大到一定程度,这些错误都能够解决,可是同一时候还有可能有其它的副作用,得不偿失。
            组合型歧义: 半年    正确切分: 半/年    错误切分: 半年

            (2)未登录词语
            出错的未登录词语都是例如以下的形式,不该切分而进行了切分。是因为随着k值的增大,把词语切为单字的代价已经小于保留为词语的代价了。加之这些词本身的频数又不太大。因此受k值的影响特别明显。上表中当k=5和k=10时未登录词急剧添加就是这个原因。
            未登录词语: 罗织    正确切分: 罗织    错误切分: 罗/织

            (3)交集型歧义
            某些特殊的交集型歧义是能够通过改变k值来解决的,比方上面的样例(正确和错误切分方式词的数目不一样)。可是多数的交集型歧义形式为例如以下(正确和错误切分方式词的数目一样):
            交集型歧义: 彩笔画    正确切分: 彩笔/画    错误切分: 彩/笔画

            如果有例如以下公式:

                    cost(A) + cost(B) < cost(C) + cost(D)

                    - log(ka/M) – log(kb/M) < - log(kc/M)  - log(kd/M)
            终于化简为:
                    a + b > c + d                                                                   (公式10)

            观察公式10,该公式和k值无关,因此不能通过改变k值的方式来消除这种交集型歧义。




  • 相关阅读:
    105.UDP通信实现广播
    104.tcp多线程读写实现群聊
    103.tcp通信实现远程控制
    102.tcp实现多线程连接与群聊
    101.自动注入
    100.dll调用
    99.遍历进程并直接写入内存
    98.TCP通信传输文件
    97.TCP通信
    96.udp通信
  • 原文地址:https://www.cnblogs.com/cynchanpin/p/6925389.html
Copyright © 2011-2022 走看看