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

第一部分 公式推导

假设:单词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值的方式来消除这样的交集型歧义。

最大概率法分词中词频惩罚因子的作用探究相关推荐

  1. 最大概率法分词及性能测试

    最大概率分词是一种最基本的统计方法分词.一个待分割的字符串有多种分词结果,最大概率分词的原则是将其中概率最大的那个作为该字符串的分词结果. 第一部分 理论基础 如对一个字符串: S:有意见分歧 分词结 ...

  2. 最大概率法分词及性能測试

    最大概率分词是一种最主要的统计方法分词. 一个待切割的字符串有多种分词结果,最大概率分词的原则是将当中概率最大的那个作为该字符串的分词结果. 第一部分 理论基础 如对一个字符串: S:有意见分歧 分词 ...

  3. 正向(逆向)最大匹配和最大概率法分词的错误分析

    正向最大匹配.逆向最大匹配.最大概率法是最简单的三种分词方式.本文从这三种分词方法产生的错误入手,观察他们分词的优缺点. 1.基本情况 从语料中选取了200个句子作为样本,分别用三种不同的分词方式进行 ...

  4. 基于Tire树和最大概率法的中文分词功能的Java实现

    对于分词系统的实现来说,主要应集中在两方面的考虑上:一是对语料库的组织,二是分词策略的制订. 1.   Tire树 Tire树,即字典树,是通过字串的公共前缀来对字串进行统计.排序及存储的一种树形结构 ...

  5. python分词统计词频_-用python找出一篇文章中词频最高的20个单词

    python统计一个大文件中很多小文件里面的词频 #!/usr/bin/env python3.6 from collections import Counter from functools imp ...

  6. LibSVM中的松弛变量和惩罚因子

    LibSVM中的松弛变量和惩罚因子 1.松弛变量 现在我们已经把一个本来线性不可分的文本分类问题,通过映射到高维空间而变成了线性可分的.就像下图这样: 圆形和方形的点各有成千上万个(毕竟,这就是我们训 ...

  7. 如何在jieba分词中加自定义词典_R-数据挖掘 | jiebaR 分词

    一.jiebaR主要函数 1.worker():加载jiebaR库的分词引擎 worker(type = "mix", dict = DICTPATH, hmm = HMMPATH ...

  8. 中文分词中的战斗机-jieba库

    英文分词的第三方库NLTK不错,中文分词工具也有很多(盘古分词.Yaha分词.Jieba分词等).但是从加载自定义字典.多线程.自动匹配新词等方面来看. 大jieba确实是中文分词中的战斗机. 请随意 ...

  9. SVM学习(续)核函数 松弛变量和惩罚因子

    SVM的文章可以看:http://www.cnblogs.com/charlesblc/p/6193867.html 有写的最好的文章来自:http://www.blogjava.net/zhenan ...

最新文章

  1. 如何在同一台电脑开启多个tomcat服务器
  2. 激光雷达 win10
  3. 一文综述OpenCV基础+计算机视觉基础
  4. Python错误“ImportError: No module named MySQLdb”解决方法
  5. android studio设计模式和文本模式切换
  6. leecode53 最大子序列和
  7. html5 原生拖拽,原生JS实现拖拽效果
  8. LeetCode算法入门- Palindrome Number-day2
  9. Jeecgboot Feign、分布式压测、分布式任务调度
  10. 影响 Chrome、Edge 等浏览器的 V8 引擎0day
  11. c++11 多线程编程(二)------ 线程类构造函数深入理解
  12. 使用 SqlDataSource 控件查询数据47
  13. Error creating bean with name 解决办法
  14. VueUse中文文档Vue官方工具库
  15. 三菱PLC和卓岚串口服务器使用方法
  16. 最简单华为设备怎么无需Root激活XPOSED框架
  17. 小米手机(MIUI 13)安装Fiddler CA证书
  18. gcc -O0 -g 和gcc -O3 -g
  19. 计算机主板供电,主板供电/元器件
  20. 洛谷 P1919 【模板】A*B Problem升级版 【快速傅里叶变换 FFT】

热门文章

  1. 公司USB设备管理策略方案
  2. Jlink下载u-boot
  3. 【Java毕设】CRM客户管理系统(SSM+SpringBoot+MySQL,附源码)
  4. 特斯拉为何使用.NET Core技术框架?
  5. 数据不平衡imblearn算法汇总
  6. scrapy框架爬取王者荣耀英雄数据
  7. 吓人!半夜,这个程序从虚拟机里跑出来了!
  8. error: expected declaration or statement at end of input----solved
  9. 揭秘拳头公司的游戏API: 充分发挥ZUUL的性能
  10. 【Leetcode刷题】题64. 求1+2+…+n