public static AreaResult Search(string area) { if (string.IsNullOrWhiteSpace(area)) { return(null); } string key = area; var lastChar = area[area.Length - 1]; if (area.Length > 2 && "市省县区州旗盟".Contains(lastChar)) { key = area.Substring(0, area.Length - 1); var ai = _trie.GetOrDefault(key); if (ai == null) { return(null); } var tuple = ai.Match(area.Substring(area.Length - 1)); var ar = new AreaResult(); if (tuple != null) { ar.AccurateCodes = tuple.Item2; return(ar); } var newMap = new Dictionary <string, List <string> >(); foreach (var p in ai.MatchAll()) { var k = key + p.Key; newMap[k] = p.Value; } ar.Name_Codes_Map = newMap; return(ar); } var ai1 = _trie.GetOrDefault(area); if (ai1 == null) { return(null); } var newMap1 = new Dictionary <string, List <string> >(); foreach (var p in ai1.MatchAll()) { var k = key + p.Key; newMap1[k] = p.Value; } return(new AreaResult() { Name_Codes_Map = newMap1 }); }
public static int GetFreq(string key) => _trie.GetOrDefault(key);
public static WordAttr GetAttr(string key) => _trie.GetOrDefault(key);
public static string Get(string key) => _trie.GetOrDefault(key);
public byte[] Encode(string com_name) { var terms = Com_CRFSegment.Segment(com_name); var sb = new StringBuilder(com_name.Length * 8); byte count = 0; var flags = new List <char>(); for (int i = 0; i < terms.Count; i++) { var term = terms[i]; if (term.nc == NatCom.E || term.nc == NatCom.W || term.word.Any(c => c < 128)) { count += (byte)term.word.Length; foreach (var c in term.word) { sb.Append(Convert.ToString(c, 2).PadLeft(16, '0')); flags.Add('0'); } } else { var val = _dat.GetOrDefault(term.word); if (val == null) { count += (byte)term.word.Length; foreach (var c in term.word) { var temp_s = Convert.ToString(c, 2).PadLeft(16, '0'); sb.Append(temp_s /*.Substring(16)*/); flags.Add('0'); } } else { count++; sb.Append(val); flags.Add('1'); } } } if (count > 63) { throw new Exception("Length of company name is larger than 63"); } // word 数量固定占用6bit,故word数量不能超过63 // 前缀 bit 数 //var prefix_len = count + 6; var prefix_str = Convert.ToString(count, 2).PadLeft(6, '0') + new string(flags.ToArray()); // 所有的数据二进制的字符串形式 var data_str = prefix_str + sb.ToString(); // 缺少的 bit 数,填充为 8 的整数倍 var lack = data_str.Length % 8 == 0 ? 0 : 8 - (data_str.Length % 8); for (int j = 0; j < lack; j++) { data_str += "0"; } var bs = new byte[data_str.Length / 8]; for (int j = 0; j < bs.Length; j++) { bs[j] = Convert.ToByte(data_str.Substring(j * 8, 8), 2); } return(bs); }