zoukankan      html  css  js  c++  java
  • Huffman编码与n-gram模型

    Huffman树(最优二叉树):

    Huffman树是一种带权路径长度最短的二叉树。所谓树的带权路径长度,就是树中所有的叶结点的权值乘上其到根结点的路径长度(若根结点为0层,叶结点到根结点的路径长度为叶结点的层数)。

    构建huffman树:

    输入

    符号集合 S = { s 1 , s 2 , ⋯ , s n },其S集合的大小为 n。

    权重集合 W = { w 1 , w 2 , ⋯ , w n } ,其W集合不为负数且 wi = weight(si), 1 ≤ i ≤ n。

    输出

    一组编码 C(S,W)={c1,c2, ⋯ ,cn} ,其C集合是一组二进制编码且ci为si相对应的编码, 1 ≤ i ≤ n。

    目标

    为C的加权的路径长,对所有编码 T(S,W),则L(C) ≤ L(T)

    例如:

    Huffman编码:

    Huffman编码使用变长编码表对源符号(如文件中的一个字母)进行编码,其中变长编码表是通过一种评估来源符号出现概率的方法得到的,出现概率高的字母使用较短的编码,反之出现概率低的则使用较长的编码,这便使编码之后的字符串的平均长度、期望值降低,从而达到无损压缩数据的目的。

    构建Huffman编码是一个通过哈夫曼树进行的一种编码,一般情况下,以字符:‘0’与‘1’表示。编码的实现过程很简单,只要实现哈夫曼树,通过遍历哈夫曼树,规定向左子树遍历一个节点编码为“0”,向右遍历一个节点编码为“1”,结束条件就是遍历到叶子节点!

    例如:

     

     

    n-gram模型:

    n-gram模型是基于(n-1)阶马尔可夫链的一种概率语言模型该模型基于这样一种假设,第n个词的出现只与前面N-1个词相关,而与其它任何词都不相关,整句的概率就是各个词出现概率的乘积。这些概率可以通过直接从语料中统计N个词同时出现的次数得到。常用的是二元的Bi-Gram和三元的Tri-Gram。(马尔可夫链),当n分别为1、2、3时,又分别称为一元语法(unigram)、二元语法(bigram)与三元语法(trigram)

    假设T是由词序列W1,W2,W3,…Wn组成的,那么P(T)=P(W1W2W3...Wn)=P(W1)P(W2|W1)P(W3|W1W2)…P(Wn|W1W2…Wn-1)

    例如:

    第一个词确定后,看后面的词在前面的词出现的情况下出现的概率。如一句话“大家喜欢吃苹果”,总共四个词“大家”,“喜欢”,“吃”,“苹果”,怎么分词现在不讨论,总之词已经分好,就这四个。那么这句话是一个自然语言的概率是:

    P(大家,喜欢,吃,苹果)=p(大家)p(喜欢|大家)p(吃|大家,喜欢)p(苹果|大家,喜欢,吃)

    p(大家)表示“大家”这个词在语料库里面出现的概率;

    p(喜欢|大家)表示“喜欢”这个词出现在“大家”后面的概率;

    p(吃|大家,喜欢)表示“吃”这个词出现在“大家喜欢”后面的概率;

    p(苹果|大家,喜欢,吃)表示“苹果”这个词出现在“大家喜欢吃”后面的概率。

    把这些概率连乘起来,得到的就是这句话平时出现的概率。

    但是这种方法存在两个致命的缺陷:一个缺陷是参数空间过大,不可能实用化;另外一个缺陷是数据稀疏严重。

    为了解决这个问题,我们引入了马尔科夫假设:一个词的出现仅仅依赖于它前面出现的有限的一个或者几个词。

    如果一个词的出现仅依赖于它前面出现的一个词,那么我们就称之为bigram。即

    P(T) = P(W1W2W3…Wn)=P(W1)P(W2|W1)P(W3|W1W2)…P(Wn|W1W2…Wn-1)

       ≈P(W1)P(W2|W1)P(W3|W2)…P(Wn|Wn-1)

    如果一个词的出现仅依赖于它前面出现的两个词,那么我们就称之为trigram。

    依赖词的个数“n”的选择:

    理论上,只要有足够大的语料, n越大越好

    实际情况往往是训练语料很有限,很容易产生数据稀疏,不满足大数定律,算出来的概率失真。

    另一方面,如果n很大, 参数空间过大,产生维数灾难,也无法实用。

    trigram用的最多。尽管如此,原则上,能用bigram解决,绝不使用trigram。 n取≥4的情况较少

    当n更大时:对下一个词出现的约束信息更多,具有更大的辨别力;

    当n更小时:在训练语料库中出现的次数更多,具有更可靠的统计信息,具有更高的可靠性、实用性。

  • 相关阅读:
    使用PrintDocument进行打印
    【转】封装原生JS实现Ajax
    休眠到指定时分秒
    [原创]vscode初体验
    反编译网站
    命令行工具aspnet_regiis.exe实现加密和解密web.config
    Sqlserver内置函数实现MD5
    [转]如何循序渐进向dotnet架构师发展
    [转]高级系统架构师培训笔记
    理解RESTful
  • 原文地址:https://www.cnblogs.com/xmeo/p/6756033.html
Copyright © 2011-2022 走看看