Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 1d3058da authored by Keisuke Kuroyanagi's avatar Keisuke Kuroyanagi Committed by Android (Google) Code Review
Browse files

Merge "Don't boost exact matches for personalized dicts."

parents 23c48751 54622d38
Loading
Loading
Loading
Loading
+6 −4
Original line number Diff line number Diff line
@@ -78,7 +78,8 @@ const int SuggestionsOutputUtils::MIN_LEN_FOR_MULTI_WORD_AUTOCORRECT = 16;
        outputAutoCommitFirstWordConfidence[0] =
                computeFirstWordConfidence(&terminals[0]);
    }

    const bool boostExactMatches = traverseSession->getDictionaryStructurePolicy()->
            getHeaderStructurePolicy()->shouldBoostExactMatches();
    // Output suggestion results here
    for (int terminalIndex = 0; terminalIndex < terminalSize && outputWordIndex < MAX_RESULTS;
            ++terminalIndex) {
@@ -102,7 +103,7 @@ const int SuggestionsOutputUtils::MIN_LEN_FOR_MULTI_WORD_AUTOCORRECT = 16;
                && !(isPossiblyOffensiveWord && isFirstCharUppercase);
        const int outputTypeFlags =
                (isPossiblyOffensiveWord ? Dictionary::KIND_FLAG_POSSIBLY_OFFENSIVE : 0)
                | (isSafeExactMatch ? Dictionary::KIND_FLAG_EXACT_MATCH : 0);
                | ((isSafeExactMatch && boostExactMatches) ? Dictionary::KIND_FLAG_EXACT_MATCH : 0);

        // Entries that are blacklisted or do not represent a word should not be output.
        const bool isValidWord = !terminalDicNode->isBlacklistedOrNotAWord();
@@ -113,7 +114,8 @@ const int SuggestionsOutputUtils::MIN_LEN_FOR_MULTI_WORD_AUTOCORRECT = 16;
                compoundDistance, traverseSession->getInputSize(),
                terminalDicNode->getContainedErrorTypes(),
                (forceCommitMultiWords && terminalDicNode->hasMultipleWords())
                         || (isValidWord && scoringPolicy->doesAutoCorrectValidWord()));
                         || (isValidWord && scoringPolicy->doesAutoCorrectValidWord()),
                boostExactMatches);
        if (maxScore < finalScore && isValidWord) {
            maxScore = finalScore;
        }
@@ -147,7 +149,7 @@ const int SuggestionsOutputUtils::MIN_LEN_FOR_MULTI_WORD_AUTOCORRECT = 16;
                     scoringPolicy->calculateFinalScore(compoundDistance,
                             traverseSession->getInputSize(),
                             terminalDicNode->getContainedErrorTypes(),
                             true /* forceCommit */) : finalScore;
                             true /* forceCommit */, boostExactMatches) : finalScore;
            const int updatedOutputWordIndex = outputShortcuts(&shortcutIt,
                    outputWordIndex, shortcutBaseScore, outputCodePoints, frequencies, outputTypes,
                    sameAsTyped);
+2 −0
Original line number Diff line number Diff line
@@ -40,6 +40,8 @@ class DictionaryHeaderStructurePolicy {
    virtual void readHeaderValueOrQuestionMark(const char *const key, int *outValue,
            int outValueSize) const = 0;

    virtual bool shouldBoostExactMatches() const = 0;

 protected:
    DictionaryHeaderStructurePolicy() {}

+2 −1
Original line number Diff line number Diff line
@@ -28,7 +28,8 @@ class DicTraverseSession;
class Scoring {
 public:
    virtual int calculateFinalScore(const float compoundDistance, const int inputSize,
            const ErrorTypeUtils::ErrorType containedErrorTypes, const bool forceCommit) const = 0;
            const ErrorTypeUtils::ErrorType containedErrorTypes, const bool forceCommit,
            const bool boostExactMatches) const = 0;
    virtual bool getMostProbableString(const DicTraverseSession *const traverseSession,
            const int terminalSize, const float languageWeight, int *const outputCodePoints,
            int *const type, int *const freq) const = 0;
+5 −0
Original line number Diff line number Diff line
@@ -146,6 +146,11 @@ class HeaderPolicy : public DictionaryHeaderStructurePolicy {
        return mHasHistoricalInfoOfWords;
    }

    AK_FORCE_INLINE bool shouldBoostExactMatches() const {
        // TODO: Investigate better ways to handle exact matches for personalized dictionaries.
        return !isDecayingDict();
    }

    void readHeaderValueOrQuestionMark(const char *const key,
            int *outValue, int outValueSize) const;

+2 −2
Original line number Diff line number Diff line
@@ -50,14 +50,14 @@ class TypingScoring : public Scoring {

    AK_FORCE_INLINE int calculateFinalScore(const float compoundDistance,
            const int inputSize, const ErrorTypeUtils::ErrorType containedErrorTypes,
            const bool forceCommit) const {
            const bool forceCommit, const bool boostExactMatches) const {
        const float maxDistance = ScoringParams::DISTANCE_WEIGHT_LANGUAGE
                + static_cast<float>(inputSize) * ScoringParams::TYPING_MAX_OUTPUT_SCORE_PER_INPUT;
        float score = ScoringParams::TYPING_BASE_OUTPUT_SCORE - compoundDistance / maxDistance;
        if (forceCommit) {
            score += ScoringParams::AUTOCORRECT_OUTPUT_THRESHOLD;
        }
        if (ErrorTypeUtils::isExactMatch(containedErrorTypes)) {
        if (boostExactMatches && ErrorTypeUtils::isExactMatch(containedErrorTypes)) {
            score += ScoringParams::EXACT_MATCH_PROMOTION;
            if ((ErrorTypeUtils::MATCH_WITH_CASE_ERROR & containedErrorTypes) != 0) {
                score -= ScoringParams::CASE_ERROR_PENALTY_FOR_EXACT_MATCH;