From 319e5a9a69c87d6fee54e2c1a7a0238d982f05d3 Mon Sep 17 00:00:00 2001 From: Miwa / Ensan Date: Sun, 6 Jul 2025 23:10:32 +0900 Subject: [PATCH] =?UTF-8?q?refactor:=20=E6=9C=AB=E5=B0=BE=E7=BD=AE?= =?UTF-8?q?=E6=8F=9B=E3=81=A8=E6=9C=AB=E5=B0=BE=E5=89=8A=E9=99=A4=E3=82=92?= =?UTF-8?q?=E7=B5=B1=E5=90=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Core/SuffixDeletionProcessing.swift | 60 ---------- .../Core/SuffixReplacementProcessing.swift | 105 ++++++++++-------- .../ConverterAPI/KanaKanjiConverter.swift | 20 +--- 3 files changed, 62 insertions(+), 123 deletions(-) delete mode 100644 Sources/KanaKanjiConverterModule/ConversionAlgorithms/Core/SuffixDeletionProcessing.swift diff --git a/Sources/KanaKanjiConverterModule/ConversionAlgorithms/Core/SuffixDeletionProcessing.swift b/Sources/KanaKanjiConverterModule/ConversionAlgorithms/Core/SuffixDeletionProcessing.swift deleted file mode 100644 index 405172d..0000000 --- a/Sources/KanaKanjiConverterModule/ConversionAlgorithms/Core/SuffixDeletionProcessing.swift +++ /dev/null @@ -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)まず、計算済みノードを捜査して、新しい文末につながるものをresultにregisterしていく。 - /// 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) - } - -} diff --git a/Sources/KanaKanjiConverterModule/ConversionAlgorithms/Core/SuffixReplacementProcessing.swift b/Sources/KanaKanjiConverterModule/ConversionAlgorithms/Core/SuffixReplacementProcessing.swift index 18930a0..976a025 100644 --- a/Sources/KanaKanjiConverterModule/ConversionAlgorithms/Core/SuffixReplacementProcessing.swift +++ b/Sources/KanaKanjiConverterModule/ConversionAlgorithms/Core/SuffixReplacementProcessing.swift @@ -37,52 +37,71 @@ extension Kana2Kanji { while nodes.last?.isEmpty ?? false { nodes.removeLast() } - // (2) - let addedNodes: [[LatticeNode]] = (0..= newValue}) ?? -1) + 1 - if lastindex == N_best { - continue - } - let newnode: RegisteredNode = node.getRegisteredNode(index, value: newValue) - // カウントがオーバーしている場合は除去する - if nextnode.prevs.count >= N_best { - nextnode.prevs.removeLast() - } - // removeしてからinsertした方が速い (insertはO(N)なので) - nextnode.prevs.insert(newnode, at: lastindex) - } + let terminalNodes: Nodes + if counts.added == 0 { + terminalNodes = nodes.map { + $0.filter { + $0.inputRange.endIndex == count } } + } else { + // (2) + let addedNodes: [[LatticeNode]] = (0..= newValue}) ?? -1) + 1 + if lastindex == N_best { + continue + } + let newnode: RegisteredNode = node.getRegisteredNode(index, value: newValue) + // カウントがオーバーしている場合は除去する + if nextnode.prevs.count >= N_best { + nextnode.prevs.removeLast() + } + // removeしてからinsertした方が速い (insertはO(N)なので) + nextnode.prevs.insert(newnode, at: lastindex) + } + } + } + + } + 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) + // terminalNodesの各要素を結果ノードに接続する let result = LatticeNode.EOSNode - for (i, nodes) in addedNodes.enumerated() { + + for (i, nodes) in terminalNodes.enumerated() { for node in nodes { if node.prevs.isEmpty { continue @@ -108,7 +127,7 @@ extension Kana2Kanji { result.prevs.append(newnode) } } else { - for nextnode in addedNodes[nextIndex] { + for nextnode in terminalNodes[nextIndex] { // この関数はこの時点で呼び出して、後のnode.registered.isEmptyで最終的に弾くのが良い。 if self.dicdataStore.shouldBeRemoved(data: nextnode.data) { 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) } diff --git a/Sources/KanaKanjiConverterModule/ConverterAPI/KanaKanjiConverter.swift b/Sources/KanaKanjiConverterModule/ConverterAPI/KanaKanjiConverter.swift index 6cc15ff..268f95c 100644 --- a/Sources/KanaKanjiConverterModule/ConverterAPI/KanaKanjiConverter.swift +++ b/Sources/KanaKanjiConverterModule/ConverterAPI/KanaKanjiConverter.swift @@ -661,22 +661,10 @@ import EfficientNGram 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)") - 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 - return result - } - fatalError("\(#function): ここに到達することは想定されていません。") + 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) + self.previousInputData = inputData + return result } public func getAppropriateActions(_ candidate: Candidate) -> [CompleteAction] {