将自然语言框架与 Xamarin.iOS 配合使用

自然语言框架在 iOS 12 中引入,支持设备上的自然语言处理。 它支持语言识别、标记和标记。 标记化将文本拆分为其组件字词、句子或段落;标记可标识语音、人员、地点和组织的各个部分。

自然语言框架还可以使用自定义 Core ML 模型在专用上下文中对文本进行分类和标记。

NSLinguisticTagger 类仍然可用。 但是,自然语言框架是用于自然语言处理的首选机制。

示例应用:XamarinNL

若要了解如何将自然语言框架与 Xamarin.iOS 配合使用,请查看 XamarinNL 示例应用。 此示例应用演示如何使用自然语言框架以:

识别语言

示例应用的“识别器”选项卡演示如何使用 NLLanguageRecognizer 以确定文本块的语言。

注意

语言识别是一种特定的文本分类类型。 自然语言框架还支持通过开发人员提供的 Core ML 模型进行自定义文本分类。 有关详细信息,请查看 WWDC 2018 中的“自然语言框架简介”会话。

主要语言

点击“语言”按钮,识别用户输入中的主要语言。

LanguageRecognizerViewControllerHandleDetermineLanguageButtonTap 方法使用 NLLanguageRecognizerGetDominantLanguage 方法用于提取 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 值包括:

  • Amharic
  • Arabic
  • Armenian
  • Bengali
  • Bulgarian
  • Burmese
  • Catalan
  • Cherokee
  • Croatian
  • Czech
  • Danish
  • Dutch
  • English
  • Finnish
  • French
  • Georgian
  • German
  • Greek
  • Gujarati
  • Hebrew
  • Hindi
  • Hungarian
  • Icelandic
  • Indonesian
  • Italian
  • Japanese
  • Kannada
  • Khmer
  • Korean
  • Lao
  • Malay
  • Malayalam
  • Marathi
  • Mongolian
  • Norwegian
  • Oriya
  • Persian
  • Polish
  • Portuguese
  • Punjabi
  • Romanian
  • Russian
  • SimplifiedChinese
  • Sinhalese
  • Slovak
  • Spanish
  • Swedish
  • Tamil
  • Telugu
  • Thai
  • Tibetan
  • TraditionalChinese
  • Turkish
  • Ukrainian
  • Undetermined
  • Urdu
  • Vietnamese

支持的语言的完整列表作为以下内容的一部分提供 NLLanguage枚举 API 文档。

将文本标记为单词、句子和段落

示例应用的 Tokenizer 选项卡演示了如何使用 NLTokenizer 将文本块分隔到其组件字词或句子中。

点击“字词”或“句子”按钮以提取令牌列表。 每个标记都与原始文本中的单词或句子相关联。

ShowTokens 通过调用以下内容将用户的输入拆分为令牌 NLTokenizerGetTokens方法。 此方法会返回一个数组 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 中,HandlePartsOfSpeechButtonTapHandleNamedEntitiesButtonTap 均调用 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 值包括:

  • Adjective
  • Adverb
  • Classifier
  • CloseParenthesis
  • CloseQuote
  • Conjunction
  • Dash
  • Determiner
  • Idiom
  • Interjection
  • Noun
  • Number
  • OpenParenthesis
  • OpenQuote
  • OrganizationName
  • Other
  • OtherPunctuation
  • OtherWhitespace
  • OtherWord
  • ParagraphBreak
  • Particle
  • PersonalName
  • PlaceName
  • Preposition
  • Pronoun
  • Punctuation
  • SentenceTerminator
  • Verb
  • Whitespace
  • Word
  • WordJoiner

支持标记的完整列表作为以下内容的一部分提供 NLTag 枚举 API 文档。