word2vec 中的數學原理二 預備知識 霍夫曼樹

主要參考:    word2vec 中的數學原理詳解                 本身動手寫 word2vechtml

 

 

編碼的話,根是不記錄在編碼中的

這一篇主要講的就是霍夫曼樹(最優二叉樹)和編碼。  參考   快速畫出哈夫曼樹 / 霍夫曼樹 / 最優樹   瞭解其構成。    哈夫曼樹及 python 實現

python 代碼 構建霍夫曼樹 ,得到霍夫曼編碼    簡單實現:node

#節點類
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()

運行結果:python

個人編碼爲: 0 

世界盃的編碼爲: 1 0 0 0 

足球的編碼爲: 1 0 0 1 

巴西的編碼爲: 1 0 1 

觀看的編碼爲: 1 1 0 

喜歡的編碼爲: 1 1 1 
相關文章
相關標籤/搜索