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)); }