private Tuple <int[, ], int> ViterbiCore(string sentence)
        {
            int len    = sentence.Length;
            var weight = new double[len, 4];
            var path   = new int[len, 4];

            for (int i = 0; i < len; i++)
            {
                if (i == 0)
                {
                    for (int j = 0; j < 4; j++)
                    {
                        weight[i, j] = HiddenMarkovModel.GetInitProb(j, sentence[i]);
                    }
                    continue;
                }
                for (int j = 0; j < 4; j++)
                {
                    weight[i, j] = Helper.MinValue;
                    path[i, j]   = -1;
                    for (int k = 0; k < 4; k++)
                    {
                        double tmp = weight[i - 1, k] + HiddenMarkovModel.GetNextProb(k, j, sentence[i]);
                        if (tmp > weight[i, j])
                        {
                            weight[i, j] = tmp;
                            path[i, j]   = k;
                        }
                    }
                }
            }
            return(new Tuple <int[, ], int>(path, weight[len - 1, 1] >= weight[len - 1, 3] ? 1 : 3));
        }