diff options
author | 2010-06-30 20:28:04 -0700 | |
---|---|---|
committer | 2010-07-13 11:33:39 -0700 | |
commit | 937d5ad0131267aa4273f3e5d75b203a1f263c18 (patch) | |
tree | b4a3bb6206aea92f5bacc3ebc1387ffdd5916f0c /java/src/com/android/inputmethod/latin/BinaryDictionary.java | |
parent | b71547f2d065a17b268d1dbc896daab1820141a6 (diff) | |
download | latinime-937d5ad0131267aa4273f3e5d75b203a1f263c18.tar.gz latinime-937d5ad0131267aa4273f3e5d75b203a1f263c18.tar.xz latinime-937d5ad0131267aa4273f3e5d75b203a1f263c18.zip |
added bigram prediction
- after first character, only suggests bigram data (but doesn't autocomplete)
- after second character, words from dictionary gets rearranged by using bigram
- compatible with old dictionary
- added preference option to disable bigram
Change-Id: Ia8f4e8fa55e797e86d858fd499887cd396388411
Diffstat (limited to 'java/src/com/android/inputmethod/latin/BinaryDictionary.java')
-rw-r--r-- | java/src/com/android/inputmethod/latin/BinaryDictionary.java | 34 |
1 files changed, 31 insertions, 3 deletions
diff --git a/java/src/com/android/inputmethod/latin/BinaryDictionary.java b/java/src/com/android/inputmethod/latin/BinaryDictionary.java index 6473f4558..8d2363012 100644 --- a/java/src/com/android/inputmethod/latin/BinaryDictionary.java +++ b/java/src/com/android/inputmethod/latin/BinaryDictionary.java @@ -33,9 +33,9 @@ import android.util.Log; public class BinaryDictionary extends Dictionary { private static final String TAG = "BinaryDictionary"; - public static final int MAX_WORD_LENGTH = 48; private static final int MAX_ALTERNATIVES = 16; private static final int MAX_WORDS = 16; + private static final int MAX_BIGRAMS = 255; // TODO Probably don't need all 255 private static final int TYPED_LETTER_MULTIPLIER = 2; private static final boolean ENABLE_MISSED_CHARACTERS = true; @@ -44,7 +44,9 @@ public class BinaryDictionary extends Dictionary { private int mDictLength; private int[] mInputCodes = new int[MAX_WORD_LENGTH * MAX_ALTERNATIVES]; private char[] mOutputChars = new char[MAX_WORD_LENGTH * MAX_WORDS]; + private char[] mOutputChars_bigrams = new char[MAX_WORD_LENGTH * MAX_BIGRAMS]; private int[] mFrequencies = new int[MAX_WORDS]; + private int[] mFrequencies_bigrams = new int[MAX_BIGRAMS]; // Keep a reference to the native dict direct buffer in Java to avoid // unexpected deallocation of the direct buffer. private ByteBuffer mNativeDictDirectBuffer; @@ -71,7 +73,7 @@ public class BinaryDictionary extends Dictionary { /** * Create a dictionary from a byte buffer. This is used for testing. * @param context application context for reading resources - * @param resId the resource containing the raw binary dictionary + * @param byteBuffer a ByteBuffer containing the binary dictionary */ public BinaryDictionary(Context context, ByteBuffer byteBuffer) { if (byteBuffer != null) { @@ -95,6 +97,8 @@ public class BinaryDictionary extends Dictionary { char[] outputChars, int[] frequencies, int maxWordLength, int maxWords, int maxAlternatives, int skipPos, int[] nextLettersFrequencies, int nextLettersSize); + private native int getBigramsNative(int nativeData, char[] prevWord, int prevWordLength, + char[] outputChars, int[] frequencies, int maxWordLength, int maxBigrams); private final void loadDictionary(Context context, int resId) { InputStream is = context.getResources().openRawResource(resId); @@ -122,6 +126,30 @@ public class BinaryDictionary extends Dictionary { } @Override + public void getBigrams(final WordComposer composer, final CharSequence previousWord, + final WordCallback callback, int[] nextLettersFrequencies) { + + char[] chars = previousWord.toString().toCharArray(); + Arrays.fill(mOutputChars_bigrams, (char) 0); + Arrays.fill(mFrequencies_bigrams, 0); + + int count = getBigramsNative(mNativeDict, chars, chars.length, mOutputChars_bigrams, + mFrequencies_bigrams, MAX_WORD_LENGTH, MAX_BIGRAMS); + for (int j = 0; j < count; j++) { + if (mFrequencies_bigrams[j] < 1) break; + int start = j * MAX_WORD_LENGTH; + int len = 0; + while (mOutputChars_bigrams[start + len] != 0) { + len++; + } + if (len > 0) { + callback.addWord(mOutputChars_bigrams, start, len, mFrequencies_bigrams[j], + DataType.BIGRAM); + } + } + } + + @Override public void getWords(final WordComposer codes, final WordCallback callback, int[] nextLettersFrequencies) { final int codesSize = codes.size(); @@ -166,7 +194,7 @@ public class BinaryDictionary extends Dictionary { len++; } if (len > 0) { - callback.addWord(mOutputChars, start, len, mFrequencies[j]); + callback.addWord(mOutputChars, start, len, mFrequencies[j], DataType.UNIGRAM); } } } |