From f35b7f3e0423933b1a74380befb8955928cb6057 Mon Sep 17 00:00:00 2001 From: ShikiSuen Date: Sun, 13 Feb 2022 23:07:31 +0800 Subject: [PATCH] Zonble: KeyHandler // Prevents the user override model to store symbols. Co-Authored-By: Weizhong Yang a.k.a zonble --- Source/Modules/ControllerModules/KeyHandler.mm | 9 +++++++-- .../Modules/LanguageParsers/Gramambular/Grid.h | 17 ++++++++++------- .../Modules/LanguageParsers/Gramambular/Node.h | 12 ++++++++++++ 3 files changed, 29 insertions(+), 9 deletions(-) diff --git a/Source/Modules/ControllerModules/KeyHandler.mm b/Source/Modules/ControllerModules/KeyHandler.mm index db1abe69..c4c77b14 100644 --- a/Source/Modules/ControllerModules/KeyHandler.mm +++ b/Source/Modules/ControllerModules/KeyHandler.mm @@ -201,9 +201,14 @@ static NSString *const kGraphVizOutputfile = @"/tmp/vChewing-visualization.dot"; { size_t cursorIndex = [self _actualCandidateCursorIndex]; string stringValue = [value UTF8String]; - _builder->grid().fixNodeSelectedCandidate(cursorIndex, stringValue); + NodeAnchor selectedNode = _builder->grid().fixNodeSelectedCandidate(cursorIndex, stringValue); if (!Preferences.useSCPCTypingMode) { // 不要針對逐字選字模式啟用臨時半衰記憶模型。 - _userOverrideModel->observe(_walkedNodes, cursorIndex, stringValue, [[NSDate date] timeIntervalSince1970]); + // If the length of the readings and the characters do not match, + // it often means it is a special symbol and it should not be stored + // in the user override model. + if (selectedNode.spanningLength == [value count]) { + _userOverrideModel->observe(_walkedNodes, cursorIndex, stringValue, [[NSDate date] timeIntervalSince1970]); + } } [self _walk]; diff --git a/Source/Modules/LanguageParsers/Gramambular/Grid.h b/Source/Modules/LanguageParsers/Gramambular/Grid.h index 91ede675..8872cfae 100644 --- a/Source/Modules/LanguageParsers/Gramambular/Grid.h +++ b/Source/Modules/LanguageParsers/Gramambular/Grid.h @@ -40,11 +40,11 @@ namespace Taiyan { vector nodesEndingAt(size_t inLocation); vector nodesCrossingOrEndingAt(size_t inLocation); - // "Freeze" the node with the unigram that represents the selected canditate value. + // "Freeze" the node with the unigram that represents the selected candidate value. // After this, the node that contains the unigram will always be evaluated to that // unigram, while all other overlapping nodes will be reset to their initial state // (that is, if any of those nodes were "frozen" or fixed, they will be unfrozen.) - void fixNodeSelectedCandidate(size_t location, const string& value); + NodeAnchor fixNodeSelectedCandidate(size_t location, const string& value); // Similar to fixNodeSelectedCandidate, but instead of "freezing" the node, only // boost the unigram that represents the value with an overriding score. This @@ -64,7 +64,7 @@ namespace Taiyan { } inline void Grid::insertNode(const Node& inNode, size_t inLocation, size_t inSpanningLength) - { + { if (inLocation >= m_spans.size()) { size_t diff = inLocation - m_spans.size() + 1; @@ -156,7 +156,7 @@ namespace Taiyan { if (i + span.maximumLength() >= inLocation) { - for (size_t j = 1, m = span.maximumLength(); j <= m ; j++) { + for (size_t j = 1, m = span.maximumLength(); j <= m ; j++) { if (i + j < inLocation) { continue; @@ -180,9 +180,10 @@ namespace Taiyan { } // For nodes found at the location, fix their currently-selected candidate using the supplied string value. - inline void Grid::fixNodeSelectedCandidate(size_t location, const string& value) + inline NodeAnchor Grid::fixNodeSelectedCandidate(size_t location, const string& value) { vector nodes = nodesCrossingOrEndingAt(location); + NodeAnchor node; for (auto nodeAnchor : nodes) { auto candidates = nodeAnchor.node->candidates(); @@ -192,10 +193,12 @@ namespace Taiyan { for (size_t i = 0, c = candidates.size(); i < c; ++i) { if (candidates[i].value == value) { const_cast(nodeAnchor.node)->selectCandidateAtIndex(i); - break; + node = nodeAnchor; + break;; } } } + return node; } inline void Grid::overrideNodeScoreForSelectedCandidate(size_t location, const string& value, float overridingScore) @@ -254,7 +257,7 @@ namespace Taiyan { sst << "EOS;" << endl; sst << "}"; return sst.str(); - } + } } } diff --git a/Source/Modules/LanguageParsers/Gramambular/Node.h b/Source/Modules/LanguageParsers/Gramambular/Node.h index 0e560c38..bf9e568f 100644 --- a/Source/Modules/LanguageParsers/Gramambular/Node.h +++ b/Source/Modules/LanguageParsers/Gramambular/Node.h @@ -43,6 +43,7 @@ namespace Taiyan { const string& key() const; double score() const; + // double scoreForCandidate(string &candidate) const; // Prevents the override model to remember symbols with scode -X or lower. const KeyValuePair currentKeyValue() const; double highestUnigramScore() const; @@ -190,6 +191,17 @@ namespace Taiyan { return m_score; } + // Prevents the override model to remember symbols with scode -X or lower. +// inline double Node::scoreForCandidate(string &candidate) const +// { +// for (auto unigram : m_unigrams) { +// if (unigram.keyValue.value == candidate) { +// return unigram.score; +// } +// } +// return 0.0; +// } + inline double Node::highestUnigramScore() const { if (m_unigrams.empty()) { return 0.0;