NaturalLanguage —— 是苹果公司在iOS和macOS设备上进行自然语言处理的框架,提供分词、语言识别、词性标注、词形还原和命名实体识别等功能。根据Apple WWDC 2020,该框架在设备上执行所有分析,无需将数据发送到服务器,从而确保用户数据的隐私性。NaturalLanguage支持30多种语言,并与Core ML集成以支持自定义NLP模型。
要点
NaturalLanguage(NL)——是苹果公司用于自然语言分析的机器学习框架,是Foundation的一部分,可在iOS 12+、macOS 10.14+和watchOS 5+上使用。该框架提供即用型NLP功能,无需训练自己的模型。
与云端NLP服务(Google Cloud NLP、Amazon Comprehend)不同,NaturalLanguage在设备上执行所有分析。这意味着网络请求零延迟、可在离线模式下工作以及完全数据隐私 —— 文本不会离开用户的设备。
根据Apple ML Research 2023,在A12+芯片上进行设备端NLP处理请求的速度比类似云解决方案快3–5倍,基本任务精度保持在85%以上。该框架针对Neural Engine进行了优化,在现代设备上每秒可处理多达100个请求。
NaturalLanguage用于iOS应用程序中的评论分析、智能搜索、自动完成、内容审核以及从非结构化文本中提取结构化数据。该框架支持30多种语言,包括中文、乌克兰语、土耳其语和阿拉伯语。
NLTokenizer —— 是一个用于将文本分割成语言单位的类:单词、句子、段落或文档。分词几乎是任何NLP流程的第一步,NaturalLanguage以即用形式提供它。
NLTokenizer会考虑语言特征:它正确处理日语(单词之间无空格)、阿拉伯语(从右到左书写)和中文(象形文字)的分词。对于英语和中文,分词器基于空格和标点符号工作,但会考虑缩写。
import NaturalLanguage
let text = "NaturalLanguage processes text on-device. It supports 30+ languages!"
let tokenizer = NLTokenizer(unit: .word)
tokenizer.string = text
tokenizer.enumerateTokens(in: text.startIndex..<text.endIndex) { range, _ in
print(text[range])
return true
}
在句子级别进行分词有助于将大文本分割成逻辑块以便进一步分析。NLTokenizerSentence即使在末尾没有句号或有疑问句的情况下也能确定句子边界。
let sentenceTokenizer = NLTokenizer(unit: .sentence)
sentenceTokenizer.string = text
sentenceTokenizer.enumerateTokens(in: text.startIndex..<text.endIndex) { range, _ in
print("Sentence: \\(text[range])")
return true
}
NLTokenizer —— 是NaturalLanguage所有其他功能的基础。分词后,文本即可用于语言识别、标注和词形还原。
NLLanguageRecognizer确定文本的语言并返回最可能的选项以及置信度。该框架支持30多种语言,可以处理任何长度的文本 —— 从单个单词到整个文档。
NLLanguageRecognizer算法分析字符的n-gram并将其与语言配置文件进行比较。对于短文本(最多50个字符),准确度会下降,因此Apple建议发送至少100–200个字符以确保可靠的语言确定。
import NaturalLanguage
let recognizer = NLLanguageRecognizer()
recognizer.processString("Hello, how are you? I am learning NaturalLanguage.")
if let language = recognizer.dominantLanguage {
print("Dominant language: \\(language.rawValue)") // "ru"
}
let hypotheses = recognizer.languageHypotheses(withMaximum: 3)
for (lang, prob) in hypotheses {
print("\\(lang.rawValue): \\(prob)")
}
languageHypotheses方法返回一个包含概率降序排列的语言字典。当文本包含混合语言或需要向用户显示多个选项供选择而不仅仅是主导语言时,这非常有用。
NaturalLanguage确定中文的准确度对于100个字符以上的文本为95%。对于短文本(1–2个单词),准确度降至60–70% —— 在这种情况下,最好使用languageHypotheses并显示前三个选项。
NLTagScheme提供用于语言分析的标注方案:词性(名词、动词、形容词)、词元(单词的正常形式)、实体类型(人物、组织、地点)和其他类别。
词形还原将单词转换为其词典形式:“跑了”→“跑”,“更好”→“好”,“books”→“book”。这对于搜索和文本分析至关重要 —— 没有词形还原,“猫”和“猫的”被视为不同的token,这会降低NLP流程的质量。
import NaturalLanguage
let tagger = NLTagger(tagSchemes: [.lemma, .lexicalClass])
tagger.string = "The cats were running quickly."
tagger.enumerateTags(in: tagger.string!.startIndex..<tagger.string!.endIndex,
unit: .word,
scheme: .lexicalClass) { tag, range in
print("\\(tagger.string![range]): \\(tag?.rawValue ?? "unknown")"
}
输出示例:cats → Noun,were → Verb,quickly → Adverb。结合词形还原和词性,可以构建智能搜索,通过查询“跑猫”找到“跑步的猫”。
NLTagScheme.lemma适用于NaturalLanguage支持的所有语言,包括中文。这使得NLTagger成为多语言应用程序的通用工具,无需为每种语言加载单独的模型。
命名实体识别(NER)—— 是从文本中提取命名实体的任务:人名、组织名称、地理位置和个人数据。NaturalLanguage通过NLTagScheme.nameType支持NER。
NLTagScheme.nameType区分三种实体类型:PersonalName(人名)、OrganizationName(组织、公司)和PlaceName(地理名称)。这使得可以从新闻、邮件和评论中自动提取结构化数据。
let nerTagger = NLTagger(tagSchemes: [.nameType])
nerTagger.string = "Tim Cook announced Apple's new headquarters in Cupertino."
nerTagger.enumerateTags(in: nerTagger.string!.startIndex..<nerTagger.string!.endIndex,
unit: .word,
scheme: .nameType) { tag, range in
if tag != nil {
print("\\(nerTagger.string![range]): \\(tag!.rawValue)"
}
}
结果:Tim Cook → PersonalName,Apple → OrganizationName,Cupertino → PlaceName。NaturalLanguage的NER无需自定义训练,即可立即用于英语、法语、德语、西班牙语和其他语言。
对于中文,NER受支持但准确度略低 —— 约70–75%,而英语为85%。如果需要对中文具有高准确度,Apple建议使用Create ML在自己的数据上训练自定义Core ML模型。
NLModel —— 是一个用于处理经过训练的Core ML NLP模型的类,包括由Apple预训练的内置情感分析模型。该模型确定文本的情感倾向:正面、负面或中性。
内置的情感分析模型在App Store评论上进行了训练,适用于英语、法语、德语、意大利语、西班牙语、葡萄牙语、中文和日语。对于其他语言,模型没有预训练 —— 需要Create ML和自己标记的数据。
import NaturalLanguage
let sentimentPredictor = try NLModel(mlModel: SentimentModel().model)
let sentiment = sentimentPredictor.predictedLabel(for: "这个应用程序太棒了!")
print("Sentiment: \\(sentiment ?? "neutral")") // "positive"
NLModel还支持通过Create ML训练的自定义模型。您可以在自己的数据(产品类别、支持请求类型、语言风格)上训练文本分类模型,并通过相同的NLModel接口使用它。
根据Apple Create ML documentation 2024,自定义文本模型在500–5000个样本上进行训练以达到80–95%的准确度。NaturalLanguage加载模型一次并将其缓存以供后续调用,从而最大限度地减少重复请求的延迟。
| NLP任务 | NaturalLanguage类 | 中文支持 |
|---|---|---|
| 分词 | NLTokenizer | 是 |
| 语言识别 | NLLanguageRecognizer | 是 |
| 词形还原 | NLTagger + .lemma | 是 |
| 词性 | NLTagger + .lexicalClass | 是 |
| NER | NLTagger + .nameType | 有限 |
| 情感 | NLModel(预训练) | 是 |
常见问题
NaturalLanguage提供即用型NLP模型,无需训练:分词、语言识别、NER。Core ML需要在您自己的数据上训练模型,并为特定任务提供更多灵活性。NaturalLanguage更适合“开箱即用”的基本任务,Core ML则适用于高度专业化的任务。
是的,NaturalLanguage完全在设备上工作,无需互联网连接。所有模型都内置于iOS和macOS中,数据不会发送到服务器。这是与需要网络并产生隐私风险的云端NLP服务相比的关键优势。
NaturalLanguage支持30多种语言,包括中文、英语、西班牙语、法语、德语、意大利语、葡萄牙语、日语、韩语、阿拉伯语、土耳其语和乌克兰语。所有支持的语言的分词和词形还原准确度都很高,NER和情感分析主要针对英语。
使用Create ML —— 苹果公司的无需编程即可训练机器学习模型的应用程序。加载标记的数据集(CSV或JSON),选择文本分类或标注任务,训练模型并导出为Core ML格式(.mlmodel)。然后通过代码中的NLModel(mlModel:)加载模型。
NaturalLanguage适用于iOS 12+、macOS 10.14+、watchOS 5+和tvOS 12+。在配备A12+芯片和Neural Engine的设备上,性能更高 —— 由于机器学习的硬件加速,文本处理速度提高3–5倍。在较旧的设备上(A11及更早版本),框架可以工作但速度较慢。
总结
我们将开发一款交钥匙移动应用程序
IT Sectr自2017年以来为初创企业和企业打造iOS和Android应用程序。我们将为您提供咨询并提出最佳解决方案。