word2vec 中的数学原理二 预备知识 霍夫曼树

主要参考:    word2vec 中的数学原理详解                 自己动手写 word2vec

 

 

编码的话,根是不记录在编码中的

这一篇主要讲的就是霍夫曼树(最优二叉树)和编码。  参考   快速画出哈夫曼树 / 霍夫曼树 / 最优树   了解其构成。    哈夫曼树及 python 实现

python 代码 构建霍夫曼树 ,获得霍夫曼编码    简单实现:

复制代码
#节点类
class Node(object):
    def __init__(self,name=None,value=None):
        self._name=name
        self._value=value
        self._left=None
        self._right=None

#哈夫曼树类
class HuffmanTree(object):

    #根据Huffman树的思想:以叶子节点为基础,反向建立Huffman树
    def __init__(self,char_weights):
        self.a=[Node(part[0],part[1]) for part in char_weights]  #根据输入的字符及其频数生成叶子节点
        while len(self.a)!=1:
            self.a.sort(key=lambda node:node._value,reverse=True)
            c=Node(value=(self.a[-1]._value+self.a[-2]._value))
            c._left=self.a.pop(-1)
            c._right=self.a.pop(-1)
            self.a.append(c)
        self.root=self.a[0]
        self.b=range(10)          #self.b用于保存每个叶子节点的Haffuman编码,range的值只需要不小于树的深度就行
    def show(self):
        pass

    #用递归的思想生成编码
    def pre(self,tree,length):
        node=tree
        if (not node):
            return
        elif node._name:
            print node._name + '的编码为:',
            for i in range(length):
                print self.b[i],
            print '\n'
            return
        self.b[length]=0
        self.pre(node._left,length+1)
        self.b[length]=1
        self.pre(node._right,length+1)
     #生成哈夫曼编码
    def get_code(self):
        self.pre(self.root,0)


if __name__=='__main__':
    #输入的是字符及其频数
    char_weights=[('',15),('喜欢',8),('观看',6),('巴西',5),('足球',3),('世界杯',1)]
    # char_weights = [('a', 4), ('b', 5), ('c', 8), ('d', 9), ('e', 11), ('f', 13)]
    tree=HuffmanTree(char_weights)
    tree.get_code()
复制代码

运行结果:

复制代码
我的编码为: 0 

世界杯的编码为: 1 0 0 0 

足球的编码为: 1 0 0 1 

巴西的编码为: 1 0 1 

观看的编码为: 1 1 0 

喜欢的编码为: 1 1 1 
复制代码

 

posted @   dahu1  Views(939)  Comments(0Edit  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
点击右上角即可分享
微信分享提示