From 1616c89bd49ed8ae197b90b614cbcccea129dcbf Mon Sep 17 00:00:00 2001 From: Lee0701 Date: Fri, 14 May 2021 11:21:01 +0900 Subject: [PATCH] Rename NormalizedDictionary to KoreanDictionary --- .../inputmethod/latin/DictionaryFactory.java | 4 +- ...dDictionary.java => KoreanDictionary.java} | 39 +++++++++++++------ 2 files changed, 30 insertions(+), 13 deletions(-) rename app/src/main/java/org/dslul/openboard/inputmethod/latin/{NormalizedDictionary.java => KoreanDictionary.java} (64%) diff --git a/app/src/main/java/org/dslul/openboard/inputmethod/latin/DictionaryFactory.java b/app/src/main/java/org/dslul/openboard/inputmethod/latin/DictionaryFactory.java index 806fa70b4..9944fb8ba 100644 --- a/app/src/main/java/org/dslul/openboard/inputmethod/latin/DictionaryFactory.java +++ b/app/src/main/java/org/dslul/openboard/inputmethod/latin/DictionaryFactory.java @@ -62,8 +62,8 @@ public final class DictionaryFactory { false /* useFullEditDistance */, locale, Dictionary.TYPE_MAIN); if (readOnlyBinaryDictionary.isValidDictionary()) { if(locale.getLanguage().equals("ko")) { - // Use normalized dictionary for Korean dictionaries - dictList.add(new NormalizedDictionary(Normalizer.Form.NFD, Normalizer.Form.NFC, readOnlyBinaryDictionary)); + // Use KoreanDictionary for Korean locale + dictList.add(new KoreanDictionary(readOnlyBinaryDictionary)); } else { dictList.add(readOnlyBinaryDictionary); } diff --git a/app/src/main/java/org/dslul/openboard/inputmethod/latin/NormalizedDictionary.java b/app/src/main/java/org/dslul/openboard/inputmethod/latin/KoreanDictionary.java similarity index 64% rename from app/src/main/java/org/dslul/openboard/inputmethod/latin/NormalizedDictionary.java rename to app/src/main/java/org/dslul/openboard/inputmethod/latin/KoreanDictionary.java index bee4bbe92..9f17573d2 100644 --- a/app/src/main/java/org/dslul/openboard/inputmethod/latin/NormalizedDictionary.java +++ b/app/src/main/java/org/dslul/openboard/inputmethod/latin/KoreanDictionary.java @@ -1,5 +1,6 @@ package org.dslul.openboard.inputmethod.latin; +import org.dslul.openboard.inputmethod.event.HangulCombiner; import org.dslul.openboard.inputmethod.latin.common.ComposedData; import org.dslul.openboard.inputmethod.latin.settings.SettingsValuesForSuggestion; @@ -10,24 +11,40 @@ import java.util.ArrayList; * For Korean dictionary, there are too many cases of characters to store on dictionary, which makes it slow. * To solve that, Unicode normalization is used to decompose Hangul syllables into Hangul jamos. */ -public class NormalizedDictionary extends Dictionary { - private final Normalizer.Form mInputForm; - private final Normalizer.Form mOutputForm; +public class KoreanDictionary extends Dictionary { + + private static final String COMPAT_JAMO = HangulCombiner.HangulJamo.COMPAT_CONSONANTS + HangulCombiner.HangulJamo.COMPAT_VOWELS; + private static final String STANDARD_JAMO = HangulCombiner.HangulJamo.CONVERT_INITIALS + HangulCombiner.HangulJamo.CONVERT_MEDIALS; + private final Dictionary mDictionary; - public NormalizedDictionary(Normalizer.Form inputForm, Normalizer.Form outputForm, Dictionary dictionary) { + + public KoreanDictionary(Dictionary dictionary) { super(dictionary.mDictType, dictionary.mLocale); - mInputForm = inputForm; - mOutputForm = outputForm; mDictionary = dictionary; } + private String processInput(String input) { + String normalized = Normalizer.normalize(input, Normalizer.Form.NFD); + StringBuilder result = new StringBuilder(); + for(char c : normalized.toCharArray()) { + int index = COMPAT_JAMO.indexOf(c); + if(index == -1) result.append(c); + else result.append(STANDARD_JAMO.charAt(index)); + } + return result.toString(); + } + + private String processOutput(String output) { + return Normalizer.normalize(output, Normalizer.Form.NFC); + } + @Override public ArrayList getSuggestions(ComposedData composedData, NgramContext ngramContext, long proximityInfoHandle, SettingsValuesForSuggestion settingsValuesForSuggestion, int sessionId, float weightForLocale, float[] inOutWeightOfLangModelVsSpatialModel) { - composedData = new ComposedData(composedData.mInputPointers, composedData.mIsBatchMode, Normalizer.normalize(composedData.mTypedWord, mInputForm)); + composedData = new ComposedData(composedData.mInputPointers, composedData.mIsBatchMode, processInput(composedData.mTypedWord)); ArrayList suggestions = mDictionary.getSuggestions(composedData, ngramContext, proximityInfoHandle, settingsValuesForSuggestion, sessionId, weightForLocale, inOutWeightOfLangModelVsSpatialModel); ArrayList result = new ArrayList<>(); for(SuggestedWords.SuggestedWordInfo info : suggestions) { - result.add(new SuggestedWords.SuggestedWordInfo(Normalizer.normalize(info.mWord, mOutputForm), info.mPrevWordsContext, + result.add(new SuggestedWords.SuggestedWordInfo(processOutput(info.mWord), info.mPrevWordsContext, info.mScore, info.mKindAndFlags, info.mSourceDict, info.mIndexOfTouchPointOfSecondWord, info.mAutoCommitFirstWordConfidence)); } return result; @@ -35,17 +52,17 @@ public class NormalizedDictionary extends Dictionary { @Override public boolean isInDictionary(String word) { - return mDictionary.isInDictionary(Normalizer.normalize(word, mInputForm)); + return mDictionary.isInDictionary(processInput(word)); } @Override public int getFrequency(String word) { - return mDictionary.getFrequency(Normalizer.normalize(word, mInputForm)); + return mDictionary.getFrequency(processInput(word)); } @Override public int getMaxFrequencyOfExactMatches(String word) { - return mDictionary.getMaxFrequencyOfExactMatches(Normalizer.normalize(word, mInputForm)); + return mDictionary.getMaxFrequencyOfExactMatches(processInput(word)); } @Override