搭配 Xamarin.iOS 使用自然語言架構

在 iOS 12 中引進,自然語言架構可啟用裝置上的自然語言處理。 它支援語言辨識、標記化和標記。 標記化會將文字分割成其元件文字、句子或段落;標記可識別語音、人員、地點和組織的各個部分。

自然語言架構也可以使用自定義核心 ML 模型,在特製化內容中分類和標記文字。

NSLinguisticTagger 類別仍然可用。 不過,自然語言架構是用於自然語言處理的慣用機制。

範例應用程式:XamarinNL

若要瞭解如何搭配 Xamarin.iOS 使用自然語言架構,請參閱 XamarinNL 範例應用程式。 此範例應用程式示範如何使用自然語言架構來:

辨識語言

範例應用程式的辨識器索引標籤示範如何使用NLLanguageRecognizer 以判斷文字區塊的語言。

注意

語言辨識是特定類型的文字分類。 Natural Language 架構也透過開發人員提供的 Core ML 模型支援自定義文字分類。 如需詳細資訊,請參閱 WWDC 2018 簡介自然語言架構 研討會。

主要語言

點選 [ 語言] 按鈕,以識別使用者輸入中的主要語言。

HandleDetermineLanguageButtonTapLanguageRecognizerViewController 方法會使用GetDominantLanguage 要擷取 之 NLLanguageRecognizer 的方法 NLLanguage 在文字中找到的主要語言:

partial void HandleDetermineLanguageButtonTap(UIButton sender)
{
    UserInput.ResignFirstResponder();
    if (!String.IsNullOrWhiteSpace(UserInput.Text))
    {
        NLLanguage lang = NLLanguageRecognizer.GetDominantLanguage(UserInput.Text);
        DominantLanguageLabel.Text = lang.ToString();
    }
}

語言機率

點選 [ 語言機率] 按鈕,以擷取使用者輸入的語言假設清單。

類別 HandleLanguageProbabilitiesButtonTapLanguageRecognizerViewController 方法會具現化 , 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 藉由呼叫 ,將使用者的輸入分割成令牌 GetTokensNLTokenizer方法。 這個方法會傳回的陣列 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 類別,將類別與輸入字串的標記產生關聯。 自然語言架構包含內建支援,可辨識人員、地點、組織和語音的一部分。

注意

Natural Language 架構也支援透過開發人員提供的 Core ML 模型自定義標記配置。 如需詳細資訊,請參閱 WWDC 2018 簡介自然語言架構 研討會。

點選 [具名實體 ] 或 [語音 元件] 按鈕以擷取:

  • 物件的陣列,每個物件 NSValue 都會在 NSRange 原始文字中包裝標記的 。
  • 值的陣列 NLTag – 位於相同陣列索引之 NSValue 標記的類別。

LanguageTaggerViewController中, HandlePartsOfSpeechButtonTap 以及 HandleNamedEntitiesButtonTap 每個呼叫 ShowTags,傳遞 NLTagScheme - NLTagScheme.LexicalClass 或 (針對語音部分) 或 NLTagScheme.NameType (針對具名實體)。

ShowTagsNLTagger會建立 ,以將查詢的類型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 檔。