mirror of
https://gitlab.futo.org/keyboard/latinime.git
synced 2024-09-28 14:54:30 +01:00
Move the safety net function to AutoCorrection (A44)
Change-Id: Iec791d061f237f60992dd6048c4a37b46f4cb9aa
This commit is contained in:
parent
accd63f35f
commit
f72b8f5662
@ -26,6 +26,7 @@ import java.util.concurrent.ConcurrentHashMap;
|
|||||||
public class AutoCorrection {
|
public class AutoCorrection {
|
||||||
private static final boolean DBG = LatinImeLogger.sDBG;
|
private static final boolean DBG = LatinImeLogger.sDBG;
|
||||||
private static final String TAG = AutoCorrection.class.getSimpleName();
|
private static final String TAG = AutoCorrection.class.getSimpleName();
|
||||||
|
private static final int MINIMUM_SAFETY_NET_CHAR_LENGTH = 4;
|
||||||
|
|
||||||
private AutoCorrection() {
|
private AutoCorrection() {
|
||||||
// Purely static class: can't instantiate.
|
// Purely static class: can't instantiate.
|
||||||
@ -113,4 +114,36 @@ public class AutoCorrection {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO: Resolve the inconsistencies between the native auto correction algorithms and
|
||||||
|
// this safety net
|
||||||
|
public static boolean shouldBlockAutoCorrectionBySafetyNet(final String typedWord,
|
||||||
|
final CharSequence suggestion) {
|
||||||
|
// Safety net for auto correction.
|
||||||
|
// Actually if we hit this safety net, it's a bug.
|
||||||
|
// If user selected aggressive auto correction mode, there is no need to use the safety
|
||||||
|
// net.
|
||||||
|
// If the length of typed word is less than MINIMUM_SAFETY_NET_CHAR_LENGTH,
|
||||||
|
// we should not use net because relatively edit distance can be big.
|
||||||
|
final int typedWordLength = typedWord.length();
|
||||||
|
if (typedWordLength < MINIMUM_SAFETY_NET_CHAR_LENGTH) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
final int maxEditDistanceOfNativeDictionary =
|
||||||
|
(typedWordLength < 5 ? 2 : typedWordLength / 2) + 1;
|
||||||
|
final int distance = BinaryDictionary.editDistance(typedWord, suggestion.toString());
|
||||||
|
if (DBG) {
|
||||||
|
Log.d(TAG, "Autocorrected edit distance = " + distance
|
||||||
|
+ ", " + maxEditDistanceOfNativeDictionary);
|
||||||
|
}
|
||||||
|
if (distance > maxEditDistanceOfNativeDictionary) {
|
||||||
|
if (DBG) {
|
||||||
|
Log.e(TAG, "Safety net: before = " + typedWord + ", after = " + suggestion);
|
||||||
|
Log.e(TAG, "(Error) The edit distance of this correction exceeds limit. "
|
||||||
|
+ "Turning off auto-correction.");
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -18,7 +18,6 @@ package com.android.inputmethod.latin;
|
|||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.text.TextUtils;
|
import android.text.TextUtils;
|
||||||
import android.util.Log;
|
|
||||||
|
|
||||||
import com.android.inputmethod.keyboard.Keyboard;
|
import com.android.inputmethod.keyboard.Keyboard;
|
||||||
import com.android.inputmethod.keyboard.ProximityInfo;
|
import com.android.inputmethod.keyboard.ProximityInfo;
|
||||||
@ -58,8 +57,6 @@ public class Suggest {
|
|||||||
// Locale used for upper- and title-casing words
|
// Locale used for upper- and title-casing words
|
||||||
final private Locale mLocale;
|
final private Locale mLocale;
|
||||||
|
|
||||||
private static final int MINIMUM_SAFETY_NET_CHAR_LENGTH = 4;
|
|
||||||
|
|
||||||
public Suggest(final Context context, final Locale locale) {
|
public Suggest(final Context context, final Locale locale) {
|
||||||
initAsynchronously(context, locale);
|
initAsynchronously(context, locale);
|
||||||
mLocale = locale;
|
mLocale = locale;
|
||||||
@ -244,7 +241,7 @@ public class Suggest {
|
|||||||
hasAutoCorrection = false;
|
hasAutoCorrection = false;
|
||||||
} else if (AutoCorrection.suggestionExceedsAutoCorrectionThreshold(suggestionsSet.first(),
|
} else if (AutoCorrection.suggestionExceedsAutoCorrectionThreshold(suggestionsSet.first(),
|
||||||
consideredWord, mAutoCorrectionThreshold)) {
|
consideredWord, mAutoCorrectionThreshold)) {
|
||||||
hasAutoCorrection = !shouldBlockAutoCorrectionBySafetyNet(typedWord,
|
hasAutoCorrection = !AutoCorrection.shouldBlockAutoCorrectionBySafetyNet(typedWord,
|
||||||
suggestionsSet.first().mWord);
|
suggestionsSet.first().mWord);
|
||||||
} else {
|
} else {
|
||||||
hasAutoCorrection = false;
|
hasAutoCorrection = false;
|
||||||
@ -365,37 +362,4 @@ public class Suggest {
|
|||||||
}
|
}
|
||||||
mMainDictionary = null;
|
mMainDictionary = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: Resolve the inconsistencies between the native auto correction algorithms and
|
|
||||||
// this safety net
|
|
||||||
public static boolean shouldBlockAutoCorrectionBySafetyNet(final String typedWord,
|
|
||||||
final CharSequence suggestion) {
|
|
||||||
// Safety net for auto correction.
|
|
||||||
// Actually if we hit this safety net, it's a bug.
|
|
||||||
// If user selected aggressive auto correction mode, there is no need to use the safety
|
|
||||||
// net.
|
|
||||||
// If the length of typed word is less than MINIMUM_SAFETY_NET_CHAR_LENGTH,
|
|
||||||
// we should not use net because relatively edit distance can be big.
|
|
||||||
final int typedWordLength = typedWord.length();
|
|
||||||
if (typedWordLength < Suggest.MINIMUM_SAFETY_NET_CHAR_LENGTH) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
final int maxEditDistanceOfNativeDictionary =
|
|
||||||
(typedWordLength < 5 ? 2 : typedWordLength / 2) + 1;
|
|
||||||
final int distance = BinaryDictionary.editDistance(typedWord, suggestion.toString());
|
|
||||||
if (DBG) {
|
|
||||||
Log.d(TAG, "Autocorrected edit distance = " + distance
|
|
||||||
+ ", " + maxEditDistanceOfNativeDictionary);
|
|
||||||
}
|
|
||||||
if (distance > maxEditDistanceOfNativeDictionary) {
|
|
||||||
if (DBG) {
|
|
||||||
Log.e(TAG, "Safety net: before = " + typedWord + ", after = " + suggestion);
|
|
||||||
Log.e(TAG, "(Error) The edit distance of this correction exceeds limit. "
|
|
||||||
+ "Turning off auto-correction.");
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
} else {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -57,11 +57,11 @@ import com.android.inputmethod.keyboard.KeyboardView;
|
|||||||
import com.android.inputmethod.keyboard.MoreKeysPanel;
|
import com.android.inputmethod.keyboard.MoreKeysPanel;
|
||||||
import com.android.inputmethod.keyboard.PointerTracker;
|
import com.android.inputmethod.keyboard.PointerTracker;
|
||||||
import com.android.inputmethod.keyboard.ViewLayoutUtils;
|
import com.android.inputmethod.keyboard.ViewLayoutUtils;
|
||||||
|
import com.android.inputmethod.latin.AutoCorrection;
|
||||||
import com.android.inputmethod.latin.LatinImeLogger;
|
import com.android.inputmethod.latin.LatinImeLogger;
|
||||||
import com.android.inputmethod.latin.R;
|
import com.android.inputmethod.latin.R;
|
||||||
import com.android.inputmethod.latin.ResearchLogger;
|
import com.android.inputmethod.latin.ResearchLogger;
|
||||||
import com.android.inputmethod.latin.StaticInnerHandlerWrapper;
|
import com.android.inputmethod.latin.StaticInnerHandlerWrapper;
|
||||||
import com.android.inputmethod.latin.Suggest;
|
|
||||||
import com.android.inputmethod.latin.SuggestedWords;
|
import com.android.inputmethod.latin.SuggestedWords;
|
||||||
import com.android.inputmethod.latin.Utils;
|
import com.android.inputmethod.latin.Utils;
|
||||||
import com.android.inputmethod.latin.define.ProductionFlag;
|
import com.android.inputmethod.latin.define.ProductionFlag;
|
||||||
@ -336,8 +336,9 @@ public class SuggestionsView extends RelativeLayout implements OnClickListener,
|
|||||||
if (LatinImeLogger.sDBG && suggestedWords.size() > 1) {
|
if (LatinImeLogger.sDBG && suggestedWords.size() > 1) {
|
||||||
// If we auto-correct, then the autocorrection is in slot 0 and the typed word
|
// If we auto-correct, then the autocorrection is in slot 0 and the typed word
|
||||||
// is in slot 1.
|
// is in slot 1.
|
||||||
if (index == mCenterSuggestionIndex && Suggest.shouldBlockAutoCorrectionBySafetyNet(
|
if (index == mCenterSuggestionIndex
|
||||||
suggestedWords.getWord(1).toString(), suggestedWords.getWord(0))) {
|
&& AutoCorrection.shouldBlockAutoCorrectionBySafetyNet(
|
||||||
|
suggestedWords.getWord(1).toString(), suggestedWords.getWord(0))) {
|
||||||
return 0xFFFF0000;
|
return 0xFFFF0000;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user