public double getPossibility(int key, int prev, int cur) {
    double result = 0;

    int curIndex = Utility.binarySearch(cur, symbolTable);
    int prevIndex = Utility.binarySearch(prev, symbolTable);

    TagContext tc = getItem(key);

    // return a lower value, not 0 to prevent data sparse
    if (tc == null
        || curIndex == -1
        || prevIndex == -1
        || tc.getContextArray()[prevIndex][curIndex] == 0
        || tc.getTagFreq()[prevIndex] == 0) return 0.000001;

    int prevCurConFreq = tc.getContextArray()[prevIndex][curIndex];
    int prevFreq = tc.getTagFreq()[prevIndex];

    // 0.9 and 0.1 is a value based experience
    result = 0.9 * prevCurConFreq;
    result /= prevFreq;
    result += 0.1 * prevFreq / tc.getTotalFreq();

    return result;
  }
  public int getFreq(int key, int symbol) {
    TagContext tc = getItem(key);
    if (tc == null) return 0;

    int index = Utility.binarySearch(symbol, symbolTable);
    if (index == -1) // error finding the symbol
    return 0;

    // Add the frequency
    int frequency = 0;
    if (tc.getTagFreq() != null) frequency = tc.getTagFreq()[index];
    return frequency;
  }