自然语言框架在 iOS 12 中引入,支持设备上的自然语言处理。 它支持语言识别、标记和标记。 标记化将文本拆分为其组件字词、句子或段落;标记可标识语音、人员、地点和组织的各个部分。
自然语言框架还可以使用自定义 Core ML 模型在专用上下文中对文本进行分类和标记。
NSLinguisticTagger 类仍然可用。 但是,自然语言框架是用于自然语言处理的首选机制。
示例应用:XamarinNL
若要了解如何将自然语言框架与 Xamarin.iOS 配合使用,请浏览以下概念:
识别语言
示例应用的“识别器”选项卡演示如何使用 NLLanguageRecognizer 以确定文本块的语言。
注意
语言识别是一种特定的文本分类类型。 自然语言框架还支持通过开发人员提供的 Core ML 模型进行自定义文本分类。 有关详细信息,请查看 WWDC 2018 中的“自然语言框架简介”会话。
主要语言
点击“语言”按钮,识别用户输入中的主要语言。
LanguageRecognizerViewController 的 HandleDetermineLanguageButtonTap 方法使用 NLLanguageRecognizer 的 GetDominantLanguage 方法用于提取 NLLanguage 用于文本中找到的主要语言:
partial void HandleDetermineLanguageButtonTap(UIButton sender)
{
UserInput.ResignFirstResponder();
if (!String.IsNullOrWhiteSpace(UserInput.Text))
{
NLLanguage lang = NLLanguageRecognizer.GetDominantLanguage(UserInput.Text);
DominantLanguageLabel.Text = lang.ToString();
}
}
语言概率
点击“语言概率”按钮,获取用户输入的语言假设列表。
LanguageRecognizerViewController 类的 HandleLanguageProbabilitiesButtonTap 方法实例化 NLLanguageRecognizer 并要求它 Process 用户的文本。 然后,它会调用语言识别器 GetNativeLanguageHypotheses 方法,该方法提取语言字典和相关概率。 然后,LanguageRecognizerTableViewController 类呈现这些语言和概率。
partial void HandleLanguageProbabilitiesButtonTap(UIButton sender)
{
UserInput.ResignFirstResponder();
if (!String.IsNullOrWhiteSpace(UserInput.Text))
{
var recognizer = new NLLanguageRecognizer();
recognizer.Process(UserInput.Text);
NSDictionary<NSString, NSNumber> probabilities = recognizer.GetNativeLanguageHypotheses(10);
PerformSegue(ShowLanguageProbabilitiesSegue, this);
}
}
潜在 NLLanguage 值包括:
AmharicArabicArmenianBengaliBulgarianBurmeseCatalanCherokeeCroatianCzechDanishDutchEnglishFinnishFrenchGeorgianGermanGreekGujaratiHebrewHindiHungarianIcelandicIndonesianItalianJapaneseKannadaKhmerKoreanLaoMalayMalayalamMarathiMongolianNorwegianOriyaPersianPolishPortuguesePunjabiRomanianRussianSimplifiedChineseSinhaleseSlovakSpanishSwedishTamilTeluguThaiTibetanTraditionalChineseTurkishUkrainianUndeterminedUrduVietnamese
支持的语言的完整列表作为以下内容的一部分提供 NLLanguage枚举 API 文档。
将文本标记为单词、句子和段落
示例应用的 Tokenizer 选项卡演示了如何使用 NLTokenizer 将文本块分隔到其组件字词或句子中。
点击“字词”或“句子”按钮以提取令牌列表。 每个标记都与原始文本中的单词或句子相关联。
ShowTokens 通过调用以下内容将用户的输入拆分为令牌 NLTokenizer 的 GetTokens方法。 此方法会返回一个数组 NSValue 对象,每个对象包装与原始文本中的标记对应的 NSRange 值。
void ShowTokens(NLTokenUnit unit)
{
if (!String.IsNullOrWhiteSpace(UserInput.Text))
{
var tokenizer = new NLTokenizer(unit);
tokenizer.String = UserInput.Text;
var range = new NSRange(0, UserInput.Text.Length);
NSValue[] tokens = tokenizer.GetTokens(range);
PerformSegue(ShowTokensSegue, this);
}
}
LanguageTokenizerTableViewController 在每个表单元格中呈现单个标记。 它从令牌 NSValue 中提取 NSRange,在原始文本中找到相应的字符串,并在表视图单元格上设置标签:
public override UITableViewCell GetCell(UITableView tableView, NSIndexPath indexPath)
{
var cell = TableView.DequeueReusableCell(TokenCell);
NSRange range = Tokens[indexPath.Row].RangeValue;
cell.TextLabel.Text = Text.Substring((int)range.Location, (int)range.Length);
return cell;
}
标记命名实体和词性
XamarinNL 示例应用的“标记器”选项卡演示了如何使用 NLTagger 类将类别与输入字符串的标记相关联。
自然语言框架包括对识别人员、地点、组织和词性的内置支持。
注意
自然语言框架还支持通过开发人员提供的 Core ML 模型自定义标记方案。 有关详细信息,请查看 WWDC 2018 中的“自然语言框架简介”会话。
点击“命名实体”或“词性”按钮以提取:
- 一个由
NSValue对象构成的数组,每个对象在原始文本中包装令牌的NSRange。 - 一个
NLTag值的数组 - 用于相同数组索引处的NSValue令牌的类别。
在 LanguageTaggerViewController 中,HandlePartsOfSpeechButtonTap 和 HandleNamedEntitiesButtonTap 均调用 ShowTags,传递 NLTagScheme,即 NLTagScheme.LexicalClass (对于词性)或 NLTagScheme.NameType(对于命名实体)。
ShowTags 创建一个 NLTagger,并使用要查询其 NLTagScheme 类型的数组(在本例中,仅传入 NLTagScheme 值)。 然后,它使用 GetTags 方法在 NLTagger 上用于确定与用户输入中的文本相关的标记。
void ShowTags(NLTagScheme tagScheme)
{
if (!String.IsNullOrWhiteSpace(UserInput.Text))
{
var tagger = new NLTagger(new NLTagScheme[] { tagScheme });
var range = new NSRange(0, UserInput.Text.Length);
tagger.String = UserInput.Text;
NLTag[] tags = tagger.GetTags(range, NLTokenUnit.Word, tagScheme, NLTaggerOptions.OmitWhitespace, out NSValue[] ranges);
NSValue[] tokenRanges = ranges;
detailViewTitle = tagScheme == NLTagScheme.NameType ? "Named Entities" : "Parts of Speech";
PerformSegue(ShowEntitiesSegue, this);
}
}
然后,标记由该 LanguageTaggerTableViewController 表显示。
潜在 NLTag 值包括:
AdjectiveAdverbClassifierCloseParenthesisCloseQuoteConjunctionDashDeterminerIdiomInterjectionNounNumberOpenParenthesisOpenQuoteOrganizationNameOtherOtherPunctuationOtherWhitespaceOtherWordParagraphBreakParticlePersonalNamePlaceNamePrepositionPronounPunctuationSentenceTerminatorVerbWhitespaceWordWordJoiner
支持标记的完整列表作为以下内容的一部分提供 NLTag 枚举 API 文档。