@mmerterden/multi-agent-pipeline 20.7.0 → 20.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +9 -0
- package/LICENSE +0 -10
- package/docs/facts.json +1 -1
- package/manifest.json +266 -267
- package/package.json +2 -2
- package/pipeline/scripts/_notices.mjs +1 -1
- package/pipeline/skills/.skill-manifest.json +68 -68
- package/pipeline/skills/shared/README.md +70 -70
- package/pipeline/skills/shared/external/alarmkit/SKILL.md +373 -381
- package/pipeline/skills/shared/external/alarmkit/evals/evals.json +23 -18
- package/pipeline/skills/shared/external/alarmkit/references/alarmkit-patterns.md +328 -378
- package/pipeline/skills/shared/external/app-clips/SKILL.md +260 -160
- package/pipeline/skills/shared/external/app-clips/evals/evals.json +27 -27
- package/pipeline/skills/shared/external/app-clips/references/data-handoff-notifications-location.md +150 -83
- package/pipeline/skills/shared/external/app-clips/references/routing-and-experiences.md +135 -83
- package/pipeline/skills/shared/external/app-clips/references/size-capabilities-and-promotion.md +143 -85
- package/pipeline/skills/shared/external/app-intents/SKILL.md +302 -304
- package/pipeline/skills/shared/external/app-intents/evals/evals.json +21 -21
- package/pipeline/skills/shared/external/app-intents/references/appintents-advanced.md +594 -894
- package/pipeline/skills/shared/external/app-store-optimization/SKILL.md +339 -277
- package/pipeline/skills/shared/external/app-store-optimization/evals/evals.json +27 -23
- package/pipeline/skills/shared/external/app-store-optimization/references/keyword-research-methodology.md +105 -122
- package/pipeline/skills/shared/external/app-store-optimization/references/product-page-variants.md +143 -166
- package/pipeline/skills/shared/external/app-store-review/SKILL.md +307 -326
- package/pipeline/skills/shared/external/app-store-review/evals/evals.json +21 -21
- package/pipeline/skills/shared/external/app-store-review/references/privacy-manifest.md +105 -67
- package/pipeline/skills/shared/external/app-store-review/references/review-checklists.md +114 -101
- package/pipeline/skills/shared/external/apple-on-device-ai/SKILL.md +333 -360
- package/pipeline/skills/shared/external/apple-on-device-ai/evals/evals.json +24 -27
- package/pipeline/skills/shared/external/apple-on-device-ai/references/coreml-conversion.md +215 -322
- package/pipeline/skills/shared/external/apple-on-device-ai/references/coreml-optimization.md +161 -256
- package/pipeline/skills/shared/external/apple-on-device-ai/references/foundation-models.md +277 -387
- package/pipeline/skills/shared/external/apple-on-device-ai/references/mlx-swift.md +196 -210
- package/pipeline/skills/shared/external/authentication/SKILL.md +265 -381
- package/pipeline/skills/shared/external/authentication/evals/evals.json +25 -25
- package/pipeline/skills/shared/external/authentication/references/keychain-biometric.md +133 -178
- package/pipeline/skills/shared/external/authentication/references/passkeys.md +111 -147
- package/pipeline/skills/shared/external/avkit/SKILL.md +267 -364
- package/pipeline/skills/shared/external/avkit/evals/evals.json +26 -26
- package/pipeline/skills/shared/external/avkit/references/avkit-patterns.md +375 -493
- package/pipeline/skills/shared/external/background-processing/SKILL.md +270 -382
- package/pipeline/skills/shared/external/background-processing/evals/evals.json +22 -22
- package/pipeline/skills/shared/external/background-processing/references/background-task-patterns.md +169 -317
- package/pipeline/skills/shared/external/callkit-voip/SKILL.md +290 -371
- package/pipeline/skills/shared/external/callkit-voip/evals/evals.json +24 -24
- package/pipeline/skills/shared/external/callkit-voip/references/callkit-patterns.md +175 -343
- package/pipeline/skills/shared/external/cloudkit-sync/SKILL.md +292 -381
- package/pipeline/skills/shared/external/cloudkit-sync/evals/evals.json +33 -30
- package/pipeline/skills/shared/external/cloudkit-sync/references/cloudkit-patterns.md +227 -355
- package/pipeline/skills/shared/external/contacts-framework/SKILL.md +197 -346
- package/pipeline/skills/shared/external/contacts-framework/evals/evals.json +19 -21
- package/pipeline/skills/shared/external/contacts-framework/references/contacts-patterns.md +169 -308
- package/pipeline/skills/shared/external/core-bluetooth/SKILL.md +226 -376
- package/pipeline/skills/shared/external/core-bluetooth/evals/evals.json +25 -22
- package/pipeline/skills/shared/external/core-bluetooth/references/ble-patterns.md +257 -337
- package/pipeline/skills/shared/external/core-data/SKILL.md +292 -368
- package/pipeline/skills/shared/external/core-data/evals/evals.json +30 -27
- package/pipeline/skills/shared/external/core-motion/SKILL.md +235 -324
- package/pipeline/skills/shared/external/core-motion/evals/evals.json +31 -27
- package/pipeline/skills/shared/external/core-motion/references/motion-patterns.md +210 -310
- package/pipeline/skills/shared/external/core-nfc/SKILL.md +292 -366
- package/pipeline/skills/shared/external/core-nfc/evals/evals.json +22 -24
- package/pipeline/skills/shared/external/core-nfc/references/nfc-patterns.md +233 -329
- package/pipeline/skills/shared/external/coreml/SKILL.md +323 -367
- package/pipeline/skills/shared/external/coreml/evals/evals.json +24 -21
- package/pipeline/skills/shared/external/coreml/references/coreml-swift-integration.md +562 -565
- package/pipeline/skills/shared/external/cryptokit/SKILL.md +253 -394
- package/pipeline/skills/shared/external/cryptokit/evals/evals.json +20 -18
- package/pipeline/skills/shared/external/cryptokit/references/cryptokit-patterns.md +299 -488
- package/pipeline/skills/shared/external/debugging-instruments/SKILL.md +270 -323
- package/pipeline/skills/shared/external/debugging-instruments/evals/evals.json +27 -30
- package/pipeline/skills/shared/external/debugging-instruments/references/instruments-guide.md +167 -315
- package/pipeline/skills/shared/external/debugging-instruments/references/lldb-patterns.md +140 -193
- package/pipeline/skills/shared/external/device-integrity/SKILL.md +230 -353
- package/pipeline/skills/shared/external/device-integrity/evals/evals.json +25 -21
- package/pipeline/skills/shared/external/device-integrity/references/device-integrity-patterns.md +159 -197
- package/pipeline/skills/shared/external/energykit/SKILL.md +225 -392
- package/pipeline/skills/shared/external/energykit/evals/evals.json +29 -28
- package/pipeline/skills/shared/external/energykit/references/energykit-patterns.md +174 -470
- package/pipeline/skills/shared/external/eventkit-calendar/SKILL.md +261 -383
- package/pipeline/skills/shared/external/eventkit-calendar/evals/evals.json +25 -22
- package/pipeline/skills/shared/external/eventkit-calendar/references/eventkit-patterns.md +165 -268
- package/pipeline/skills/shared/external/healthkit/SKILL.md +252 -303
- package/pipeline/skills/shared/external/healthkit/evals/evals.json +24 -23
- package/pipeline/skills/shared/external/healthkit/references/healthkit-patterns.md +369 -523
- package/pipeline/skills/shared/external/homekit-matter/SKILL.md +233 -348
- package/pipeline/skills/shared/external/homekit-matter/evals/evals.json +27 -22
- package/pipeline/skills/shared/external/homekit-matter/references/matter-commissioning.md +199 -305
- package/pipeline/skills/shared/external/ios-accessibility/SKILL.md +368 -340
- package/pipeline/skills/shared/external/ios-accessibility/evals/evals.json +28 -27
- package/pipeline/skills/shared/external/ios-accessibility/references/a11y-patterns.md +314 -260
- package/pipeline/skills/shared/external/ios-accessibility/references/media-accessibility.md +97 -67
- package/pipeline/skills/shared/external/ios-accessibility/references/nutrition-labels.md +165 -101
- package/pipeline/skills/shared/external/ios-localization/SKILL.md +258 -371
- package/pipeline/skills/shared/external/ios-localization/evals/evals.json +23 -23
- package/pipeline/skills/shared/external/ios-localization/references/formatstyle-locale.md +283 -491
- package/pipeline/skills/shared/external/ios-localization/references/string-catalogs.md +313 -440
- package/pipeline/skills/shared/external/ios-networking/SKILL.md +265 -341
- package/pipeline/skills/shared/external/ios-networking/evals/evals.json +24 -24
- package/pipeline/skills/shared/external/ios-networking/references/background-websocket.md +425 -652
- package/pipeline/skills/shared/external/ios-networking/references/file-storage-patterns.md +143 -285
- package/pipeline/skills/shared/external/ios-networking/references/lightweight-clients.md +93 -53
- package/pipeline/skills/shared/external/ios-networking/references/network-framework.md +231 -456
- package/pipeline/skills/shared/external/ios-networking/references/urlsession-patterns.md +517 -784
- package/pipeline/skills/shared/external/ios-simulator/SKILL.md +265 -393
- package/pipeline/skills/shared/external/ios-simulator/evals/evals.json +21 -21
- package/pipeline/skills/shared/external/ios-simulator/references/simctl-commands.md +177 -270
- package/pipeline/skills/shared/external/live-activities/SKILL.md +318 -360
- package/pipeline/skills/shared/external/live-activities/evals/evals.json +21 -21
- package/pipeline/skills/shared/external/live-activities/references/activitykit-patterns.md +478 -710
- package/pipeline/skills/shared/external/mapkit-location/SKILL.md +295 -267
- package/pipeline/skills/shared/external/mapkit-location/evals/evals.json +28 -24
- package/pipeline/skills/shared/external/mapkit-location/references/mapkit-corelocation-patterns.md +378 -532
- package/pipeline/skills/shared/external/mapkit-location/references/mapkit-patterns.md +397 -499
- package/pipeline/skills/shared/external/metrickit-diagnostics/SKILL.md +165 -348
- package/pipeline/skills/shared/external/metrickit-diagnostics/evals/evals.json +26 -23
- package/pipeline/skills/shared/external/metrickit-diagnostics/references/metrickit-patterns.md +123 -130
- package/pipeline/skills/shared/external/musickit-audio/SKILL.md +189 -315
- package/pipeline/skills/shared/external/musickit-audio/evals/evals.json +22 -21
- package/pipeline/skills/shared/external/musickit-audio/references/musickit-patterns.md +181 -270
- package/pipeline/skills/shared/external/natural-language/SKILL.md +188 -340
- package/pipeline/skills/shared/external/natural-language/evals/evals.json +21 -21
- package/pipeline/skills/shared/external/natural-language/references/translation-patterns.md +171 -225
- package/pipeline/skills/shared/external/passkit-wallet/SKILL.md +258 -392
- package/pipeline/skills/shared/external/passkit-wallet/evals/evals.json +30 -29
- package/pipeline/skills/shared/external/passkit-wallet/references/wallet-passes.md +164 -231
- package/pipeline/skills/shared/external/pdfkit/SKILL.md +312 -344
- package/pipeline/skills/shared/external/pdfkit/evals/evals.json +19 -19
- package/pipeline/skills/shared/external/pdfkit/references/pdfkit-patterns.md +413 -624
- package/pipeline/skills/shared/external/pencilkit-drawing/SKILL.md +242 -358
- package/pipeline/skills/shared/external/pencilkit-drawing/evals/evals.json +25 -21
- package/pipeline/skills/shared/external/pencilkit-drawing/references/pencilkit-patterns.md +161 -226
- package/pipeline/skills/shared/external/permissionkit/SKILL.md +282 -400
- package/pipeline/skills/shared/external/permissionkit/evals/evals.json +27 -30
- package/pipeline/skills/shared/external/permissionkit/references/permissionkit-patterns.md +237 -350
- package/pipeline/skills/shared/external/photos-camera-media/SKILL.md +276 -325
- package/pipeline/skills/shared/external/photos-camera-media/references/av-playback.md +299 -545
- package/pipeline/skills/shared/external/photos-camera-media/references/camera-capture.md +344 -588
- package/pipeline/skills/shared/external/photos-camera-media/references/image-loading-caching.md +316 -660
- package/pipeline/skills/shared/external/photos-camera-media/references/photokit-patterns.md +270 -416
- package/pipeline/skills/shared/external/push-notifications/SKILL.md +312 -340
- package/pipeline/skills/shared/external/push-notifications/evals/evals.json +27 -26
- package/pipeline/skills/shared/external/push-notifications/references/notification-patterns.md +328 -485
- package/pipeline/skills/shared/external/push-notifications/references/rich-notifications.md +327 -560
- package/pipeline/skills/shared/external/realitykit-ar/SKILL.md +218 -410
- package/pipeline/skills/shared/external/realitykit-ar/evals/evals.json +24 -27
- package/pipeline/skills/shared/external/realitykit-ar/references/realitykit-patterns.md +221 -348
- package/pipeline/skills/shared/external/shareplay-activities/SKILL.md +222 -393
- package/pipeline/skills/shared/external/shareplay-activities/evals/evals.json +23 -24
- package/pipeline/skills/shared/external/shareplay-activities/references/shareplay-patterns.md +280 -420
- package/pipeline/skills/shared/external/speech-recognition/SKILL.md +217 -421
- package/pipeline/skills/shared/external/speech-recognition/evals/evals.json +23 -26
- package/pipeline/skills/shared/external/speech-recognition/references/speechanalyzer-patterns.md +133 -125
- package/pipeline/skills/shared/external/storekit/SKILL.md +228 -204
- package/pipeline/skills/shared/external/storekit/evals/evals.json +27 -24
- package/pipeline/skills/shared/external/storekit/references/app-review-guidelines.md +98 -109
- package/pipeline/skills/shared/external/storekit/references/core-patterns.md +298 -242
- package/pipeline/skills/shared/external/storekit/references/storekit-advanced.md +356 -649
- package/pipeline/skills/shared/external/swift-api-design-guidelines/SKILL.md +274 -399
- package/pipeline/skills/shared/external/swift-api-design-guidelines/evals/evals.json +22 -24
- package/pipeline/skills/shared/external/swift-api-design-guidelines/references/argument-labels-and-parameters.md +107 -108
- package/pipeline/skills/shared/external/swift-api-design-guidelines/references/conventions-and-special-rules.md +93 -165
- package/pipeline/skills/shared/external/swift-api-design-guidelines/references/naming-and-clarity.md +99 -137
- package/pipeline/skills/shared/external/swift-api-design-guidelines/references/side-effects-and-mutating-pairs.md +77 -120
- package/pipeline/skills/shared/external/swift-architecture/SKILL.md +334 -350
- package/pipeline/skills/shared/external/swift-architecture/evals/evals.json +22 -22
- package/pipeline/skills/shared/external/swift-charts/SKILL.md +208 -394
- package/pipeline/skills/shared/external/swift-charts/evals/evals.json +27 -30
- package/pipeline/skills/shared/external/swift-charts/references/charts-patterns.md +351 -762
- package/pipeline/skills/shared/external/swift-codable/SKILL.md +339 -343
- package/pipeline/skills/shared/external/swift-codable/evals/evals.json +20 -20
- package/pipeline/skills/shared/external/swift-concurrency/SKILL.md +303 -351
- package/pipeline/skills/shared/external/swift-concurrency/evals/evals.json +27 -24
- package/pipeline/skills/shared/external/swift-concurrency/references/approachable-concurrency.md +65 -80
- package/pipeline/skills/shared/external/swift-concurrency/references/async-algorithms.md +48 -84
- package/pipeline/skills/shared/external/swift-concurrency/references/bridging-interop.md +134 -79
- package/pipeline/skills/shared/external/swift-concurrency/references/concurrency-patterns.md +145 -167
- package/pipeline/skills/shared/external/swift-concurrency/references/diagnostics.md +62 -50
- package/pipeline/skills/shared/external/swift-concurrency/references/swiftui-concurrency.md +92 -121
- package/pipeline/skills/shared/external/swift-concurrency/references/synchronization-primitives.md +177 -241
- package/pipeline/skills/shared/external/swift-formatstyle/SKILL.md +258 -234
- package/pipeline/skills/shared/external/swift-language/SKILL.md +342 -382
- package/pipeline/skills/shared/external/swift-language/evals/evals.json +24 -27
- package/pipeline/skills/shared/external/swift-language/references/swift-attributes-interop.md +79 -56
- package/pipeline/skills/shared/external/swift-language/references/swift-patterns-extended.md +297 -340
- package/pipeline/skills/shared/external/swift-security/SKILL.md +180 -161
- package/pipeline/skills/shared/external/swift-security/evals/evals.json +25 -25
- package/pipeline/skills/shared/external/swift-security/references/biometric-authentication.md +314 -469
- package/pipeline/skills/shared/external/swift-security/references/certificate-trust.md +408 -476
- package/pipeline/skills/shared/external/swift-security/references/common-anti-patterns.md +260 -530
- package/pipeline/skills/shared/external/swift-security/references/compliance-owasp-mapping.md +270 -477
- package/pipeline/skills/shared/external/swift-security/references/credential-storage-patterns.md +573 -571
- package/pipeline/skills/shared/external/swift-security/references/cryptokit-public-key.md +370 -441
- package/pipeline/skills/shared/external/swift-security/references/cryptokit-symmetric.md +332 -433
- package/pipeline/skills/shared/external/swift-security/references/keychain-access-control.md +346 -468
- package/pipeline/skills/shared/external/swift-security/references/keychain-fundamentals.md +352 -472
- package/pipeline/skills/shared/external/swift-security/references/keychain-item-classes.md +431 -432
- package/pipeline/skills/shared/external/swift-security/references/keychain-sharing.md +328 -425
- package/pipeline/skills/shared/external/swift-security/references/migration-legacy-stores.md +341 -579
- package/pipeline/skills/shared/external/swift-security/references/secure-enclave.md +396 -457
- package/pipeline/skills/shared/external/swift-security/references/testing-security-code.md +354 -614
- package/pipeline/skills/shared/external/swift-testing/SKILL.md +188 -175
- package/pipeline/skills/shared/external/swift-testing/evals/evals.json +26 -24
- package/pipeline/skills/shared/external/swift-testing/references/testing-advanced.md +80 -84
- package/pipeline/skills/shared/external/swift-testing/references/testing-patterns.md +317 -433
- package/pipeline/skills/shared/external/swiftdata/SKILL.md +392 -256
- package/pipeline/skills/shared/external/swiftdata/evals/evals.json +24 -24
- package/pipeline/skills/shared/external/swiftdata/references/core-data-coexistence.md +206 -402
- package/pipeline/skills/shared/external/swiftdata/references/indexing.md +59 -52
- package/pipeline/skills/shared/external/swiftdata/references/predicate-pitfalls.md +57 -33
- package/pipeline/skills/shared/external/swiftdata/references/swiftdata-advanced.md +354 -747
- package/pipeline/skills/shared/external/swiftdata/references/swiftdata-queries.md +300 -508
- package/pipeline/skills/shared/external/swiftlint/SKILL.md +175 -226
- package/pipeline/skills/shared/external/swiftlint/references/adoption-and-configuration.md +141 -208
- package/pipeline/skills/shared/external/swiftlint/references/custom-rules-and-analyze.md +100 -109
- package/pipeline/skills/shared/external/swiftlint/references/plugins-run-scripts-and-integrations.md +159 -179
- package/pipeline/skills/shared/external/swiftlint/references/rule-reference.md +383 -18
- package/pipeline/skills/shared/external/swiftlint/references/rules-suppressions-and-baselines.md +143 -229
- package/pipeline/skills/shared/external/swiftui-animation/SKILL.md +283 -366
- package/pipeline/skills/shared/external/swiftui-animation/references/animation-advanced.md +396 -608
- package/pipeline/skills/shared/external/swiftui-animation/references/core-animation-bridge.md +336 -385
- package/pipeline/skills/shared/external/swiftui-gestures/SKILL.md +239 -349
- package/pipeline/skills/shared/external/swiftui-gestures/references/gesture-patterns.md +228 -310
- package/pipeline/skills/shared/external/swiftui-layout-components/SKILL.md +260 -249
- package/pipeline/skills/shared/external/swiftui-layout-components/references/form.md +92 -74
- package/pipeline/skills/shared/external/swiftui-layout-components/references/grids.md +112 -177
- package/pipeline/skills/shared/external/swiftui-layout-components/references/list.md +61 -64
- package/pipeline/skills/shared/external/swiftui-layout-components/references/scrollview.md +94 -134
- package/pipeline/skills/shared/external/swiftui-liquid-glass/SKILL.md +193 -225
- package/pipeline/skills/shared/external/swiftui-liquid-glass/references/liquid-glass.md +173 -327
- package/pipeline/skills/shared/external/swiftui-navigation/SKILL.md +193 -168
- package/pipeline/skills/shared/external/swiftui-navigation/references/deeplinks.md +127 -150
- package/pipeline/skills/shared/external/swiftui-navigation/references/navigationstack.md +132 -133
- package/pipeline/skills/shared/external/swiftui-navigation/references/sheets.md +152 -117
- package/pipeline/skills/shared/external/swiftui-navigation/references/tabview.md +106 -140
- package/pipeline/skills/shared/external/swiftui-patterns/SKILL.md +316 -252
- package/pipeline/skills/shared/external/swiftui-patterns/references/architecture-patterns.md +341 -332
- package/pipeline/skills/shared/external/swiftui-patterns/references/deprecated-migration.md +547 -854
- package/pipeline/skills/shared/external/swiftui-patterns/references/design-polish.md +485 -537
- package/pipeline/skills/shared/external/swiftui-patterns/references/platform-and-sharing.md +417 -499
- package/pipeline/skills/shared/external/swiftui-performance/SKILL.md +213 -376
- package/pipeline/skills/shared/external/swiftui-performance/references/demystify-swiftui-performance-wwdc23.md +86 -175
- package/pipeline/skills/shared/external/swiftui-performance/references/optimizing-swiftui-performance-instruments.md +89 -195
- package/pipeline/skills/shared/external/swiftui-performance/references/understanding-hangs-in-your-app.md +95 -182
- package/pipeline/skills/shared/external/swiftui-performance/references/understanding-improving-swiftui-performance.md +71 -149
- package/pipeline/skills/shared/external/swiftui-performance/references/wwdc-session-sources.md +21 -27
- package/pipeline/skills/shared/external/swiftui-uikit-interop/SKILL.md +303 -295
- package/pipeline/skills/shared/external/swiftui-uikit-interop/references/hosting-migration.md +204 -387
- package/pipeline/skills/shared/external/swiftui-uikit-interop/references/representable-recipes.md +469 -683
- package/pipeline/skills/shared/external/swiftui-webkit/SKILL.md +140 -186
- package/pipeline/skills/shared/external/swiftui-webkit/references/loading-and-observation.md +75 -86
- package/pipeline/skills/shared/external/swiftui-webkit/references/local-content-and-custom-schemes.md +63 -60
- package/pipeline/skills/shared/external/swiftui-webkit/references/migration-and-fallbacks.md +69 -137
- package/pipeline/skills/shared/external/swiftui-webkit/references/navigation-and-javascript.md +95 -67
- package/pipeline/skills/shared/external/tipkit/SKILL.md +220 -335
- package/pipeline/skills/shared/external/tipkit/references/tipkit-patterns.md +356 -494
- package/pipeline/skills/shared/external/vision-framework/SKILL.md +260 -375
- package/pipeline/skills/shared/external/vision-framework/references/vision-requests.md +393 -515
- package/pipeline/skills/shared/external/vision-framework/references/visionkit-scanner.md +363 -539
- package/pipeline/skills/shared/external/weatherkit/SKILL.md +152 -310
- package/pipeline/skills/shared/external/weatherkit/references/weatherkit-patterns.md +288 -407
- package/pipeline/skills/shared/external/widgetkit/SKILL.md +216 -288
- package/pipeline/skills/shared/external/widgetkit/references/widgetkit-advanced.md +414 -719
- package/pipeline/skills/shared/external/NOTICE-swift-ios-skills.md +0 -39
|
@@ -1,444 +1,292 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: natural-language
|
|
3
|
-
description: "
|
|
3
|
+
description: "NaturalLanguage and Translation frameworks: tokenizing, language identification, part-of-speech tagging, named entities, sentiment, word and sentence embeddings, custom NLModel classifiers, translation sheet, TranslationSession, batch translation. Use when analyzing or translating text in-app on iOS, macOS or visionOS."
|
|
4
4
|
metadata:
|
|
5
|
-
source:
|
|
5
|
+
source: multi-agent-pipeline
|
|
6
6
|
---
|
|
7
7
|
|
|
8
|
-
# NaturalLanguage
|
|
9
|
-
|
|
10
|
-
Analyze natural language text for tokenization, part-of-speech tagging, named
|
|
11
|
-
entity recognition, sentiment analysis, language identification, and word/sentence
|
|
12
|
-
embeddings. Translate text between languages with the Translation framework.
|
|
13
|
-
Targets Swift 6.3 / iOS 26+.
|
|
14
|
-
|
|
15
|
-
> This skill covers two related frameworks: **NaturalLanguage** (`NLTokenizer`, `NLTagger`, `NLEmbedding`) for on-device text analysis, and **Translation** (`TranslationSession`, `LanguageAvailability`) for language translation.
|
|
16
|
-
|
|
17
|
-
**Scope boundary:** Use this skill after you already have text. It owns
|
|
18
|
-
tokenization, language identification, POS/NER tagging, sentiment, embeddings,
|
|
19
|
-
custom `NLModel` classifiers/taggers, and in-app translation. Hand off OCR to
|
|
20
|
-
`vision-framework`, speech-to-text to `speech-recognition`, UI strings and
|
|
21
|
-
locale formatting to `ios-localization`, and generative summarization or Apple
|
|
22
|
-
Intelligence workflows to `apple-on-device-ai`.
|
|
23
|
-
|
|
24
|
-
## Contents
|
|
25
|
-
|
|
26
|
-
- [Setup](#setup)
|
|
27
|
-
- [Tokenization](#tokenization)
|
|
28
|
-
- [Language Identification](#language-identification)
|
|
29
|
-
- [Part-of-Speech Tagging](#part-of-speech-tagging)
|
|
30
|
-
- [Named Entity Recognition](#named-entity-recognition)
|
|
31
|
-
- [Sentiment Analysis](#sentiment-analysis)
|
|
32
|
-
- [Text Embeddings](#text-embeddings)
|
|
33
|
-
- [Translation](#translation)
|
|
34
|
-
- [Common Mistakes](#common-mistakes)
|
|
35
|
-
- [Review Checklist](#review-checklist)
|
|
36
|
-
- [References](#references)
|
|
37
|
-
|
|
38
|
-
## Setup
|
|
39
|
-
|
|
40
|
-
Import `NaturalLanguage` for text analysis and `Translation` for language
|
|
41
|
-
translation. No special entitlements or capabilities are required for
|
|
42
|
-
NaturalLanguage. Translation has split availability: system translation
|
|
43
|
-
presentation is iOS 17.4+ / macOS 14.4+, while `TranslationSession`,
|
|
44
|
-
`.translationTask()`, `LanguageAvailability`, and batch translation require
|
|
45
|
-
iOS 18+ / macOS 15+.
|
|
46
|
-
Direct `TranslationSession(installedSource:target:)` is the non-UI option, but
|
|
47
|
-
only when the source and target languages are already installed on device.
|
|
8
|
+
# NaturalLanguage and Translation
|
|
48
9
|
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
10
|
+
Two frameworks, one job each. NaturalLanguage analyses text on the device:
|
|
11
|
+
tokens, languages, word classes, entities, sentiment, embeddings and custom
|
|
12
|
+
Create ML models. Translation turns text from one language into another,
|
|
13
|
+
either through a system sheet or through a session you drive. Code assumes
|
|
14
|
+
Swift 6.3 and an iOS 26 deployment target.
|
|
15
|
+
|
|
16
|
+
## Scope
|
|
53
17
|
|
|
54
|
-
|
|
55
|
-
Use each instance from one thread or dispatch queue at a time.
|
|
18
|
+
This skill starts once you already have text. Hand off elsewhere for:
|
|
56
19
|
|
|
57
|
-
|
|
20
|
+
| Need | Skill |
|
|
21
|
+
|---|---|
|
|
22
|
+
| Reading text out of images (OCR) | `vision-framework` |
|
|
23
|
+
| Turning speech into text | `speech-recognition` |
|
|
24
|
+
| UI strings, String Catalogs, plurals, right-to-left layout, locale formatting | `ios-localization` |
|
|
25
|
+
| Generative summaries and other Apple Intelligence features | `apple-on-device-ai` |
|
|
58
26
|
|
|
59
|
-
|
|
27
|
+
## Setup and availability
|
|
60
28
|
|
|
61
29
|
```swift
|
|
62
30
|
import NaturalLanguage
|
|
63
|
-
|
|
64
|
-
func tokenizeWords(in text: String) -> [String] {
|
|
65
|
-
let tokenizer = NLTokenizer(unit: .word)
|
|
66
|
-
tokenizer.string = text
|
|
67
|
-
|
|
68
|
-
let range = text.startIndex..<text.endIndex
|
|
69
|
-
return tokenizer.tokens(for: range).map { String(text[$0]) }
|
|
70
|
-
}
|
|
31
|
+
import Translation
|
|
71
32
|
```
|
|
72
33
|
|
|
73
|
-
|
|
34
|
+
NaturalLanguage needs no capability or entitlement. For Translation:
|
|
74
35
|
|
|
75
|
-
|
|
|
36
|
+
| API | Minimum |
|
|
76
37
|
|---|---|
|
|
77
|
-
| `.
|
|
78
|
-
| `.
|
|
79
|
-
|
|
|
80
|
-
|
|
|
38
|
+
| `.translationPresentation(isPresented:text:)` system sheet | iOS 17.4, macOS 14.4 |
|
|
39
|
+
| `TranslationSession`, `.translationTask`, `LanguageAvailability`, batch requests | iOS 18, macOS 15 |
|
|
40
|
+
| `TranslationSession(installedSource:target:)` without any UI | iOS 26, macOS 26 |
|
|
41
|
+
| `TranslationSession.Strategy` selection | iOS 26.4, macOS 26.4 |
|
|
81
42
|
|
|
82
|
-
|
|
43
|
+
The Translation APIs are marked unavailable on visionOS, tvOS and watchOS
|
|
44
|
+
in the 26 SDKs; NaturalLanguage itself works on every Apple platform.
|
|
45
|
+
Use the UI-free `installedSource` initializer only when both languages are
|
|
46
|
+
already downloaded.
|
|
83
47
|
|
|
84
|
-
|
|
48
|
+
`NLTokenizer` and `NLTagger` are not thread-safe. Keep each instance on a
|
|
49
|
+
single thread or queue at a time.
|
|
85
50
|
|
|
86
|
-
|
|
87
|
-
let tokenizer = NLTokenizer(unit: .word)
|
|
88
|
-
tokenizer.string = text
|
|
51
|
+
## Tokenizing
|
|
89
52
|
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
return true // continue enumeration
|
|
95
|
-
}
|
|
53
|
+
```swift
|
|
54
|
+
let splitter = NLTokenizer(unit: .sentence)
|
|
55
|
+
splitter.string = review
|
|
56
|
+
let sentences = splitter.tokens(for: review.startIndex..<review.endIndex).map { review[$0] }
|
|
96
57
|
```
|
|
97
58
|
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
Detect the dominant language of a string with `NLLanguageRecognizer`.
|
|
59
|
+
Units are `.word`, `.sentence`, `.paragraph` and `.document`. Enumeration
|
|
60
|
+
also reports token attributes such as numbers and emoji:
|
|
101
61
|
|
|
102
62
|
```swift
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
//
|
|
108
|
-
func languageHypotheses(for text: String, max: Int = 5) -> [NLLanguage: Double] {
|
|
109
|
-
let recognizer = NLLanguageRecognizer()
|
|
110
|
-
recognizer.processString(text)
|
|
111
|
-
return recognizer.languageHypotheses(withMaximum: max)
|
|
63
|
+
let words = NLTokenizer(unit: .word)
|
|
64
|
+
words.string = receipt
|
|
65
|
+
words.enumerateTokens(in: receipt.startIndex..<receipt.endIndex) { span, traits in
|
|
66
|
+
if traits.contains(.numeric) { amounts.append(String(receipt[span])) }
|
|
67
|
+
return true // keep going
|
|
112
68
|
}
|
|
113
69
|
```
|
|
114
70
|
|
|
115
|
-
|
|
71
|
+
## Identifying the language
|
|
116
72
|
|
|
117
73
|
```swift
|
|
74
|
+
let guess = NLLanguageRecognizer.dominantLanguage(for: "Hvor er togstationen?")
|
|
75
|
+
|
|
118
76
|
let recognizer = NLLanguageRecognizer()
|
|
119
|
-
recognizer.
|
|
120
|
-
recognizer.
|
|
121
|
-
|
|
77
|
+
recognizer.processString(snippet)
|
|
78
|
+
let ranked = recognizer.languageHypotheses(withMaximum: 3) // [NLLanguage: Double]
|
|
79
|
+
|
|
80
|
+
recognizer.reset()
|
|
81
|
+
recognizer.languageConstraints = [.danish, .norwegian, .swedish]
|
|
82
|
+
recognizer.processString(snippet)
|
|
83
|
+
let bestNordic = recognizer.dominantLanguage
|
|
122
84
|
```
|
|
123
85
|
|
|
124
|
-
|
|
86
|
+
Constraining the candidate set helps a lot with short input.
|
|
125
87
|
|
|
126
|
-
|
|
88
|
+
## Part-of-speech tagging
|
|
127
89
|
|
|
128
90
|
```swift
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
tagger.enumerateTags(in: range, unit: .word, scheme: .lexicalClass, options: options) { tag, tokenRange in
|
|
138
|
-
if let tag {
|
|
139
|
-
results.append((String(text[tokenRange]), tag))
|
|
140
|
-
}
|
|
141
|
-
return true
|
|
142
|
-
}
|
|
143
|
-
return results
|
|
91
|
+
let tagger = NLTagger(tagSchemes: [.lexicalClass])
|
|
92
|
+
tagger.string = sentence
|
|
93
|
+
tagger.enumerateTags(in: sentence.startIndex..<sentence.endIndex,
|
|
94
|
+
unit: .word,
|
|
95
|
+
scheme: .lexicalClass,
|
|
96
|
+
options: [.omitPunctuation, .omitWhitespace]) { tag, span in
|
|
97
|
+
if tag == .verb { verbs.append(String(sentence[span])) }
|
|
98
|
+
return true
|
|
144
99
|
}
|
|
145
100
|
```
|
|
146
101
|
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
| Scheme | Output |
|
|
102
|
+
| Scheme | Produces |
|
|
150
103
|
|---|---|
|
|
151
|
-
| `.lexicalClass` |
|
|
152
|
-
| `.nameType` |
|
|
153
|
-
| `.nameTypeOrLexicalClass` |
|
|
154
|
-
| `.lemma` |
|
|
155
|
-
| `.language` |
|
|
156
|
-
| `.sentimentScore` |
|
|
157
|
-
|
|
158
|
-
## Named Entity Recognition
|
|
104
|
+
| `.lexicalClass` | Word class: noun, verb, adjective and so on |
|
|
105
|
+
| `.nameType` | Entity type |
|
|
106
|
+
| `.nameTypeOrLexicalClass` | Entity type where there is one, word class otherwise |
|
|
107
|
+
| `.lemma` | Dictionary form of the word |
|
|
108
|
+
| `.language` | Language of each token |
|
|
109
|
+
| `.sentimentScore` | Polarity score |
|
|
159
110
|
|
|
160
|
-
|
|
111
|
+
## Named entities
|
|
161
112
|
|
|
162
113
|
```swift
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
) { tag, tokenRange in
|
|
176
|
-
if let tag, tag != .other {
|
|
177
|
-
entities.append((String(text[tokenRange]), tag))
|
|
178
|
-
}
|
|
179
|
-
return true
|
|
114
|
+
let finder = NLTagger(tagSchemes: [.nameType])
|
|
115
|
+
finder.string = article
|
|
116
|
+
finder.enumerateTags(in: article.startIndex..<article.endIndex,
|
|
117
|
+
unit: .word,
|
|
118
|
+
scheme: .nameType,
|
|
119
|
+
options: [.omitPunctuation, .omitWhitespace, .joinNames]) { tag, span in
|
|
120
|
+
guard let tag, tag != .other else { return true }
|
|
121
|
+
switch tag {
|
|
122
|
+
case .personalName: people.insert(String(article[span]))
|
|
123
|
+
case .placeName: places.insert(String(article[span]))
|
|
124
|
+
case .organizationName: companies.insert(String(article[span]))
|
|
125
|
+
default: break
|
|
180
126
|
}
|
|
181
|
-
return
|
|
127
|
+
return true
|
|
182
128
|
}
|
|
183
|
-
// NLTag values: .personalName, .placeName, .organizationName
|
|
184
129
|
```
|
|
185
130
|
|
|
186
|
-
|
|
131
|
+
`.joinNames` keeps "Ada Lovelace" together as one entity.
|
|
132
|
+
|
|
133
|
+
## Sentiment
|
|
187
134
|
|
|
188
|
-
|
|
135
|
+
Scores run from -1.0 (negative) to +1.0 (positive). Some languages have no
|
|
136
|
+
model, so the result is optional.
|
|
189
137
|
|
|
190
138
|
```swift
|
|
191
|
-
func
|
|
192
|
-
let
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
let (tag, _) = tagger.tag(
|
|
196
|
-
at: text.startIndex,
|
|
197
|
-
unit: .paragraph,
|
|
198
|
-
scheme: .sentimentScore
|
|
199
|
-
)
|
|
139
|
+
func mood(of paragraph: String) -> Double? {
|
|
140
|
+
let scorer = NLTagger(tagSchemes: [.sentimentScore])
|
|
141
|
+
scorer.string = paragraph
|
|
142
|
+
let (tag, _) = scorer.tag(at: paragraph.startIndex, unit: .paragraph, scheme: .sentimentScore)
|
|
200
143
|
return tag.flatMap { Double($0.rawValue) }
|
|
201
144
|
}
|
|
202
145
|
```
|
|
203
146
|
|
|
204
|
-
##
|
|
205
|
-
|
|
206
|
-
Measure semantic similarity between words or sentences with `NLEmbedding`.
|
|
147
|
+
## Embeddings
|
|
207
148
|
|
|
208
149
|
```swift
|
|
209
|
-
func
|
|
210
|
-
guard let
|
|
211
|
-
|
|
150
|
+
func wordNeighbors() -> (gap: NLDistance, similar: [(String, NLDistance)])? {
|
|
151
|
+
guard let vectors = NLEmbedding.wordEmbedding(for: .english) else { return nil }
|
|
152
|
+
let gap = vectors.distance(between: "harbor", and: "port", distanceType: .cosine)
|
|
153
|
+
let similar = vectors.neighbors(for: "harbor", maximumCount: 5, distanceType: .cosine)
|
|
154
|
+
return (gap, similar)
|
|
212
155
|
}
|
|
213
156
|
|
|
214
|
-
func
|
|
215
|
-
|
|
216
|
-
|
|
157
|
+
func sentenceGap() -> NLDistance? {
|
|
158
|
+
NLEmbedding.sentenceEmbedding(for: .english)?.distance(between: "The ferry is late.",
|
|
159
|
+
and: "Our boat has been delayed.",
|
|
160
|
+
distanceType: .cosine)
|
|
217
161
|
}
|
|
218
162
|
```
|
|
219
163
|
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
```swift
|
|
223
|
-
func sentenceSimilarity(_ s1: String, _ s2: String) -> Double? {
|
|
224
|
-
guard let embedding = NLEmbedding.sentenceEmbedding(for: .english) else { return nil }
|
|
225
|
-
return embedding.distance(between: s1, and: s2, distanceType: .cosine)
|
|
226
|
-
}
|
|
227
|
-
```
|
|
164
|
+
Not every language ships embeddings; both factories can return `nil`.
|
|
165
|
+
`NLDistance` is a `Double`; smaller means closer.
|
|
228
166
|
|
|
229
167
|
## Translation
|
|
230
168
|
|
|
231
|
-
###
|
|
232
|
-
|
|
233
|
-
Show the built-in translation UI with `.translationPresentation()`.
|
|
169
|
+
### The system sheet
|
|
234
170
|
|
|
235
171
|
```swift
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
struct TranslatableView: View {
|
|
240
|
-
@State private var showTranslation = false
|
|
241
|
-
let text = "Hello, how are you?"
|
|
172
|
+
struct PhraseCard: View {
|
|
173
|
+
let phrase: String
|
|
174
|
+
@State private var showsTranslation = false
|
|
242
175
|
|
|
243
176
|
var body: some View {
|
|
244
|
-
Button {
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
.buttonStyle(.plain)
|
|
248
|
-
.translationPresentation(
|
|
249
|
-
isPresented: $showTranslation,
|
|
250
|
-
text: text
|
|
251
|
-
)
|
|
177
|
+
Button(phrase) { showsTranslation = true }
|
|
178
|
+
.buttonStyle(.plain)
|
|
179
|
+
.translationPresentation(isPresented: $showsTranslation, text: phrase)
|
|
252
180
|
}
|
|
253
181
|
}
|
|
254
182
|
```
|
|
255
183
|
|
|
256
|
-
###
|
|
184
|
+
### Translating in code
|
|
257
185
|
|
|
258
|
-
|
|
186
|
+
`.translationTask` hands you a session whenever its configuration becomes
|
|
187
|
+
non-nil or changes, so assigning a configuration is what starts the work.
|
|
188
|
+
Written inside `body`, the action closure is main-actor isolated, and
|
|
189
|
+
`TranslationSession` is not `Sendable`: Swift 6 rejects calling
|
|
190
|
+
`translate(_:)` from there. Mark the closure `@concurrent` and hop back to the
|
|
191
|
+
main actor to store the result.
|
|
259
192
|
|
|
260
193
|
```swift
|
|
261
|
-
struct
|
|
262
|
-
|
|
263
|
-
@State private var
|
|
264
|
-
@State private var
|
|
194
|
+
struct MenuTranslator: View {
|
|
195
|
+
let dish: String
|
|
196
|
+
@State private var request: TranslationSession.Configuration?
|
|
197
|
+
@State private var output = ""
|
|
265
198
|
|
|
266
199
|
var body: some View {
|
|
267
200
|
VStack {
|
|
268
|
-
Text(
|
|
269
|
-
Button("Translate") {
|
|
270
|
-
|
|
271
|
-
|
|
201
|
+
Text(output)
|
|
202
|
+
Button("Translate to Japanese") {
|
|
203
|
+
request = .init(source: Locale.Language(identifier: "it"),
|
|
204
|
+
target: Locale.Language(identifier: "ja"))
|
|
272
205
|
}
|
|
273
206
|
}
|
|
274
|
-
.translationTask(
|
|
207
|
+
.translationTask(request) { @concurrent session in
|
|
275
208
|
do {
|
|
276
|
-
let
|
|
277
|
-
await MainActor.run {
|
|
278
|
-
translatedText = response.targetText
|
|
279
|
-
translationErrorMessage = nil
|
|
280
|
-
}
|
|
209
|
+
let reply = try await session.translate(dish)
|
|
210
|
+
await MainActor.run { output = reply.targetText }
|
|
281
211
|
} catch {
|
|
282
|
-
|
|
283
|
-
await MainActor.run {
|
|
284
|
-
translationErrorMessage = message
|
|
285
|
-
}
|
|
212
|
+
await MainActor.run { output = "Translation failed: \(error.localizedDescription)" }
|
|
286
213
|
}
|
|
287
214
|
}
|
|
288
215
|
}
|
|
289
216
|
}
|
|
290
217
|
```
|
|
291
218
|
|
|
292
|
-
###
|
|
219
|
+
### Several strings at once
|
|
293
220
|
|
|
294
|
-
|
|
221
|
+
Give each request a `clientIdentifier` so you can match answers to inputs.
|
|
295
222
|
|
|
296
223
|
```swift
|
|
297
|
-
.
|
|
298
|
-
|
|
299
|
-
let requests = texts.enumerated().map { index, text in
|
|
300
|
-
TranslationSession.Request(sourceText: text,
|
|
301
|
-
clientIdentifier: "\(index)")
|
|
302
|
-
}
|
|
303
|
-
let responses = try await session.translations(from: requests)
|
|
304
|
-
for response in responses {
|
|
305
|
-
print("\(response.sourceText) -> \(response.targetText)")
|
|
306
|
-
}
|
|
307
|
-
} catch {
|
|
308
|
-
// Handle cancellation, unsupported languages, or download refusal.
|
|
309
|
-
}
|
|
224
|
+
let requests = menuItems.map {
|
|
225
|
+
TranslationSession.Request(sourceText: $0.name, clientIdentifier: $0.id)
|
|
310
226
|
}
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
```swift
|
|
316
|
-
let availability = LanguageAvailability()
|
|
317
|
-
let status = await availability.status(
|
|
318
|
-
from: Locale.Language(identifier: "en"),
|
|
319
|
-
to: Locale.Language(identifier: "ja")
|
|
320
|
-
)
|
|
321
|
-
switch status {
|
|
322
|
-
case .installed: break // Ready to translate offline
|
|
323
|
-
case .supported: break // Needs download
|
|
324
|
-
case .unsupported: break // Language pair not available
|
|
325
|
-
}
|
|
326
|
-
```
|
|
327
|
-
|
|
328
|
-
## Common Mistakes
|
|
329
|
-
|
|
330
|
-
### DON'T: Share NLTagger/NLTokenizer across threads
|
|
331
|
-
|
|
332
|
-
These classes are not thread-safe and will produce incorrect results or crash.
|
|
333
|
-
|
|
334
|
-
```swift
|
|
335
|
-
// WRONG
|
|
336
|
-
let sharedTagger = NLTagger(tagSchemes: [.lexicalClass])
|
|
337
|
-
DispatchQueue.concurrentPerform(iterations: 10) { _ in
|
|
338
|
-
sharedTagger.string = someText // Data race
|
|
339
|
-
}
|
|
340
|
-
|
|
341
|
-
// CORRECT
|
|
342
|
-
await withTaskGroup(of: Void.self) { group in
|
|
343
|
-
for _ in 0..<10 {
|
|
344
|
-
group.addTask {
|
|
345
|
-
let tagger = NLTagger(tagSchemes: [.lexicalClass])
|
|
346
|
-
tagger.string = someText
|
|
347
|
-
// process...
|
|
348
|
-
}
|
|
227
|
+
do {
|
|
228
|
+
let answers = try await session.translations(from: requests)
|
|
229
|
+
for answer in answers {
|
|
230
|
+
translated[answer.clientIdentifier ?? ""] = answer.targetText
|
|
349
231
|
}
|
|
232
|
+
} catch {
|
|
233
|
+
// cancelled, unsupported pair, or the user declined the download
|
|
350
234
|
}
|
|
351
235
|
```
|
|
352
236
|
|
|
353
|
-
###
|
|
354
|
-
|
|
355
|
-
NaturalLanguage provides built-in linguistic analysis. Use Core ML for custom
|
|
356
|
-
trained models. They complement each other via `NLModel`.
|
|
357
|
-
|
|
358
|
-
```swift
|
|
359
|
-
// WRONG: Trying to do NER with raw Core ML
|
|
360
|
-
let coreMLModel = try MLModel(contentsOf: modelURL)
|
|
361
|
-
|
|
362
|
-
// CORRECT: Use NLTagger for built-in NER
|
|
363
|
-
let tagger = NLTagger(tagSchemes: [.nameType])
|
|
364
|
-
|
|
365
|
-
// Or load a custom Core ML model via NLModel
|
|
366
|
-
let nlModel = try NLModel(mlModel: coreMLModel)
|
|
367
|
-
tagger.setModels([nlModel], forTagScheme: .nameType)
|
|
368
|
-
```
|
|
369
|
-
|
|
370
|
-
### DON'T: Assume embeddings exist for all languages
|
|
371
|
-
|
|
372
|
-
Not all languages have word or sentence embeddings available on device.
|
|
373
|
-
|
|
374
|
-
```swift
|
|
375
|
-
// WRONG: Force unwrap
|
|
376
|
-
let embedding = NLEmbedding.wordEmbedding(for: .japanese)!
|
|
377
|
-
|
|
378
|
-
// CORRECT: Handle nil
|
|
379
|
-
guard let embedding = NLEmbedding.wordEmbedding(for: .japanese) else {
|
|
380
|
-
// Embedding not available for this language
|
|
381
|
-
return
|
|
382
|
-
}
|
|
383
|
-
```
|
|
384
|
-
|
|
385
|
-
### DON'T: Create a new tagger per token
|
|
386
|
-
|
|
387
|
-
Creating and configuring a tagger is expensive. Reuse it for the same text.
|
|
237
|
+
### Checking a language pair first
|
|
388
238
|
|
|
389
239
|
```swift
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
tagger.enumerateTags(in: fullText.startIndex..<fullText.endIndex,
|
|
400
|
-
unit: .word, scheme: .lexicalClass, options: []) { tag, range in
|
|
401
|
-
return true
|
|
240
|
+
let pairState = await LanguageAvailability().status(
|
|
241
|
+
from: Locale.Language(identifier: "pt"),
|
|
242
|
+
to: Locale.Language(identifier: "de")
|
|
243
|
+
)
|
|
244
|
+
switch pairState {
|
|
245
|
+
case .installed: break // ready offline
|
|
246
|
+
case .supported: break // works after a download
|
|
247
|
+
case .unsupported: break // cannot translate this pair
|
|
248
|
+
@unknown default: break
|
|
402
249
|
}
|
|
403
250
|
```
|
|
404
251
|
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
252
|
+
## Common mistakes
|
|
253
|
+
|
|
254
|
+
- **Sharing a tagger between threads.** Driving one `NLTagger` from
|
|
255
|
+
`concurrentPerform` is a data race. Give each task its own instance, for
|
|
256
|
+
example one per child task in a task group.
|
|
257
|
+
- **Confusing NaturalLanguage with Core ML.** NaturalLanguage covers the
|
|
258
|
+
built-in analyses. A custom model trained in Create ML comes in through
|
|
259
|
+
`NLModel(mlModel:)` and `tagger.setModels(_:forTagScheme:)`, not as a raw
|
|
260
|
+
`MLModel` wired up by hand.
|
|
261
|
+
- **Force-unwrapping `wordEmbedding(for:)`.** Many languages have none.
|
|
262
|
+
- **A tagger per token.** Create the tagger once, set the whole string, then
|
|
263
|
+
enumerate.
|
|
264
|
+
- **Trusting detection on tiny strings.** Under about 20 characters it is
|
|
265
|
+
guesswork; add `languageHints` such as `[.english: 0.8, .french: 0.2]` or
|
|
266
|
+
`languageConstraints`.
|
|
267
|
+
|
|
268
|
+
## Review checklist
|
|
269
|
+
|
|
270
|
+
- [ ] Each tokenizer and tagger used from one thread at a time
|
|
423
271
|
- [ ] Tagger created once per text, not per token
|
|
424
|
-
- [ ]
|
|
425
|
-
- [ ] `NLEmbedding`
|
|
426
|
-
- [ ]
|
|
427
|
-
- [ ] `.translationTask
|
|
428
|
-
- [ ] Batch
|
|
429
|
-
- [ ] Sentiment
|
|
430
|
-
- [ ] `.joinNames`
|
|
431
|
-
- [ ] Custom
|
|
272
|
+
- [ ] Short text gets constraints or hints
|
|
273
|
+
- [ ] `NLEmbedding` results checked for `nil`
|
|
274
|
+
- [ ] `LanguageAvailability` consulted before translating
|
|
275
|
+
- [ ] `.translationTask` attached inside the SwiftUI view hierarchy
|
|
276
|
+
- [ ] Batch requests carry a `clientIdentifier`
|
|
277
|
+
- [ ] Sentiment handled as optional (unsupported languages give `nil`)
|
|
278
|
+
- [ ] Entity extraction uses `.joinNames`
|
|
279
|
+
- [ ] Custom models loaded through `NLModel`
|
|
432
280
|
|
|
433
281
|
## References
|
|
434
282
|
|
|
435
|
-
-
|
|
436
|
-
-
|
|
437
|
-
-
|
|
438
|
-
-
|
|
439
|
-
-
|
|
440
|
-
-
|
|
441
|
-
-
|
|
442
|
-
-
|
|
443
|
-
-
|
|
444
|
-
-
|
|
283
|
+
- [translation and analysis patterns](references/translation-patterns.md): custom models, contextual embeddings, gazetteers, multi-scheme tagging, in-place translation, strategies, session preparation, SwiftUI analyzer, tagger assets, lemmas
|
|
284
|
+
- https://developer.apple.com/documentation/naturallanguage
|
|
285
|
+
- https://developer.apple.com/documentation/naturallanguage/nltokenizer
|
|
286
|
+
- https://developer.apple.com/documentation/naturallanguage/nltagger
|
|
287
|
+
- https://developer.apple.com/documentation/naturallanguage/nlembedding
|
|
288
|
+
- https://developer.apple.com/documentation/naturallanguage/nllanguagerecognizer
|
|
289
|
+
- https://developer.apple.com/documentation/translation
|
|
290
|
+
- https://developer.apple.com/documentation/translation/translationsession
|
|
291
|
+
- https://developer.apple.com/documentation/translation/translationsession/strategy
|
|
292
|
+
- https://developer.apple.com/documentation/translation/languageavailability
|