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.
- Tokenizar el texto en palabras y oraciones.
- Etiquetar entidades con nombre y partes del discurso.
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 unNSRange
para un token en el texto original. - Una matriz de valores
NLTag
: categorías para los tokensNSValue
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
.