Uso del framework del linguaggio naturale con Xamarin.iOS

Introdotto in iOS 12, il framework del linguaggio naturale abilita l'elaborazione del linguaggio naturale sul dispositivo. Supporta il riconoscimento della lingua, la tokenizzazione e l'assegnazione di tag. La tokenizzazione suddivide il testo in parole, frasi o paragrafi componenti; L'assegnazione di tag identifica parti del parlato, delle persone, dei luoghi e delle organizzazioni.

Il framework del linguaggio naturale può anche usare modelli di Core ML personalizzati per classificare e contrassegnare il testo in contesti specializzati.

La classe NSLinguisticTagger è ancora disponibile. Tuttavia, il framework del linguaggio naturale è il meccanismo preferito da usare per l'elaborazione del linguaggio naturale.

App di esempio: XamarinNL

Per informazioni su come usare il framework del linguaggio naturale con Xamarin.iOS, vedere l'app di esempio XamarinNL. Questa app di esempio illustra come usare il framework del linguaggio naturale per:

Riconoscimento delle lingue

La scheda Riconoscimento dell'app di esempio illustra come usare un NLLanguageRecognizer per determinare la lingua per un blocco di testo.

Nota

Il riconoscimento della lingua è un tipo specifico di classificazione del testo. Il framework del linguaggio naturale supporta anche la classificazione del testo personalizzata tramite i modelli Core ML forniti dallo sviluppatore. Per altre informazioni, vedere la sessione Introducing Natural Language Framework from WWDC 2018 (Introduzione a Natural Language Framework da WWDC 2018).

Linguaggio dominante

Toccare il pulsante Lingua per identificare la lingua dominante nell'input dell'utente.

Il HandleDetermineLanguageButtonTap metodo dell'oggetto utilizza l'oggetto LanguageRecognizerViewControllerGetDominantLanguage metodo di un NLLanguageRecognizer oggetto da recuperare NLLanguage per la lingua primaria presente nel testo:

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

Probabilità della lingua

Toccare il pulsante Probabilità lingua per recuperare un elenco di ipotesi di lingua per l'input dell'utente.

Il HandleLanguageProbabilitiesButtonTap metodo della LanguageRecognizerViewController classe crea un'istanza di e NLLanguageRecognizer chiede di Process testo dell'utente. Chiama quindi lo strumento di riconoscimento della lingua GetNativeLanguageHypotheses metodo, che recupera un dizionario di lingue e probabilità associate. La classe esegue quindi il LanguageRecognizerTableViewController rendering di queste lingue e probabilità.

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);
    }
}

I valori potenziali NLLanguage includono:

  • 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

Un elenco completo delle lingue supportate è disponibile come parte di NLLanguage Documentazione dell'API enum.

Tokenizzazione del testo in parole, frasi e paragrafi

La scheda Tokenizer dell'app di esempio illustra come separare un blocco di testo nelle parole o nelle frasi del componente con un oggetto NLTokenizer.

Toccare il pulsante Parole o Frasi per recuperare un elenco di token. Ogni token è associato a una parola o una frase nel testo originale.

ShowTokens suddivide l'input dell'utente in token chiamando GetTokens metodo di un oggetto NLTokenizer. Questo metodo restituisce una matrice di NSValue oggetti, ognuno dei quali esegue il wrapping di un NSRange valore corrispondente a un token nel testo originale.

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 esegue il rendering di un singolo token in ogni cella della tabella. Estrae un oggetto NSRange da un token NSValue, trova la stringa corrispondente nel testo originale e imposta un'etichetta nella cella di visualizzazione tabella:

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;
}

Assegnazione di tag a entità denominate e parti del riconoscimento vocale

La scheda Tagger dell'app di esempio XamarinNL illustra come usare NLTagger classe per associare le categorie ai token di una stringa di input. Il framework del linguaggio naturale include il supporto predefinito per il riconoscimento di persone, luoghi, organizzazioni e parti del parlato.

Nota

Il framework del linguaggio naturale supporta anche schemi di assegnazione di tag personalizzati tramite modelli Core ML forniti dallo sviluppatore. Per altre informazioni, vedere la sessione Introducing Natural Language Framework from WWDC 2018 (Introduzione a Natural Language Framework da WWDC 2018).

Toccare il pulsante Entità denominate o Parti del riconoscimento vocale per recuperare:

  • Matrice di oggetti, ognuno dei quali esegue il wrapping di NSValue un NSRange token nel testo originale.
  • Matrice di NLTag valori: categorie per i NSValue token nello stesso indice di matrice.

In LanguageTaggerViewControllere HandleNamedEntitiesButtonTap ogni chiamata ShowTagspassano un oggetto NLTagScheme , NLTagScheme.LexicalClass per parti del parlato, o NLTagScheme.NameType (per le HandlePartsOfSpeechButtonTap entità denominate).

ShowTags crea un'istanza NLTaggerdi , creando un'istanza con una matrice di NLTagScheme tipi per cui verrà eseguita una query (in questo caso, solo il valore passato NLTagScheme ). Usa quindi il GetTags metodo su NLTagger per determinare i tag rilevanti per il testo nell'input dell'utente.

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);
    }
}

I tag vengono quindi visualizzati in una tabella da LanguageTaggerTableViewController.

I valori potenziali NLTag includono:

  • 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

Un elenco completo dei tag supportati è disponibile come parte di NLTag Documentazione dell'API enum.