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 {
|
||||
private static final boolean DBG = LatinImeLogger.sDBG;
|
||||
private static final String TAG = AutoCorrection.class.getSimpleName();
|
||||
private static final int MINIMUM_SAFETY_NET_CHAR_LENGTH = 4;
|
||||
|
||||
private AutoCorrection() {
|
||||
// Purely static class: can't instantiate.
|
||||
@ -113,4 +114,36 @@ public class AutoCorrection {
|
||||
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.text.TextUtils;
|
||||
import android.util.Log;
|
||||
|
||||
import com.android.inputmethod.keyboard.Keyboard;
|
||||
import com.android.inputmethod.keyboard.ProximityInfo;
|
||||
@ -58,8 +57,6 @@ public class Suggest {
|
||||
// Locale used for upper- and title-casing words
|
||||
final private Locale mLocale;
|
||||
|
||||
private static final int MINIMUM_SAFETY_NET_CHAR_LENGTH = 4;
|
||||
|
||||
public Suggest(final Context context, final Locale locale) {
|
||||
initAsynchronously(context, locale);
|
||||
mLocale = locale;
|
||||
@ -244,7 +241,7 @@ public class Suggest {
|
||||
hasAutoCorrection = false;
|
||||
} else if (AutoCorrection.suggestionExceedsAutoCorrectionThreshold(suggestionsSet.first(),
|
||||
consideredWord, mAutoCorrectionThreshold)) {
|
||||
hasAutoCorrection = !shouldBlockAutoCorrectionBySafetyNet(typedWord,
|
||||
hasAutoCorrection = !AutoCorrection.shouldBlockAutoCorrectionBySafetyNet(typedWord,
|
||||
suggestionsSet.first().mWord);
|
||||
} else {
|
||||
hasAutoCorrection = false;
|
||||
@ -365,37 +362,4 @@ public class Suggest {
|
||||
}
|
||||
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.PointerTracker;
|
||||
import com.android.inputmethod.keyboard.ViewLayoutUtils;
|
||||
import com.android.inputmethod.latin.AutoCorrection;
|
||||
import com.android.inputmethod.latin.LatinImeLogger;
|
||||
import com.android.inputmethod.latin.R;
|
||||
import com.android.inputmethod.latin.ResearchLogger;
|
||||
import com.android.inputmethod.latin.StaticInnerHandlerWrapper;
|
||||
import com.android.inputmethod.latin.Suggest;
|
||||
import com.android.inputmethod.latin.SuggestedWords;
|
||||
import com.android.inputmethod.latin.Utils;
|
||||
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 we auto-correct, then the autocorrection is in slot 0 and the typed word
|
||||
// is in slot 1.
|
||||
if (index == mCenterSuggestionIndex && Suggest.shouldBlockAutoCorrectionBySafetyNet(
|
||||
suggestedWords.getWord(1).toString(), suggestedWords.getWord(0))) {
|
||||
if (index == mCenterSuggestionIndex
|
||||
&& AutoCorrection.shouldBlockAutoCorrectionBySafetyNet(
|
||||
suggestedWords.getWord(1).toString(), suggestedWords.getWord(0))) {
|
||||
return 0xFFFF0000;
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user