Files
ReadViewSDK/Sources/RDAIReaderView/NaturalLanguage/RDAINaturalLanguageSemanticScorer.swift
T
2026-07-27 21:43:13 +08:00

20 lines
889 B
Swift

import Foundation
import NaturalLanguage
/// Uses Apple's bundled sentence embeddings when the language asset exists.
/// Distances are converted to a stable 0...1 ranking signal only within one
/// query; callers must not compare values across embedding revisions.
public struct RDAINaturalLanguageSemanticScorer: RDAISemanticScoring {
public init() {}
public func score(query: String, text: String, languageCode: String?) async -> Double? {
await Task.detached(priority: .utility) {
let language = languageCode.flatMap(NLLanguage.init(rawValue:)) ?? .english
guard let embedding = NLEmbedding.sentenceEmbedding(for: language) else { return nil }
let distance = embedding.distance(between: query, and: text)
guard distance.isFinite else { return nil }
return 1 / (1 + Double(distance))
}.value
}
}