老熟女激烈的高潮_日韩一级黄色录像_亚洲1区2区3区视频_精品少妇一区二区三区在线播放_国产欧美日产久久_午夜福利精品导航凹凸

重慶分公司,新征程啟航

為企業提供網站建設、域名注冊、服務器等服務

TrieTree介紹及其C#實現

作者:Tony Qu

創新互聯建站長期為上1000家客戶提供的網站建設服務,團隊從業經驗10年,關注不同地域、不同群體,并針對不同對象提供差異化的產品和服務;打造開放共贏平臺,與合作伙伴共同營造健康的互聯網生態環境。為涪城企業提供專業的成都做網站、成都網站建設,涪城網站改版等技術服務。擁有10余年豐富建站經驗和眾多成功案例,為您定制開發。

 

在自然語言處理(NLP)研究中,NGram是最基本但也是最有用的一種比對方式,這里的N是需要比對的字符串的長度,而今天我介紹的TrieTree,正是和NGram密切相關的一種數據結構,有人稱之為字典樹。TrieTree簡單的說是一種多叉樹,每個節點保存一個字符,這么做的好處是當我們要做NGram比對時,只需要直接從樹的根節點開始沿著某個樹叉遍歷下去,就能完成比對;如果沒找到,停止本次遍歷。這話講得有些抽象,我們來看一個實際的例子。

假設我們現在詞庫里面有以下一些詞:

上海市
上海灘
上海人
上海公司
北京
北斗星
楊柳
楊浦區

Trie Tree介紹及其C#實現

如圖所示:掛在根節點上的字有上、北、楊,

如果我們現在對“上海市楊浦區”這個詞做3gram就有上海市、海市楊、市楊浦、楊浦區,現在我們要知道哪些詞是能夠被這個字典識別的,通常我們可以用NGram來做分詞。有了這顆樹,我們只需要依次取每個字符,從根開始進行比對,比如上海市,我們能夠匹配 上->海->市,這個路徑,所以匹配;比如海市楊,由于沒有“海”字掛在根節點上,所以停止;市楊浦也無法匹配;最終匹配楊浦區,得到 楊->浦->區 這個路徑,匹配。

最終我們可以把“上海市楊浦區”切分為 上海市|楊浦區。

盡管TrieTree要比普通字符串數組節省很多時間,但這并不是沒有代價的,因為你要先根據字典構建這棵樹,這個代價并不低,當然對于某個應用來說一旦TrieTree構建完成就可以重復使用,所以針對大規模比對來說,性能提升還是很客觀的。

下面是TrieTree的C#實現。

   public class TrieTree
    {
        TrieNode _root = null;

        private TrieTree()
        {
            _root = new TrieNode(char.MaxValue,0);
            charCount = 0;
        }
        static TrieTree _instance = null;
        public static TrieTree GetInstance()
        {
            if (_instance == null)
            {
                _instance = new TrieTree();
            }
            return _instance;
        }
        public TrieNode Root 
        {
            get { return _root; }
        }
        public void AddWord(char ch)
        {
            TrieNode newnode=_root.AddChild(ch);
            newnode.IncreaseFrequency();
            newnode.WordEnded = true;
        }
        int charCount;
        public void AddWord(string word)
        {
            if (word.Length == 1)
            {
                AddWord(word[0]);
                charCount++;
            }
            else
            { 
                char[] chars=word.ToCharArray();
                TrieNode node = _root;
                charCount += chars.Length;
                for (int i = 0; i < chars.Length; i++)
                {
                    TrieNode newnode=node.AddChild(chars[i]);
                    newnode.IncreaseFrequency();
                    node = newnode;
                }
                node.WordEnded = true;
            }
        }
        public int GetFrequency(char ch)
        {
            TrieNode matchedNode = _root.Children.FirstOrDefault(n => n.Character == ch);
            if (matchedNode == null)
            {
                return 0;
            }
            return matchedNode.Frequency;             
        }
        public int GetFrequency(string word)
        {
            if (word.Length == 1)
            {
                return GetFrequency(word[0]); 
            }
            else
            {
                char[] chars = word.ToCharArray();
                TrieNode node = _root;
                for (int i = 0; i < chars.Length; i++)
                {
                    if (node.Children == null)
                        return 0;
                    TrieNode matchednode = node.Children.FirstOrDefault(n => n.Character == chars[i]);
                    if (matchednode == null)
                    {
                        return 0;
                    }
                    node = matchednode;
                }
                if (node.WordEnded == true)
                    return node.Frequency;
                else
                    return -1;
            }
        }
    }

這里我們使用了單例模式,因為TrieTree類似緩存,不需要重復創建。下面是TreeNode的實現:

    public class TrieNode
    {
        public TrieNode(char ch,int depth)
        {
            this.Character=ch;
            this._depth=depth;
        }


        public char Character;

        int _depth;
        public int Depth
        {
            get{return _depth;}
        }

        TrieNode _parent=null;
        public TrieNode Parent 
        {
            get { return _parent; }
            set { _parent = value; }
        }

        public bool WordEnded = false;


        HashSet _children=null;
        public HashSet Children
        {
            get { return _children; }
        }

        public TrieNode GetChildNode(char ch)
        {
            if (_children != null)
                return _children.FirstOrDefault(n => n.Character == ch);
            else
                return null;
        }

        public TrieNode AddChild(char ch)
        {
            TrieNode matchedNode=null;
            if (_children != null)
            {
                matchedNode = _children.FirstOrDefault(n => n.Character == ch);
            }
            if (matchedNode != null)    //found the char in the list
            {
                //matchedNode.IncreaseFrequency();
                return matchedNode;
            }
            else
            {   //not found
                TrieNode node = new TrieNode(ch, this.Depth + 1);
                node.Parent = this;
                //node.IncreaseFrequency();
                if (_children == null)
                    _children = new HashSet();
                _children.Add(node);
                return node;
            }
        }

        int _frequency = 0;
        public int Frequency
        {
            get { return _frequency; }
        }

        public void IncreaseFrequency()
        {
            _frequency++;
        }

        public string GetWord()
        { 
            TrieNode tmp=this;
            string result = string.Empty;
            while(tmp.Parent!=null) //until root node
            {
                result = tmp.Character + result;
                tmp = tmp.Parent;
            }
            return result;
        }

        public override string ToString()
        {
            return Convert.ToString(this.Character);
        }
    }

最后提供一個能工作的演示代碼,供大家參考,點擊這里下載。


本文名稱:TrieTree介紹及其C#實現
文章路徑:http://www.xueling.net.cn/article/jgghec.html

其他資訊

在線咨詢
服務熱線
服務熱線:028-86922220
TOP
主站蜘蛛池模板: 午夜视频日本 | 不卡在线观看亚洲视频 | 网站大全免费网址 | 亚洲AV无码片一区二区三区 | 精品欧美一区二区三区久久久小说 | 国产SUV精品一区二区五 | 日韩亚洲国产中文永久 | 久久入口| 国产高清免费av在线 | 日本高清在线播放 | 奇米影视小说 | 97成人在线视频 | 久久国产精品视频在线 | 日本a一区 | 精品久久久久久亚洲精品 | 黄色片日本人 | 欧美最猛性xxxxx免费 | 日本理论片午午伦夜理片2021 | 久久亚洲精品无码AV红樱桃 | 美女MM131爽爽爽免费图片 | 国产一区二区三区中文 | 日本免费观看一区久久久 | 色翁荡熄又大又硬又粗又视频 | 伊人天堂久久 | 欧洲成人在线视频 | 国产手机视频自拍 | 高清国产天堂在线bt免费 | 久久一区二区三区免费 | www.欧美在线观看 | 动漫精品久久久 | 波多野结衣高清一区二区三区 | 中文字幕一区二区三 | 青青草原自拍视频 | 精品国产乱码久久久久久图片 | 9420在线观看视频免费 | 久久小草成人av免费观看 | 天天天操天天天干 | 国产影视一区二区三区 | 久久久久久久久国产 | 久久丫精品国产免费 | 国产成人精品热玖玖玖 |