From d2ed575d369a52f7b91aba1971ef3ac223ae368d Mon Sep 17 00:00:00 2001 From: ShikiSuen Date: Sat, 23 Jul 2022 23:48:46 +0800 Subject: [PATCH] UOM // Only update observation if half-decayed. --- .../SubLMs/lmUserOverride.swift | 30 +++++++++++++++---- 1 file changed, 24 insertions(+), 6 deletions(-) diff --git a/Source/Modules/LangModelRelated/SubLMs/lmUserOverride.swift b/Source/Modules/LangModelRelated/SubLMs/lmUserOverride.swift index 7b8551de..72e1e23c 100644 --- a/Source/Modules/LangModelRelated/SubLMs/lmUserOverride.swift +++ b/Source/Modules/LangModelRelated/SubLMs/lmUserOverride.swift @@ -70,19 +70,26 @@ extension vChewing { saveCallback() return } + // 降低磁碟寫入次數。唯有失憶的情況下才會更新觀察且記憶。 if var theNeta = mutLRUMap[key] { - theNeta.observation.update(candidate: candidate, timestamp: timestamp) - mutLRUList.insert(theNeta, at: 0) - mutLRUMap[key] = theNeta - IME.prtDebugIntel("UOM: Observation finished with existing observation: \(key)") - saveCallback() + _ = suggest( + walkedAnchors: walkedAnchors, cursorIndex: cursorIndex, timestamp: timestamp, + decayCallback: { + theNeta.observation.update(candidate: candidate, timestamp: timestamp) + self.mutLRUList.insert(theNeta, at: 0) + self.mutLRUMap[key] = theNeta + IME.prtDebugIntel("UOM: Observation finished with existing observation: \(key)") + saveCallback() + } + ) } } public func suggest( walkedAnchors: [Megrez.NodeAnchor], cursorIndex: Int, - timestamp: Double + timestamp: Double, + decayCallback: @escaping () -> Void = {} ) -> [Megrez.Unigram] { let key = convertKeyFrom(walkedAnchors: walkedAnchors, cursorIndex: cursorIndex) let currentReadingKey = convertKeyFrom(walkedAnchors: walkedAnchors, cursorIndex: cursorIndex, readingOnly: true) @@ -97,6 +104,7 @@ extension vChewing { var currentHighScore = 0.0 for overrideNeta in Array(observation.overrides) { let override: Override = overrideNeta.value + let overrideScore: Double = getScore( eventCount: override.count, totalCount: observation.count, @@ -105,6 +113,16 @@ extension vChewing { lambda: mutDecayExponent ) if (0...currentHighScore).contains(overrideScore) { continue } + + let overrideDetectionScore: Double = getScore( + eventCount: override.count, + totalCount: observation.count, + eventTimestamp: override.timestamp, + timestamp: timestamp, + lambda: mutDecayExponent * 2 + ) + if (0...currentHighScore).contains(overrideDetectionScore) { decayCallback() } + let newUnigram = Megrez.Unigram( keyValue: .init(key: currentReadingKey, value: overrideNeta.key), score: overrideScore )