Exemplo n.º 1
0
        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
            });
        }
Exemplo n.º 2
0
 public static int GetFreq(string key) => _trie.GetOrDefault(key);
Exemplo n.º 3
0
 public static WordAttr GetAttr(string key) => _trie.GetOrDefault(key);
Exemplo n.º 4
0
 public static string Get(string key) => _trie.GetOrDefault(key);
Exemplo n.º 5
0
        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);
        }