Merge pull request #220 from azooKey/refactor/unify_delete_and_replace

refactor: 末尾置換と末尾削除を統合
This commit is contained in:
Miwa
2025-07-07 23:28:19 +09:00
committed by GitHub
3 changed files with 62 additions and 123 deletions

View File

@@ -1,60 +0,0 @@
//
// afterLastCharacterDeleted.swift
// Keyboard
//
// Created by ensan on 2020/09/14.
// Copyright © 2020 ensan. All rights reserved.
//
import Foundation
import SwiftUtils
extension Kana2Kanji {
/// ,
/// - Parameters:
/// - deletedCount:
/// - N_best: N_best
/// - previousResult:
/// - Returns:
///
///
/// ###
/// (1)resultregister
/// N_best
///
/// (2)filter
func kana2lattice_deletedLast(deletedCount: Int, N_best: Int, previousResult: (inputData: ComposingText, nodes: Nodes)) -> (result: LatticeNode, nodes: Nodes) {
debug("削除の連続性を利用した変換、元の文字は:", previousResult.inputData.convertTarget)
let count = previousResult.inputData.input.count - deletedCount
// (1)
let result = LatticeNode.EOSNode
for nodeArray in previousResult.nodes {
for node in nodeArray {
if node.prevs.isEmpty {
continue
}
if self.dicdataStore.shouldBeRemoved(data: node.data) {
continue
}
let nextIndex = node.inputRange.endIndex
if nextIndex == count {
//
for (index, value) in node.values.enumerated() {
let newnode = node.getRegisteredNode(index, value: value)
result.prevs.append(newnode)
}
}
}
}
// (2)
let updatedNodes = previousResult.nodes.prefix(count).map {(nodeArray: [LatticeNode]) in
nodeArray.filter {$0.inputRange.endIndex <= count}
}
return (result: result, nodes: updatedNodes)
}
}

View File

@@ -37,6 +37,15 @@ extension Kana2Kanji {
while nodes.last?.isEmpty ?? false { while nodes.last?.isEmpty ?? false {
nodes.removeLast() nodes.removeLast()
} }
let terminalNodes: Nodes
if counts.added == 0 {
terminalNodes = nodes.map {
$0.filter {
$0.inputRange.endIndex == count
}
}
} else {
// (2) // (2)
let addedNodes: [[LatticeNode]] = (0..<count).map {(i: Int) in let addedNodes: [[LatticeNode]] = (0..<count).map {(i: Int) in
self.dicdataStore.getLOUDSDataInRange(inputData: inputData, from: i, toIndexRange: max(commonCount, i) ..< count, needTypoCorrection: needTypoCorrection) self.dicdataStore.getLOUDSDataInRange(inputData: inputData, from: i, toIndexRange: max(commonCount, i) ..< count, needTypoCorrection: needTypoCorrection)
@@ -79,10 +88,20 @@ extension Kana2Kanji {
} }
} }
for (index, nodeArray) in addedNodes.enumerated() where index < nodes.endIndex {
nodes[index].append(contentsOf: nodeArray)
}
for nodeArray in addedNodes.suffix(counts.added) {
nodes.append(nodeArray)
}
terminalNodes = addedNodes
}
// (3) // (3)
// terminalNodes
let result = LatticeNode.EOSNode let result = LatticeNode.EOSNode
for (i, nodes) in addedNodes.enumerated() {
for (i, nodes) in terminalNodes.enumerated() {
for node in nodes { for node in nodes {
if node.prevs.isEmpty { if node.prevs.isEmpty {
continue continue
@@ -108,7 +127,7 @@ extension Kana2Kanji {
result.prevs.append(newnode) result.prevs.append(newnode)
} }
} else { } else {
for nextnode in addedNodes[nextIndex] { for nextnode in terminalNodes[nextIndex] {
// node.registered.isEmpty // node.registered.isEmpty
if self.dicdataStore.shouldBeRemoved(data: nextnode.data) { if self.dicdataStore.shouldBeRemoved(data: nextnode.data) {
continue continue
@@ -135,14 +154,6 @@ extension Kana2Kanji {
} }
} }
} }
for (index, nodeArray) in addedNodes.enumerated() where index < nodes.endIndex {
nodes[index].append(contentsOf: nodeArray)
}
for nodeArray in addedNodes.suffix(counts.added) {
nodes.append(nodeArray)
}
return (result: result, nodes: nodes) return (result: result, nodes: nodes)
} }

View File

@@ -661,23 +661,11 @@ import EfficientNGram
let diff = inputData.differenceSuffix(to: previousInputData) let diff = inputData.differenceSuffix(to: previousInputData)
//
if diff.deleted > 0 && diff.addedCount == 0 {
debug("\(#function): 最後尾削除用の関数を呼びます, 消した文字数は\(diff.deleted)")
let result = converter.kana2lattice_deletedLast(deletedCount: diff.deleted, N_best: N_best, previousResult: (inputData: previousInputData, nodes: nodes))
self.previousInputData = inputData
return result
}
//
if diff.addedCount > 0 {
debug("\(#function): 最後尾文字置換用の関数を呼びます、差分は\(diff)") debug("\(#function): 最後尾文字置換用の関数を呼びます、差分は\(diff)")
let result = converter.kana2lattice_changed(inputData, N_best: N_best, counts: (diff.deleted, diff.addedCount), previousResult: (inputData: previousInputData, nodes: nodes), needTypoCorrection: needTypoCorrection) let result = converter.kana2lattice_changed(inputData, N_best: N_best, counts: (diff.deleted, diff.addedCount), previousResult: (inputData: previousInputData, nodes: nodes), needTypoCorrection: needTypoCorrection)
self.previousInputData = inputData self.previousInputData = inputData
return result return result
} }
fatalError("\(#function): ここに到達することは想定されていません。")
}
public func getAppropriateActions(_ candidate: Candidate) -> [CompleteAction] { public func getAppropriateActions(_ candidate: Candidate) -> [CompleteAction] {
if ["[]", "()", "", "〈〉", "", "", "「」", "『』", "【】", "{}", "<>", "《》", "\"\"", "\'\'", "””"].contains(candidate.text) { if ["[]", "()", "", "〈〉", "", "", "「」", "『』", "【】", "{}", "<>", "《》", "\"\"", "\'\'", "””"].contains(candidate.text) {