Usar el marco de lenguaje natural con Xamarin.iOS

Introducido en iOS 12, el marco de lenguaje natural habilita el procesamiento del lenguaje natural en el dispositivo. Admite el reconocimiento de idioma, la tokenización y el etiquetado. La tokenización divide el texto en las palabras, oraciones o párrafos que lo componen; el etiquetado identifica partes del discurso, personas, lugares y organizaciones.

El marco de lenguaje natural también puede usar modelos de Core ML personalizados para clasificar y etiquetar texto en contextos especializados.

La clase NSLinguisticTagger sigue estando disponible. Sin embargo, el marco de lenguaje natural es el mecanismo preferido para el procesamiento del lenguaje natural.

Aplicación de ejemplo: XamarinNL

Para aprender a usar el marco de lenguaje natural con Xamarin.iOS, explore los conceptos siguientes:

Reconocer idiomas

La pestaña Reconocedor de la aplicación de ejemplo muestra cómo usar un NLLanguageRecognizer para determinar el idioma de un bloque de texto.

Nota:

El reconocimiento del idioma es un tipo específico de clasificación de texto. El marco de lenguaje natural también admite la clasificación de texto personalizado a través de modelos de Core ML proporcionados por el desarrollador. Para obtener más información, eche un vistazo a la sesión Introducción al marco de lenguaje natural de WWDC 2018.

Idioma dominante

Pulse el botón Idioma para identificar el idioma dominante en la entrada de usuario.

El método HandleDetermineLanguageButtonTap del LanguageRecognizerViewController usa el método GetDominantLanguage de un NLLanguageRecognizer para capturar el NLLanguage para el idioma principal que se encuentra en el texto:

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

Probabilidades de idioma

Pulse el botón Probabilidades de idioma para capturar una lista de hipótesis de idioma para la entrada del usuario.

El método HandleLanguageProbabilitiesButtonTap de la clase LanguageRecognizerViewController crea una instancia de un NLLanguageRecognizer y le pide que Process el texto del usuario. A continuación, llama al método GetNativeLanguageHypotheses del reconocedor de idiomas, que captura un diccionario de idiomas y las probabilidades asociadas. A continuación, la clase LanguageRecognizerTableViewController representa estos idiomas y probabilidades.

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

Entre los posibles valores NLLanguage se incluyen:

  • 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

Hay disponible una lista completa de los idiomas admitidos en la documentación de la API de enumeración NLLanguage.

Tokenizar texto en palabras, oraciones y párrafos

La pestaña Tokenizador de la aplicación de ejemplo muestra cómo separar un bloque de texto en las palabras u oraciones que lo componen con un NLTokenizer.

Pulse el botón Palabras u Oraciones para capturar una lista de tokens. Cada token está asociado a una palabra u oración en el texto original.

ShowTokens divide la entrada del usuario en tokens mediante una llamada a un método GetTokens de un NLTokenizer. Este método devuelve una matriz de objetos NSValue, cada uno de los cuales ajusta un valor correspondiente NSRange a un token en el texto original.

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 representa un único token en cada celda de tabla. Extrae un NSRange de un token NSValue, busca la cadena correspondiente en el texto original y establece una etiqueta en la celda de vista de tabla:

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

Etiquetado de entidades con nombre y partes del discurso

La pestaña Etiquetador de la aplicación de ejemplo de XamarinNL muestra cómo usar la clase NLTagger para asociar categorías a tokens de una cadena de entrada. El marco de lenguaje natural incluye compatibilidad integrada para reconocer personas, lugares, organizaciones y partes del discurso.

Nota:

El marco de lenguaje natural también admite esquemas de etiquetado personalizado a través de modelos de Core ML proporcionados por el desarrollador. Para obtener más información, eche un vistazo a la sesión Introducción al marco de lenguaje natural de WWDC 2018.

Pulse el botón Entidades con nombre o Partes del discurso para capturar:

  • Una matriz de objetos NSValue, cada una de las cuales ajusta un NSRange para un token en el texto original.
  • Una matriz de valores NLTag: categorías para los tokens NSValue en el mismo índice de matriz.

En LanguageTaggerViewController, HandlePartsOfSpeechButtonTap y HandleNamedEntitiesButtonTap cada llamada ShowTags, pasando un NLTagScheme, ya sea NLTagScheme.LexicalClass (para partes del discurso) o NLTagScheme.NameType (para entidades con nombre).

ShowTags crea un NLTagger, lo que crea una instancia con una matriz de tipos NLTagScheme para los que se consultará (en este caso, solo el valor NLTagScheme pasado). A continuación, use el método GetTags en el NLTagger para determinar las etiquetas pertinentes para el texto de la entrada de usuario.

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

A continuación, las etiquetas se muestran en una tabla mediante el LanguageTaggerTableViewController.

Entre los posibles valores NLTag se incluyen:

  • 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

Hay disponible una lista completa de etiquetas admitidas en la documentación de la API de enumeración NLTag.