mirror of
https://github.com/mii443/AzooKeyKanaKanjiConverter.git
synced 2025-08-22 23:15:25 +00:00
Merge pull request #199 from azooKey/fix/clarify_incremental_update_case
fix: Zenzaiで学習が有効な場合に、低頻度の漢字を用いたありえない変換候補が提案される問題を修正
This commit is contained in:
@ -182,7 +182,7 @@ extension Kana2Kanji {
|
|||||||
candidateIndex: Int,
|
candidateIndex: Int,
|
||||||
candidates: [Candidate],
|
candidates: [Candidate],
|
||||||
reviewResult: consuming ZenzContext.CandidateEvaluationResult,
|
reviewResult: consuming ZenzContext.CandidateEvaluationResult,
|
||||||
constraint: inout PrefixConstraint
|
constraint: inout PrefixConstraint,
|
||||||
) -> NextAction {
|
) -> NextAction {
|
||||||
switch reviewResult {
|
switch reviewResult {
|
||||||
case .error:
|
case .error:
|
||||||
@ -200,15 +200,20 @@ extension Kana2Kanji {
|
|||||||
return .return(constraint: PrefixConstraint([]), alternativeConstraints: [], satisfied: false)
|
return .return(constraint: PrefixConstraint([]), alternativeConstraints: [], satisfied: false)
|
||||||
}
|
}
|
||||||
// 制約が得られたので、更新する
|
// 制約が得られたので、更新する
|
||||||
|
let isIncrementalUpdate = prefixConstraint.hasPrefix(constraint.constraint)
|
||||||
constraint = PrefixConstraint(prefixConstraint)
|
constraint = PrefixConstraint(prefixConstraint)
|
||||||
debug("update constraint:", constraint)
|
debug("update constraint:", constraint)
|
||||||
|
if isIncrementalUpdate {
|
||||||
// もし制約を満たす候補があるならそれを使って再レビューチャレンジを戦うことで、推論を減らせる
|
// もし制約を満たす候補があるならそれを使って再レビューチャレンジを戦うことで、推論を減らせる
|
||||||
|
// この処理の正当性は、prefix constraintが漸進的に更新され、candidatesの構築時に可能な候補がすべて確認されたことに由来する
|
||||||
|
// このため、学習候補などが最終ドラフトとして採択され、prefix constraintが漸進的更新になっていない場合(!isIncrementalUpdate)この処理は行わない
|
||||||
for (i, candidate) in candidates.indexed() where i != candidateIndex {
|
for (i, candidate) in candidates.indexed() where i != candidateIndex {
|
||||||
if candidate.text.utf8.hasPrefix(prefixConstraint) && self.heuristicRetryValidation(candidate.text) {
|
if candidate.text.utf8.hasPrefix(prefixConstraint) && self.heuristicRetryValidation(candidate.text) {
|
||||||
debug("found \(candidate.text) as another retry")
|
debug("found \(candidate.text) as another retry")
|
||||||
return .retry(candidateIndex: i)
|
return .retry(candidateIndex: i)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
return .continue
|
return .continue
|
||||||
case .wholeResult(let wholeConstraint):
|
case .wholeResult(let wholeConstraint):
|
||||||
let newConstraint = PrefixConstraint(Array(wholeConstraint.utf8), hasEOS: true)
|
let newConstraint = PrefixConstraint(Array(wholeConstraint.utf8), hasEOS: true)
|
||||||
@ -219,14 +224,18 @@ extension Kana2Kanji {
|
|||||||
}
|
}
|
||||||
// 制約が得られたので、更新する
|
// 制約が得られたので、更新する
|
||||||
debug("update whole constraint:", wholeConstraint)
|
debug("update whole constraint:", wholeConstraint)
|
||||||
|
let isIncrementalUpdate = wholeConstraint.utf8.hasPrefix(constraint.constraint)
|
||||||
constraint = PrefixConstraint(Array(wholeConstraint.utf8), hasEOS: true)
|
constraint = PrefixConstraint(Array(wholeConstraint.utf8), hasEOS: true)
|
||||||
|
if isIncrementalUpdate {
|
||||||
// もし制約を満たす候補があるならそれを使って再レビューチャレンジを戦うことで、推論を減らせる
|
// もし制約を満たす候補があるならそれを使って再レビューチャレンジを戦うことで、推論を減らせる
|
||||||
|
// 上記と同様に、prefix constraintが漸進的更新になっていない場合(!isIncrementalUpdate)この処理は行わない
|
||||||
for (i, candidate) in candidates.indexed() where i != candidateIndex {
|
for (i, candidate) in candidates.indexed() where i != candidateIndex {
|
||||||
if candidate.text == wholeConstraint && self.heuristicRetryValidation(candidate.text) {
|
if candidate.text == wholeConstraint && self.heuristicRetryValidation(candidate.text) {
|
||||||
debug("found \(candidate.text) as another retry")
|
debug("found \(candidate.text) as another retry")
|
||||||
return .retry(candidateIndex: i)
|
return .retry(candidateIndex: i)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
return .continue
|
return .continue
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user