UOM // Upgrade Suggest() to let it return a list of Unigrams.

This commit is contained in:
ShikiSuen 2022-06-22 14:51:02 +08:00
parent 17646e8e6c
commit 265cfbb21a
1 changed files with 34 additions and 25 deletions

View File

@ -111,17 +111,18 @@ extension vChewing {
walkedAnchors: [Megrez.NodeAnchor],
cursorIndex: Int,
timestamp: Double
) -> String {
) -> [Megrez.Unigram] {
let key = convertKeyFrom(walkedAnchors: walkedAnchors, cursorIndex: cursorIndex)
let currentReadingKey = convertKeyFrom(walkedAnchors: walkedAnchors, cursorIndex: cursorIndex, readingOnly: true)
guard let koPair = mutLRUMap[key] else {
IME.prtDebugIntel("UOM: mutLRUMap[key] is nil, throwing blank suggestion for key: \(key).")
return ""
return .init()
}
let observation = koPair.observation
var candidate = ""
var score = 0.0
var arrResults = [Megrez.Unigram]()
var currentHighScore = 0.0
for overrideNeta in Array(observation.overrides) {
let override: Override = overrideNeta.value
let overrideScore: Double = getScore(
@ -131,23 +132,20 @@ extension vChewing {
timestamp: timestamp,
lambda: mutDecayExponent
)
if overrideScore == 0.0 {
continue
if (0...currentHighScore).contains(overrideScore) { continue }
let newUnigram = Megrez.Unigram(
keyValue: .init(key: currentReadingKey, value: overrideNeta.key), score: overrideScore
)
arrResults.insert(newUnigram, at: 0)
currentHighScore = overrideScore
}
if overrideScore > score {
candidate = overrideNeta.key
score = overrideScore
}
}
if candidate.isEmpty {
if arrResults.isEmpty {
IME.prtDebugIntel("UOM: No usable suggestions in the result for key: \(key).")
}
return candidate
return arrResults
}
public func getScore(
private func getScore(
eventCount: Int,
totalCount: Int,
eventTimestamp: Double,
@ -161,7 +159,7 @@ extension vChewing {
}
func convertKeyFrom(
walkedAnchors: [Megrez.NodeAnchor], cursorIndex: Int
walkedAnchors: [Megrez.NodeAnchor], cursorIndex: Int, readingOnly: Bool = false
) -> String {
let arrEndingPunctuation = ["", "", "", "", "", "", "", ""]
var arrNodes: [Megrez.NodeAnchor] = []
@ -178,34 +176,45 @@ extension vChewing {
arrNodes = Array(arrNodes.reversed())
var strCurrent = "()"
var strPrevious = "()"
var strAnterior = "()"
guard let kvCurrent = arrNodes[0].node?.currentKeyValue,
!arrEndingPunctuation.contains(kvCurrent.value)
else {
return ""
}
//
if kvCurrent.key.split(separator: "-").count != kvCurrent.value.count { return "" }
//
strCurrent = kvCurrent.key
let strCurrent = kvCurrent.key
var strPrevious = "()"
var strAnterior = "()"
var readingStack = ""
var trigramKey: String { "(\(strAnterior),\(strPrevious),\(strCurrent))" }
var result: String {
readingStack.contains("_") ? "" : (readingOnly ? strCurrent : trigramKey)
}
if arrNodes.count >= 2,
let kvPrevious = arrNodes[1].node?.currentKeyValue,
!arrEndingPunctuation.contains(kvPrevious.value)
!arrEndingPunctuation.contains(kvPrevious.value),
kvPrevious.key.split(separator: "-").count == kvPrevious.value.count
{
strPrevious = "(\(kvPrevious.key),\(kvPrevious.value))"
readingStack = kvPrevious.key + readingStack
}
if arrNodes.count >= 3,
let kvAnterior = arrNodes[2].node?.currentKeyValue,
!arrEndingPunctuation.contains(kvAnterior.value)
!arrEndingPunctuation.contains(kvAnterior.value),
kvAnterior.key.split(separator: "-").count == kvAnterior.value.count
{
strAnterior = "(\(kvAnterior.key),\(kvAnterior.value))"
readingStack = kvAnterior.key + readingStack
}
return "(\(strAnterior),\(strPrevious),\(strCurrent))"
return result
}
}
}