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

Commit 75322cec authored by Satoshi Kataoka's avatar Satoshi Kataoka
Browse files

Support terminal insertion error correction

Bug: 9421356

Change-Id: I19685763ca487b5636019d62e150708c63ce6fc2
parent 058f37f8
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -381,6 +381,7 @@ typedef enum {
    CT_TRANSPOSITION,
    CT_COMPLETION,
    CT_TERMINAL,
    CT_TERMINAL_INSERTION,
    // Create new word with space omission
    CT_NEW_WORD_SPACE_OMITTION,
    // Create new word with space substitution
+8 −1
Original line number Diff line number Diff line
@@ -31,6 +31,7 @@
#define PROF_TRANSPOSITION(profiler) profiler.profTransposition()
#define PROF_NEARESTKEY(profiler) profiler.profNearestKey()
#define PROF_TERMINAL(profiler) profiler.profTerminal()
#define PROF_TERMINAL_INSERTION(profiler) profiler.profTerminalInsertion()
#define PROF_NEW_WORD(profiler) profiler.profNewWord()
#define PROF_NEW_WORD_BIGRAM(profiler) profiler.profNewWordBigram()
#define PROF_NODE_RESET(profiler) profiler.reset()
@@ -47,6 +48,7 @@
#define PROF_TRANSPOSITION(profiler)
#define PROF_NEARESTKEY(profiler)
#define PROF_TERMINAL(profiler)
#define PROF_TERMINAL_INSERTION(profiler)
#define PROF_NEW_WORD(profiler)
#define PROF_NEW_WORD_BIGRAM(profiler)
#define PROF_NODE_RESET(profiler)
@@ -62,7 +64,7 @@ class DicNodeProfiler {
            : mProfOmission(0), mProfInsertion(0), mProfTransposition(0),
              mProfAdditionalProximity(0), mProfSubstitution(0),
              mProfSpaceSubstitution(0), mProfSpaceOmission(0),
              mProfMatch(0), mProfCompletion(0), mProfTerminal(0),
              mProfMatch(0), mProfCompletion(0), mProfTerminal(0), mProfTerminalInsertion(0),
              mProfNearestKey(0), mProfNewWord(0), mProfNewWordBigram(0) {}

    int mProfOmission;
@@ -75,6 +77,7 @@ class DicNodeProfiler {
    int mProfMatch;
    int mProfCompletion;
    int mProfTerminal;
    int mProfTerminalInsertion;
    int mProfNearestKey;
    int mProfNewWord;
    int mProfNewWordBigram;
@@ -123,6 +126,10 @@ class DicNodeProfiler {
        ++mProfTerminal;
    }

    void profTerminalInsertion() {
        ++mProfTerminalInsertion;
    }

    void profNewWord() {
        ++mProfNewWord;
    }
+13 −4
Original line number Diff line number Diff line
@@ -50,6 +50,9 @@ static inline void profile(const CorrectionType correctionType, DicNode *const n
    case CT_TERMINAL:
        PROF_TERMINAL(node->mProfiler);
        return;
    case CT_TERMINAL_INSERTION:
        PROF_TERMINAL_INSERTION(node->mProfiler);
        return;
    case CT_NEW_WORD_SPACE_SUBSTITUTION:
        PROF_SPACE_SUBSTITUTION(node->mProfiler);
        return;
@@ -113,6 +116,8 @@ static inline void profile(const CorrectionType correctionType, DicNode *const n
        return weighting->getCompletionCost(traverseSession, dicNode);
    case CT_TERMINAL:
        return weighting->getTerminalSpatialCost(traverseSession, dicNode);
    case CT_TERMINAL_INSERTION:
        return weighting->getTerminalInsertionCost(traverseSession, dicNode);
    case CT_NEW_WORD_SPACE_SUBSTITUTION:
        return weighting->getSpaceSubstitutionCost(traverseSession, dicNode);
    case CT_INSERTION:
@@ -146,6 +151,8 @@ static inline void profile(const CorrectionType correctionType, DicNode *const n
                        traverseSession->getBinaryDictionaryInfo(), dicNode, multiBigramMap);
        return weighting->getTerminalLanguageCost(traverseSession, dicNode, languageImprobability);
    }
    case CT_TERMINAL_INSERTION:
        return 0.0f;
    case CT_NEW_WORD_SPACE_SUBSTITUTION:
        return weighting->getNewWordBigramLanguageCost(
                traverseSession, parentDicNode, multiBigramMap);
@@ -163,9 +170,9 @@ static inline void profile(const CorrectionType correctionType, DicNode *const n
        case CT_OMISSION:
            return 0;
        case CT_ADDITIONAL_PROXIMITY:
            return 0;
            return 0; /* 0 because CT_MATCH will be called */
        case CT_SUBSTITUTION:
            return 0;
            return 0; /* 0 because CT_MATCH will be called */
        case CT_NEW_WORD_SPACE_OMITTION:
            return 0;
        case CT_MATCH:
@@ -174,12 +181,14 @@ static inline void profile(const CorrectionType correctionType, DicNode *const n
            return 1;
        case CT_TERMINAL:
            return 0;
        case CT_TERMINAL_INSERTION:
            return 1;
        case CT_NEW_WORD_SPACE_SUBSTITUTION:
            return 1;
        case CT_INSERTION:
            return 2;
            return 2; /* look ahead + skip the current char */
        case CT_TRANSPOSITION:
            return 2;
            return 2; /* look ahead + skip the current char */
        default:
            return 0;
    }
+4 −0
Original line number Diff line number Diff line
@@ -67,6 +67,10 @@ class Weighting {
            const DicTraverseSession *const traverseSession,
            const DicNode *const dicNode) const = 0;

    virtual float getTerminalInsertionCost(
            const DicTraverseSession *const traverseSession,
            const DicNode *const dicNode) const = 0;

    virtual float getTerminalLanguageCost(
            const DicTraverseSession *const traverseSession, const DicNode *const dicNode,
            float dicNodeLanguageImprobability) const = 0;
+5 −5
Original line number Diff line number Diff line
@@ -365,17 +365,17 @@ void Suggest::processTerminalDicNode(
    if (!dicNode->isTerminalWordNode()) {
        return;
    }
    if (TRAVERSAL->needsToTraverseAllUserInput()
            && dicNode->getInputIndex(0) < traverseSession->getInputSize()) {
        return;
    }

    if (dicNode->shouldBeFilterdBySafetyNetForBigram()) {
        return;
    }
    // Create a non-cached node here.
    DicNode terminalDicNode;
    DicNodeUtils::initByCopy(dicNode, &terminalDicNode);
    if (TRAVERSAL->needsToTraverseAllUserInput()
            && dicNode->getInputIndex(0) < traverseSession->getInputSize()) {
        Weighting::addCostAndForwardInputIndex(WEIGHTING, CT_TERMINAL_INSERTION, traverseSession, 0,
                &terminalDicNode, traverseSession->getMultiBigramMap());
    }
    Weighting::addCostAndForwardInputIndex(WEIGHTING, CT_TERMINAL, traverseSession, 0,
            &terminalDicNode, traverseSession->getMultiBigramMap());
    traverseSession->getDicTraverseCache()->copyPushTerminal(&terminalDicNode);
Loading