20 lines
889 B
Swift
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
|
|
}
|
|
}
|