Improve candidate generation algorithm

This commit is contained in:
ensan
2023-07-24 23:46:36 +09:00
parent 568a11801b
commit ac1badb869

View File

@@ -396,11 +396,11 @@ import SwiftUtils
)
}
let sums: [(CandidateData, Candidate)] = clauseResult.map {($0, converter.processClauseCandidate($0))}
//
// 5
let whole_sentence_unique_candidates = self.getUniqueCandidate(sums.map {$0.1})
let sentence_candidates = whole_sentence_unique_candidates.min(count: 5, sortedBy: {$0.value > $1.value})
//
let prediction_candidates: [Candidate] = options.requireJapanesePrediction ? Array(self.getUniqueCandidate(self.getPredictionCandidate(sums, composingText: inputData, options: options)).min(count: 4, sortedBy: {$0.value > $1.value})) : []
// 3
let prediction_candidates: [Candidate] = options.requireJapanesePrediction ? Array(self.getUniqueCandidate(self.getPredictionCandidate(sums, composingText: inputData, options: options)).min(count: 3, sortedBy: {$0.value > $1.value})) : []
// appleapi使
var foreign_candidates: [Candidate] = []
@@ -412,23 +412,25 @@ import SwiftUtils
foreign_candidates.append(contentsOf: self.getForeignPredictionCandidate(inputData: inputData, language: "el"))
}
// 538
let best8 = getUniqueCandidate(sentence_candidates.chained(prediction_candidates)).sorted {$0.value > $1.value}
//
let best10 = getUniqueCandidate(sentence_candidates.chained(prediction_candidates)).min(count: 10, sortedBy: {$0.value > $1.value})
let zeroHintPrediction_candidates = converter.getZeroHintPredictionCandidates(preparts: best10, N_best: 3)
let zeroHintPrediction_candidates = converter.getZeroHintPredictionCandidates(preparts: best8, N_best: 3)
//
let toplevel_additional_candidate = self.getTopLevelAdditionalCandidate(inputData, options: options)
//
// best8foreign_candidateszeroHintPrediction_candidatestoplevel_additional_candidate5
let full_candidate = getUniqueCandidate(
best10
best8
.chained(foreign_candidates)
.chained(zeroHintPrediction_candidates)
.chained(toplevel_additional_candidate)
).min(count: 5, sortedBy: {$0.value > $1.value})
//
var seenCandidate: Set<String> = full_candidate.mapSet {$0.text}
//
// 5
let clause_candidates = self.getUniqueCandidate(clauseCandidates, seenCandidates: seenCandidate).min(count: 5, sortedBy: {$0.value > $1.value})
seenCandidate.formUnion(clause_candidates.map {$0.text})
//
//
let wise_candidates: [Candidate] = self.getWiseCandidate(inputData, options: options)
seenCandidate.formUnion(wise_candidates.map {$0.text})
@@ -443,13 +445,10 @@ import SwiftUtils
data: [$0.data]
)
}
//
//
let additionalCandidates: [Candidate] = self.getAdditionalCandidate(inputData, options: options)
/*
*/
//
let word_candidates: [Candidate] = self.getUniqueCandidate(dicCandidates.chained(additionalCandidates), seenCandidates: seenCandidate)
.sorted {
let count0 = $0.correspondingCount
@@ -459,13 +458,13 @@ import SwiftUtils
var result = Array(full_candidate)
// 1
// 31
let checkRuby: (Candidate) -> Bool = {$0.data.reduce(into: "") {$0 += $1.ruby} == inputData.convertTarget.toKatakana()}
if !result.contains(where: checkRuby) {
if let candidate = sentence_candidates.first(where: checkRuby) {
result.append(candidate)
result.insert(candidate, at: min(result.endIndex, 2))
} else if let candidate = whole_sentence_unique_candidates.first(where: checkRuby) {
result.append(candidate)
result.insert(candidate, at: min(result.endIndex, 2))
}
}