{"id":"f3422d67-7167-4e98-a32c-9a3fb9a5d180","shortId":"e9PQWh","kind":"skill","title":"Natural Language","tagline":"Swift Ios Skills skill by Dpearson2699","description":"# NaturalLanguage + Translation\n\nAnalyze natural language text for tokenization, part-of-speech tagging, named\nentity recognition, sentiment analysis, language identification, and word/sentence\nembeddings. Translate text between languages with the Translation framework.\nTargets Swift 6.3 / iOS 26+.\n\n> This skill covers two related frameworks: **NaturalLanguage** (`NLTokenizer`, `NLTagger`, `NLEmbedding`) for on-device text analysis, and **Translation** (`TranslationSession`, `LanguageAvailability`) for language translation.\n\n## Contents\n\n- [Setup](#setup)\n- [Tokenization](#tokenization)\n- [Language Identification](#language-identification)\n- [Part-of-Speech Tagging](#part-of-speech-tagging)\n- [Named Entity Recognition](#named-entity-recognition)\n- [Sentiment Analysis](#sentiment-analysis)\n- [Text Embeddings](#text-embeddings)\n- [Translation](#translation)\n- [Common Mistakes](#common-mistakes)\n- [Review Checklist](#review-checklist)\n- [References](#references)\n\n## Setup\n\nImport `NaturalLanguage` for text analysis and `Translation` for language\ntranslation. No special entitlements or capabilities are required for\nNaturalLanguage. Translation requires iOS 17.4+ / macOS 14.4+.\n\n```swift\nimport NaturalLanguage\nimport Translation\n```\n\nNaturalLanguage classes (`NLTokenizer`, `NLTagger`) are **not thread-safe**.\nUse each instance from one thread or dispatch queue at a time.\n\n## Tokenization\n\nSegment text into words, sentences, or paragraphs with `NLTokenizer`.\n\n```swift\nimport NaturalLanguage\n\nfunc tokenizeWords(in text: String) -> [String] {\n    let tokenizer = NLTokenizer(unit: .word)\n    tokenizer.string = text\n\n    let range = text.startIndex..<text.endIndex\n    return tokenizer.tokens(for: range).map { String(text[$0]) }\n}\n```\n\n### Token Units\n\n| Unit | Description |\n|---|---|\n| `.word` | Individual words |\n| `.sentence` | Sentences |\n| `.paragraph` | Paragraphs |\n| `.document` | Entire document |\n\n### Enumerating with Attributes\n\nUse `enumerateTokens(in:using:)` to detect numeric or emoji tokens.\n\n```swift\nlet tokenizer = NLTokenizer(unit: .word)\ntokenizer.string = text\n\ntokenizer.enumerateTokens(in: text.startIndex..<text.endIndex) { range, attributes in\n    if attributes.contains(.numeric) {\n        print(\"Number: \\(text[range])\")\n    }\n    return true // continue enumeration\n}\n```\n\n## Language Identification\n\nDetect the dominant language of a string with `NLLanguageRecognizer`.\n\n```swift\nfunc detectLanguage(for text: String) -> NLLanguage? {\n    NLLanguageRecognizer.dominantLanguage(for: text)\n}\n\n// Multiple hypotheses with confidence scores\nfunc languageHypotheses(for text: String, max: Int = 5) -> [NLLanguage: Double] {\n    let recognizer = NLLanguageRecognizer()\n    recognizer.processString(text)\n    return recognizer.languageHypotheses(withMaximum: max)\n}\n```\n\nConstrain the recognizer to expected languages for better accuracy on short text.\n\n```swift\nlet recognizer = NLLanguageRecognizer()\nrecognizer.languageConstraints = [.english, .french, .spanish]\nrecognizer.processString(text)\nlet detected = recognizer.dominantLanguage\n```\n\n## Part-of-Speech Tagging\n\nIdentify nouns, verbs, adjectives, and other lexical classes with `NLTagger`.\n\n```swift\nfunc tagPartsOfSpeech(in text: String) -> [(String, NLTag)] {\n    let tagger = NLTagger(tagSchemes: [.lexicalClass])\n    tagger.string = text\n\n    var results: [(String, NLTag)] = []\n    let range = text.startIndex..<text.endIndex\n    let options: NLTagger.Options = [.omitPunctuation, .omitWhitespace]\n\n    tagger.enumerateTags(in: range, unit: .word, scheme: .lexicalClass, options: options) { tag, tokenRange in\n        if let tag {\n            results.append((String(text[tokenRange]), tag))\n        }\n        return true\n    }\n    return results\n}\n```\n\n### Common Tag Schemes\n\n| Scheme | Output |\n|---|---|\n| `.lexicalClass` | Part of speech (noun, verb, adjective) |\n| `.nameType` | Named entity type (person, place, organization) |\n| `.nameTypeOrLexicalClass` | Combined NER + POS |\n| `.lemma` | Base form of a word |\n| `.language` | Per-token language |\n| `.sentimentScore` | Sentiment polarity score |\n\n## Named Entity Recognition\n\nExtract people, places, and organizations.\n\n```swift\nfunc extractEntities(from text: String) -> [(String, NLTag)] {\n    let tagger = NLTagger(tagSchemes: [.nameType])\n    tagger.string = text\n\n    var entities: [(String, NLTag)] = []\n    let options: NLTagger.Options = [.omitPunctuation, .omitWhitespace, .joinNames]\n\n    tagger.enumerateTags(\n        in: text.startIndex..<text.endIndex,\n        unit: .word,\n        scheme: .nameType,\n        options: options\n    ) { tag, tokenRange in\n        if let tag, tag != .other {\n            entities.append((String(text[tokenRange]), tag))\n        }\n        return true\n    }\n    return entities\n}\n// NLTag values: .personalName, .placeName, .organizationName\n```\n\n## Sentiment Analysis\n\nScore text sentiment from -1.0 (negative) to +1.0 (positive).\n\n```swift\nfunc sentimentScore(for text: String) -> Double? {\n    let tagger = NLTagger(tagSchemes: [.sentimentScore])\n    tagger.string = text\n\n    let (tag, _) = tagger.tag(\n        at: text.startIndex,\n        unit: .paragraph,\n        scheme: .sentimentScore\n    )\n    return tag.flatMap { Double($0.rawValue) }\n}\n```\n\n## Text Embeddings\n\nMeasure semantic similarity between words or sentences with `NLEmbedding`.\n\n```swift\nfunc wordSimilarity(_ word1: String, _ word2: String) -> Double? {\n    guard let embedding = NLEmbedding.wordEmbedding(for: .english) else { return nil }\n    return embedding.distance(between: word1, and: word2, distanceType: .cosine)\n}\n\nfunc findSimilarWords(to word: String, count: Int = 5) -> [(String, Double)] {\n    guard let embedding = NLEmbedding.wordEmbedding(for: .english) else { return [] }\n    return embedding.neighbors(for: word, maximumCount: count, distanceType: .cosine)\n}\n```\n\nSentence embeddings compare entire sentences.\n\n```swift\nfunc sentenceSimilarity(_ s1: String, _ s2: String) -> Double? {\n    guard let embedding = NLEmbedding.sentenceEmbedding(for: .english) else { return nil }\n    return embedding.distance(between: s1, and: s2, distanceType: .cosine)\n}\n```\n\n## Translation\n\n### System Translation Overlay\n\nShow the built-in translation UI with `.translationPresentation()`.\n\n```swift\nimport SwiftUI\nimport Translation\n\nstruct TranslatableView: View {\n    @State private var showTranslation = false\n    let text = \"Hello, how are you?\"\n\n    var body: some View {\n        Text(text)\n            .onTapGesture { showTranslation = true }\n            .translationPresentation(\n                isPresented: $showTranslation,\n                text: text\n            )\n    }\n}\n```\n\n### Programmatic Translation\n\nUse `.translationTask()` for programmatic translations within a view context.\n\n```swift\nstruct TranslatingView: View {\n    @State private var translatedText = \"\"\n    @State private var configuration: TranslationSession.Configuration?\n\n    var body: some View {\n        VStack {\n            Text(translatedText)\n            Button(\"Translate\") {\n                configuration = .init(source: Locale.Language(identifier: \"en\"),\n                                      target: Locale.Language(identifier: \"es\"))\n            }\n        }\n        .translationTask(configuration) { session in\n            let response = try await session.translate(\"Hello, world!\")\n            translatedText = response.targetText\n        }\n    }\n}\n```\n\n### Batch Translation\n\nTranslate multiple strings in a single session.\n\n```swift\n.translationTask(configuration) { session in\n    let requests = texts.enumerated().map { index, text in\n        TranslationSession.Request(sourceText: text,\n                                    clientIdentifier: \"\\(index)\")\n    }\n    let responses = try await session.translations(from: requests)\n    for response in responses {\n        print(\"\\(response.sourceText) -> \\(response.targetText)\")\n    }\n}\n```\n\n### Checking Language Availability\n\n```swift\nlet availability = LanguageAvailability()\nlet status = await availability.status(\n    from: Locale.Language(identifier: \"en\"),\n    to: Locale.Language(identifier: \"ja\")\n)\nswitch status {\ncase .installed: break    // Ready to translate offline\ncase .supported: break    // Needs download\ncase .unsupported: break  // Language pair not available\n}\n```\n\n## Common Mistakes\n\n### DON'T: Share NLTagger/NLTokenizer across threads\n\nThese classes are not thread-safe and will produce incorrect results or crash.\n\n```swift\n// WRONG\nlet sharedTagger = NLTagger(tagSchemes: [.lexicalClass])\nDispatchQueue.concurrentPerform(iterations: 10) { _ in\n    sharedTagger.string = someText  // Data race\n}\n\n// CORRECT\nawait withTaskGroup(of: Void.self) { group in\n    for _ in 0..<10 {\n        group.addTask {\n            let tagger = NLTagger(tagSchemes: [.lexicalClass])\n            tagger.string = someText\n            // process...\n        }\n    }\n}\n```\n\n### DON'T: Confuse NaturalLanguage with Core ML\n\nNaturalLanguage provides built-in linguistic analysis. Use Core ML for custom\ntrained models. They complement each other via `NLModel`.\n\n```swift\n// WRONG: Trying to do NER with raw Core ML\nlet coreMLModel = try MLModel(contentsOf: modelURL)\n\n// CORRECT: Use NLTagger for built-in NER\nlet tagger = NLTagger(tagSchemes: [.nameType])\n\n// Or load a custom Core ML model via NLModel\nlet nlModel = try NLModel(mlModel: coreMLModel)\ntagger.setModels([nlModel], forTagScheme: .nameType)\n```\n\n### DON'T: Assume embeddings exist for all languages\n\nNot all languages have word or sentence embeddings available on device.\n\n```swift\n// WRONG: Force unwrap\nlet embedding = NLEmbedding.wordEmbedding(for: .japanese)!\n\n// CORRECT: Handle nil\nguard let embedding = NLEmbedding.wordEmbedding(for: .japanese) else {\n    // Embedding not available for this language\n    return\n}\n```\n\n### DON'T: Create a new tagger per token\n\nCreating and configuring a tagger is expensive. Reuse it for the same text.\n\n```swift\n// WRONG: New tagger per word\nfor word in words {\n    let tagger = NLTagger(tagSchemes: [.lexicalClass])\n    tagger.string = word\n}\n\n// CORRECT: Set string once, enumerate\nlet tagger = NLTagger(tagSchemes: [.lexicalClass])\ntagger.string = fullText\ntagger.enumerateTags(in: fullText.startIndex..<fullText.endIndex,\n                     unit: .word, scheme: .lexicalClass, options: []) { tag, range in\n    return true\n}\n```\n\n### DON'T: Ignore language hints for short text\n\nLanguage detection on short strings (under ~20 characters) is unreliable.\nSet constraints or hints to improve accuracy.\n\n```swift\n// WRONG: Detect language of a single word\nlet lang = NLLanguageRecognizer.dominantLanguage(for: \"chat\")  // French or English?\n\n// CORRECT: Provide context\nlet recognizer = NLLanguageRecognizer()\nrecognizer.languageHints = [.english: 0.8, .french: 0.2]\nrecognizer.processString(\"chat\")\n```\n\n## Review Checklist\n\n- [ ] `NLTokenizer` and `NLTagger` instances used from a single thread\n- [ ] Tagger created once per text, not per token\n- [ ] Language detection uses constraints/hints for short text\n- [ ] `NLEmbedding` availability checked before use (returns nil if unavailable)\n- [ ] Translation `LanguageAvailability` checked before attempting translation\n- [ ] `.translationTask()` used within a SwiftUI view hierarchy\n- [ ] Batch translation uses `clientIdentifier` to match responses to requests\n- [ ] Sentiment scores handled as optional (may return nil for unsupported languages)\n- [ ] `.joinNames` option used with NER to keep multi-word names together\n- [ ] Custom ML models loaded via `NLModel`, not raw Core ML\n\n## References\n\n- Extended patterns (custom models, contextual embeddings, gazetteers): [references/translation-patterns.md](references/translation-patterns.md)\n- [Natural Language framework](https://sosumi.ai/documentation/naturallanguage)\n- [NLTokenizer](https://sosumi.ai/documentation/naturallanguage/nltokenizer)\n- [NLTagger](https://sosumi.ai/documentation/naturallanguage/nltagger)\n- [NLEmbedding](https://sosumi.ai/documentation/naturallanguage/nlembedding)\n- [NLLanguageRecognizer](https://sosumi.ai/documentation/naturallanguage/nllanguagerecognizer)\n- [Translation framework](https://sosumi.ai/documentation/translation)\n- [TranslationSession](https://sosumi.ai/documentation/translation/translationsession)\n- [LanguageAvailability](https://sosumi.ai/documentation/translation/languageavailability)","tags":["natural","language","swift","ios","skills","dpearson2699"],"capabilities":["skill","source-dpearson2699","category-swift-ios-skills"],"categories":["swift-ios-skills"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/dpearson2699/swift-ios-skills/natural-language","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"install_from":"skills.sh"}},"qualityScore":"0.300","qualityRationale":"deterministic score 0.30 from registry signals: · indexed on skills.sh · published under dpearson2699/swift-ios-skills","verified":false,"liveness":"unknown","lastLivenessCheck":null,"agentReviews":{"count":0,"score_avg":null,"cost_usd_avg":null,"success_rate":null,"latency_p50_ms":null,"narrative_summary":null,"summary_updated_at":null},"enrichmentModel":"deterministic:skill:v1","enrichmentVersion":1,"enrichedAt":"2026-04-22T03:40:33.622Z","embedding":null,"createdAt":"2026-04-18T20:34:33.972Z","updatedAt":"2026-04-22T03:40:33.622Z","lastSeenAt":"2026-04-22T03:40:33.622Z","tsv":"'+1.0':511 '-1.0':508 '/documentation/naturallanguage)':1214 '/documentation/naturallanguage/nlembedding)':1226 '/documentation/naturallanguage/nllanguagerecognizer)':1230 '/documentation/naturallanguage/nltagger)':1222 '/documentation/naturallanguage/nltokenizer)':1218 '/documentation/translation)':1235 '/documentation/translation/languageavailability)':1243 '/documentation/translation/translationsession)':1239 '0':208,860 '0.2':1106 '0.8':1104 '0.rawvalue':539 '10':845,861 '14.4':144 '17.4':142 '20':1069 '26':44 '5':295,583 '6.3':42 'accuraci':315,1079 'across':820 'adject':340,410 'analysi':26,60,96,99,124,503,884 'analyz':11 'assum':948 'attempt':1148 'attribut':225,249 'attributes.contains':252 'avail':776,779,813,962,986,1136 'availability.status':784 'await':728,763,783,852 'base':423 'batch':734,1157 'better':314 'bodi':665,703 'break':797,804,809 'built':639,881,919 'built-in':638,880,918 'button':709 'capabl':134 'case':795,802,807 'category-swift-ios-skills' 'charact':1070 'chat':1092,1108 'check':774,1137,1146 'checklist':113,116,1110 'class':151,344,823 'clientidentifi':758,1160 'combin':419 'common':107,110,399,814 'common-mistak':109 'compar':604 'complement':893 'confid':286 'configur':700,711,722,745,1001 'confus':873 'constrain':307 'constraint':1074 'constraints/hints':1131 'content':68 'contentsof':912 'context':688,1098 'contextu':1204 'continu':260 'core':876,886,906,931,1197 'coremlmodel':909,941 'correct':851,914,974,1029,1096 'cosin':575,601,631 'count':581,599 'cover':47 'crash':835 'creat':993,999,1121 'custom':889,930,1189,1202 'data':849 'descript':212 'detect':231,264,330,1064,1082,1129 'detectlanguag':275 'devic':58,964 'dispatch':166 'dispatchqueue.concurrentperform':843 'distancetyp':574,600,630 'document':220,222 'domin':266 'doubl':297,519,538,558,585,614 'download':806 'dpearson2699':8 'els':565,592,621,983 'embed':31,101,104,541,561,588,603,617,949,961,970,979,984,1205 'embedding.distance':569,625 'embedding.neighbors':595 'emoji':234 'en':716,788 'english':324,564,591,620,1095,1103 'entir':221,605 'entiti':23,89,93,413,438,461,496 'entities.append':488 'entitl':132 'enumer':223,261,1033 'enumeratetoken':227 'es':720 'exist':950 'expect':311 'expens':1005 'extend':1200 'extract':440 'extractent':447 'fals':657 'findsimilarword':577 'forc':967 'form':424 'fortagschem':944 'framework':39,50,1211,1232 'french':325,1093,1105 'fulltext':1040 'fulltext.endindex':1044 'fulltext.startindex':1043 'func':184,274,288,348,446,514,552,576,608 'gazett':1206 'group':856 'group.addtask':862 'guard':559,586,615,977 'handl':975,1168 'hello':660,730 'hierarchi':1156 'hint':1059,1076 'hypothes':284 'identif':28,74,77,263 'identifi':337,715,719,787,791 'ignor':1057 'import':120,146,148,182,646,648 'improv':1078 'incorrect':832 'index':752,759 'individu':214 'init':712 'instal':796 'instanc':161,1114 'int':294,582 'io':4,43,141 'ispres':674 'iter':844 'ja':792 'japanes':973,982 'joinnam':469,1177 'keep':1183 'lang':1089 'languag':2,13,27,35,66,73,76,128,262,267,312,428,432,775,810,953,956,989,1058,1063,1083,1128,1176,1210 'language-identif':75 'languageavail':64,780,1145,1240 'languagehypothes':289 'lemma':422 'let':190,197,237,298,320,329,355,366,370,388,453,464,484,520,527,560,587,616,658,725,748,760,778,781,838,863,908,922,936,969,978,1022,1034,1088,1099 'lexic':343 'lexicalclass':359,381,404,842,867,1026,1038,1048 'linguist':883 'load':928,1192 'locale.language':714,718,786,790 'maco':143 'map':205,751 'match':1162 'max':293,306 'maximumcount':598 'may':1171 'measur':542 'mistak':108,111,815 'ml':877,887,907,932,1190,1198 'mlmodel':911,940 'model':891,933,1191,1203 'modelurl':913 'multi':1185 'multi-word':1184 'multipl':283,737 'name':22,88,92,412,437,1187 'named-entity-recognit':91 'nametyp':411,457,477,926,945 'nametypeorlexicalclass':418 'natur':1,12,1209 'naturallanguag':9,51,121,138,147,150,183,874,878 'need':805 'negat':509 'ner':420,903,921,1181 'new':995,1014 'nil':567,623,976,1141,1173 'nlembed':54,550,1135,1223 'nlembedding.sentenceembedding':618 'nlembedding.wordembedding':562,589,971,980 'nllanguag':279,296 'nllanguagerecogn':272,300,322,1101,1227 'nllanguagerecognizer.dominantlanguage':280,1090 'nlmodel':897,935,937,939,943,1194 'nltag':354,365,452,463,497 'nltagger':53,153,346,357,455,522,840,865,916,924,1024,1036,1113,1219 'nltagger.options':372,466 'nltagger/nltokenizer':819 'nltoken':52,152,180,192,239,1111,1215 'noun':338,408 'number':255 'numer':232,253 'offlin':801 'omitpunctu':373,467 'omitwhitespac':374,468 'on-devic':56 'one':163 'ontapgestur':670 'option':371,382,383,465,478,479,1049,1170,1178 'organ':417,444 'organizationnam':501 'output':403 'overlay':635 'pair':811 'paragraph':178,218,219,533 'part':18,79,84,333,405 'part-of-speech':17,78,332 'part-of-speech-tag':83 'pattern':1201 'peopl':441 'per':430,997,1016,1123,1126 'per-token':429 'person':415 'personalnam':499 'place':416,442 'placenam':500 'polar':435 'pos':421 'posit':512 'print':254,771 'privat':654,694,698 'process':870 'produc':831 'programmat':678,683 'provid':879,1097 'queue':167 'race':850 'rang':198,204,248,257,367,377,1051 'raw':905,1196 'readi':798 'recogn':299,309,321,1100 'recognit':24,90,94,439 'recognizer.dominantlanguage':331 'recognizer.languageconstraints':323 'recognizer.languagehints':1102 'recognizer.languagehypotheses':304 'recognizer.processstring':301,327,1107 'refer':117,118,1199 'references/translation-patterns.md':1207,1208 'relat':49 'request':749,766,1165 'requir':136,140 'respons':726,761,768,770,1163 'response.sourcetext':772 'response.targettext':733,773 'result':363,398,833 'results.append':390 'return':201,258,303,395,397,493,495,536,566,568,593,594,622,624,990,1053,1140,1172 'reus':1006 'review':112,115,1109 'review-checklist':114 's1':610,627 's2':612,629 'safe':158,828 'scheme':380,401,402,476,534,1047 'score':287,436,504,1167 'segment':172 'semant':543 'sentenc':176,216,217,548,602,606,960 'sentencesimilar':609 'sentiment':25,95,98,434,502,506,1166 'sentiment-analysi':97 'sentimentscor':433,515,524,535 'session':723,742,746 'session.translate':729 'session.translations':764 'set':1030,1073 'setup':69,70,119 'share':818 'sharedtagg':839 'sharedtagger.string':847 'short':317,1061,1066,1133 'show':636 'showtransl':656,671,675 'similar':544 'singl':741,1086,1118 'skill':5,6,46 'sometext':848,869 'sosumi.ai':1213,1217,1221,1225,1229,1234,1238,1242 'sosumi.ai/documentation/naturallanguage)':1212 'sosumi.ai/documentation/naturallanguage/nlembedding)':1224 'sosumi.ai/documentation/naturallanguage/nllanguagerecognizer)':1228 'sosumi.ai/documentation/naturallanguage/nltagger)':1220 'sosumi.ai/documentation/naturallanguage/nltokenizer)':1216 'sosumi.ai/documentation/translation)':1233 'sosumi.ai/documentation/translation/languageavailability)':1241 'sosumi.ai/documentation/translation/translationsession)':1237 'sourc':713 'source-dpearson2699' 'sourcetext':756 'spanish':326 'special':131 'speech':20,81,86,335,407 'state':653,693,697 'status':782,794 'string':188,189,206,270,278,292,352,353,364,391,450,451,462,489,518,555,557,580,584,611,613,738,1031,1067 'struct':650,690 'support':803 'swift':3,41,145,181,236,273,319,347,445,513,551,607,645,689,743,777,836,898,965,1012,1080 'swiftui':647,1154 'switch':793 'system':633 'tag':21,82,87,336,384,389,394,400,480,485,486,492,528,1050 'tag.flatmap':537 'tagger':356,454,521,864,923,996,1003,1015,1023,1035,1120 'tagger.enumeratetags':375,470,1041 'tagger.setmodels':942 'tagger.string':360,458,525,868,1027,1039 'tagger.tag':529 'tagpartsofspeech':349 'tagschem':358,456,523,841,866,925,1025,1037 'target':40,717 'text':14,33,59,100,103,123,173,187,196,207,243,256,277,282,291,302,318,328,351,361,392,449,459,490,505,517,526,540,659,668,669,676,677,707,753,757,1011,1062,1124,1134 'text-embed':102 'text.endindex':200,247,369,473 'text.startindex':199,246,368,472,531 'texts.enumerated':750 'thread':157,164,821,827,1119 'thread-saf':156,826 'time':170 'togeth':1188 'token':16,71,72,171,191,209,235,238,431,998,1127 'tokenizer.enumeratetokens':244 'tokenizer.string':195,242 'tokenizer.tokens':202 'tokenizeword':185 'tokenrang':385,393,481,491 'train':890 'translat':10,32,38,62,67,105,106,126,129,139,149,632,634,641,649,679,684,710,735,736,800,1144,1149,1158,1231 'translatableview':651 'translatedtext':696,708,732 'translatingview':691 'translationpresent':644,673 'translationsess':63,1236 'translationsession.configuration':701 'translationsession.request':755 'translationtask':681,721,744,1150 'tri':727,762,900,910,938 'true':259,396,494,672,1054 'two':48 'type':414 'ui':642 'unavail':1143 'unit':193,210,211,240,378,474,532,1045 'unreli':1072 'unsupport':808,1175 'unwrap':968 'use':159,226,229,680,885,915,1115,1130,1139,1151,1159,1179 'valu':498 'var':362,460,655,664,695,699,702 'verb':339,409 'via':896,934,1193 'view':652,667,687,692,705,1155 'void.self':855 'vstack':706 'within':685,1152 'withmaximum':305 'withtaskgroup':853 'word':175,194,213,215,241,379,427,475,546,579,597,958,1017,1019,1021,1028,1046,1087,1186 'word/sentence':30 'word1':554,571 'word2':556,573 'wordsimilar':553 'world':731 'wrong':837,899,966,1013,1081","prices":[{"id":"1982b877-4c37-4790-b803-43cf5cfb5462","listingId":"f3422d67-7167-4e98-a32c-9a3fb9a5d180","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"dpearson2699","category":"swift-ios-skills","install_from":"skills.sh"},"createdAt":"2026-04-18T20:34:33.972Z"}],"sources":[{"listingId":"f3422d67-7167-4e98-a32c-9a3fb9a5d180","source":"github","sourceId":"dpearson2699/swift-ios-skills/natural-language","sourceUrl":"https://github.com/dpearson2699/swift-ios-skills/tree/main/skills/natural-language","isPrimary":false,"firstSeenAt":"2026-04-18T22:01:07.471Z","lastSeenAt":"2026-04-22T00:53:43.780Z"},{"listingId":"f3422d67-7167-4e98-a32c-9a3fb9a5d180","source":"skills_sh","sourceId":"dpearson2699/swift-ios-skills/natural-language","sourceUrl":"https://skills.sh/dpearson2699/swift-ios-skills/natural-language","isPrimary":true,"firstSeenAt":"2026-04-18T20:34:33.972Z","lastSeenAt":"2026-04-22T03:40:33.622Z"}],"details":{"listingId":"f3422d67-7167-4e98-a32c-9a3fb9a5d180","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"dpearson2699","slug":"natural-language","source":"skills_sh","category":"swift-ios-skills","skills_sh_url":"https://skills.sh/dpearson2699/swift-ios-skills/natural-language"},"updatedAt":"2026-04-22T03:40:33.622Z"}}