亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C# > 正文

C# TrieTree介紹及實現方法

2020-01-24 03:23:58
字體:
來源:轉載
供稿:網友

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

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

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

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

如果我們現在對“上海市楊浦區”這個詞做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<TrieNode> _children=null; 
   public HashSet<TrieNode> 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<TrieNode>();  
   _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);
   }   
   }

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩视频免费大全中文字幕| 91免费精品国偷自产在线| 国产精品扒开腿做爽爽爽的视频| 亚洲欧美日韩一区二区在线| 亚洲自拍欧美色图| 久久久久免费精品国产| 欧美精品videosex极品1| 日韩视频精品在线| 一区二区三区视频免费| 国产一区二区香蕉| 日本一本a高清免费不卡| zzijzzij亚洲日本成熟少妇| 色狠狠av一区二区三区香蕉蜜桃| 久久人人97超碰精品888| 亚洲一区二区日本| 青青a在线精品免费观看| 情事1991在线| 国产精品99免视看9| 少妇高潮久久久久久潘金莲| 亚洲直播在线一区| 琪琪第一精品导航| 亚洲最大的av网站| 亚洲成人免费在线视频| 国产+人+亚洲| 亚洲人成电影在线观看天堂色| 国产精品自产拍在线观看中文| 亚洲国产一区二区三区四区| 日本成人在线视频网址| 日韩精品视频在线播放| 欧美日产国产成人免费图片| 欧美色另类天堂2015| 久久久精品一区二区| 久久久久久久国产| 青草青草久热精品视频在线网站| 原创国产精品91| 亚洲黄色成人网| 久久成人这里只有精品| 国内精品小视频在线观看| 日韩中文在线中文网在线观看| 欧美综合在线观看| 欧美国产欧美亚洲国产日韩mv天天看完整| 97在线观看免费| 欧洲一区二区视频| 在线电影av不卡网址| 69**夜色精品国产69乱| 国产999精品久久久影片官网| 日韩专区中文字幕| 亚洲人成欧美中文字幕| 欧美日本高清一区| 久久精品青青大伊人av| 黑人巨大精品欧美一区二区| 国产精品中文字幕在线观看| 久久这里只有精品99| 亚洲精品xxxx| 成人黄色短视频在线观看| 欧美激情影音先锋| 国产精品揄拍一区二区| 92国产精品久久久久首页| 亚洲日本中文字幕免费在线不卡| 国产成人一区二区在线| 欧美另类99xxxxx| 欧美中文字幕视频| 欧美精品videos| 国产一区二区三区在线观看视频| 欧美国产日韩在线| 久久深夜福利免费观看| 在线观看视频亚洲| 亚洲人成在线观看网站高清| 中文字幕一区二区精品| 久久综合国产精品台湾中文娱乐网| 欧美精品一区在线播放| 成人欧美一区二区三区黑人孕妇| 91在线观看免费观看| 久久精品国产96久久久香蕉| 91国产视频在线| 日韩av电影手机在线观看| 精品亚洲aⅴ在线观看| 国产福利视频一区| 正在播放欧美一区| 欧美亚洲在线观看| 日本不卡高字幕在线2019| 欧美日韩国产区| 国产精品xxx视频| 欧美激情中文网| 欧美电影在线观看| 欧美日韩亚洲激情| 亚洲a成v人在线观看| 久久久久久有精品国产| 久久久国产精品视频| 欧美成人自拍视频| 日本成人免费在线| 欧美一区二区三区四区在线| 亚洲国产日韩欧美在线动漫| 久久综合久久八八| 超碰精品一区二区三区乱码| 久久久人成影片一区二区三区观看| 久久久久久久久久av| 日韩最新免费不卡| 91久久精品视频| 日韩成人av在线| 国产精品成人免费视频| 欧美高清视频在线播放| 色久欧美在线视频观看| 欧美精品亚州精品| 欧美午夜影院在线视频| 亚洲自拍中文字幕| 成人精品一区二区三区电影免费| 国产99视频精品免视看7| 免费不卡欧美自拍视频| 国产精品91视频| 中文字幕av一区中文字幕天堂| 国产亚洲精品一区二区| 国产精彩精品视频| 日韩美女视频在线观看| 日本精品va在线观看| 欧美专区在线播放| 久久久久久久91| 精品国产一区二区三区久久狼5月| 国精产品一区一区三区有限在线| 国产精品第2页| 亚洲大胆美女视频| 日韩av在线看| 狠狠躁夜夜躁人人爽天天天天97| 欧美中文在线观看| 欧美激情成人在线视频| zzjj国产精品一区二区| 97av在线视频免费播放| 日本最新高清不卡中文字幕| 午夜精品视频网站| 国产成人福利视频| 69**夜色精品国产69乱| 欧美激情视频一区二区三区不卡| 国产精品久久综合av爱欲tv| 51午夜精品视频| 欧美电影免费观看电视剧大全| 北条麻妃一区二区在线观看| 亚洲福利小视频| 九九精品在线播放| 九九久久久久99精品| 日韩精品视频免费| 韩剧1988在线观看免费完整版| 久久偷看各类女兵18女厕嘘嘘| 成人欧美一区二区三区黑人孕妇| 久久激情五月丁香伊人| 国产视频在线一区二区| 国产v综合ⅴ日韩v欧美大片| 午夜精品久久久久久99热| 国产日韩av在线播放| 国产精品免费久久久久久| 中文字幕日韩av综合精品| 亚洲最大福利网| 亚洲黄色在线看| 日韩欧美在线字幕| 91a在线视频| 中文字幕av一区二区| 亚洲午夜女主播在线直播| 国产亚洲精品综合一区91| 欧美一区亚洲一区| 日韩中文字幕欧美| 亚洲天堂成人在线| 日本成人激情视频| 欧美日韩成人在线观看| 国产精品91在线| 国产日韩精品电影|