From b179199830d198473154cfe56b3d712966a16c6f Mon Sep 17 00:00:00 2001 From: Keisuke Kuroynagi Date: Mon, 22 Jul 2013 22:05:16 +0900 Subject: [PATCH] Fix: huge bigram costs for blacklisted words. Bug: 8844931 Change-Id: I523005c5ed9a3d401a67b0e4e1c3ff2e4574e6df --- native/jni/src/suggest/core/dicnode/dic_node.h | 10 +++++++--- native/jni/src/suggest/core/dicnode/dic_node_utils.cpp | 2 +- .../jni/src/suggest/policyimpl/typing/typing_scoring.h | 8 ++++---- 3 files changed, 12 insertions(+), 8 deletions(-) diff --git a/native/jni/src/suggest/core/dicnode/dic_node.h b/native/jni/src/suggest/core/dicnode/dic_node.h index 808d2a6cd..e22e999f2 100644 --- a/native/jni/src/suggest/core/dicnode/dic_node.h +++ b/native/jni/src/suggest/core/dicnode/dic_node.h @@ -213,14 +213,18 @@ class DicNode { return mDicNodeState.mDicNodeStateOutput.getCodePointAt(getNodeCodePointCount()); } - bool isImpossibleBigramWord() const { + // Check if the current word and the previous word can be considered as a valid multiple word + // suggestion. + bool isValidMultipleWordSuggestion() const { if (isBlacklistedOrNotAWord()) { - return true; + return false; } + // Treat suggestion as invalid if the current and the previous word are single character + // words. const int prevWordLen = mDicNodeState.mDicNodeStatePrevWord.getPrevWordLength() - mDicNodeState.mDicNodeStatePrevWord.getPrevWordStart() - 1; const int currentWordLen = getNodeCodePointCount(); - return (prevWordLen == 1 && currentWordLen == 1); + return (prevWordLen != 1 || currentWordLen != 1); } bool isFirstCharUppercase() const { diff --git a/native/jni/src/suggest/core/dicnode/dic_node_utils.cpp b/native/jni/src/suggest/core/dicnode/dic_node_utils.cpp index 8b6f45599..071344296 100644 --- a/native/jni/src/suggest/core/dicnode/dic_node_utils.cpp +++ b/native/jni/src/suggest/core/dicnode/dic_node_utils.cpp @@ -159,7 +159,7 @@ namespace latinime { /* static */ float DicNodeUtils::getBigramNodeImprobability( const BinaryDictionaryInfo *const binaryDictionaryInfo, const DicNode *const node, MultiBigramMap *multiBigramMap) { - if (node->isImpossibleBigramWord()) { + if (node->hasMultipleWords() && !node->isValidMultipleWordSuggestion()) { return static_cast(MAX_VALUE_FOR_WEIGHTING); } const int probability = getBigramNodeProbability(binaryDictionaryInfo, node, multiBigramMap); diff --git a/native/jni/src/suggest/policyimpl/typing/typing_scoring.h b/native/jni/src/suggest/policyimpl/typing/typing_scoring.h index 90e2133e7..56ffcc93e 100644 --- a/native/jni/src/suggest/policyimpl/typing/typing_scoring.h +++ b/native/jni/src/suggest/policyimpl/typing/typing_scoring.h @@ -55,10 +55,10 @@ class TypingScoring : public Scoring { const int inputSize, const bool forceCommit) const { const float maxDistance = ScoringParams::DISTANCE_WEIGHT_LANGUAGE + static_cast(inputSize) * ScoringParams::TYPING_MAX_OUTPUT_SCORE_PER_INPUT; - return static_cast((ScoringParams::TYPING_BASE_OUTPUT_SCORE - - (compoundDistance / maxDistance) - + (forceCommit ? ScoringParams::AUTOCORRECT_OUTPUT_THRESHOLD : 0.0f)) - * SUGGEST_INTERFACE_OUTPUT_SCALE); + const float score = ScoringParams::TYPING_BASE_OUTPUT_SCORE + - compoundDistance / maxDistance + + (forceCommit ? ScoringParams::AUTOCORRECT_OUTPUT_THRESHOLD : 0.0f); + return static_cast(score * SUGGEST_INTERFACE_OUTPUT_SCALE); } AK_FORCE_INLINE float getDoubleLetterDemotionDistanceCost(const int terminalIndex,