Usando a estrutura de linguagem natural com o Xamarin.iOS
Introduzida no iOS 12, a estrutura de linguagem natural permite o processamento de linguagem natural no dispositivo. Ele oferece suporte a reconhecimento de idioma, tokenização e marcação. A tokenização divide o texto em palavras, frases ou parágrafos componentes; A marcação identifica partes do discurso, pessoas, lugares e organizações.
A estrutura de linguagem natural também pode usar modelos de ML principais personalizados para classificar e marcar texto em contextos especializados.
A classe NSLinguisticTagger ainda está disponível. No entanto, a estrutura de Linguagem Natural é o mecanismo preferido para uso para processamento de Linguagem Natural.
Aplicativo de exemplo: XamarinNL
Para saber como usar a estrutura de linguagem natural com o Xamarin.iOS, explore os seguintes conceitos:
- Reconhecer idiomas.
- Tokenize o texto em palavras e frases.
- Marcar entidades nomeadas e partes da fala.
Reconhecendo idiomas
A guia Reconhecedor do aplicativo de exemplo demonstra como usar um NLLanguageRecognizer
para determinar o idioma de um bloco de texto.
Observação
O reconhecimento de linguagem é um tipo específico de classificação de texto. A estrutura de linguagem natural também oferece suporte à classificação de texto personalizada por meio de modelos Core ML fornecidos pelo desenvolvedor. Para obter mais informações, dê uma olhada na sessão Introducing Natural Language Framework da WWDC 2018.
Língua dominante
Toque no botão Idioma para identificar o idioma dominante na entrada do usuário.
O HandleDetermineLanguageButtonTap
método dos LanguageRecognizerViewController
usos do GetDominantLanguage
método de um NLLanguageRecognizer
para buscar o NLLanguage
para o idioma principal encontrado no texto:
partial void HandleDetermineLanguageButtonTap(UIButton sender)
{
UserInput.ResignFirstResponder();
if (!String.IsNullOrWhiteSpace(UserInput.Text))
{
NLLanguage lang = NLLanguageRecognizer.GetDominantLanguage(UserInput.Text);
DominantLanguageLabel.Text = lang.ToString();
}
}
Probabilidades linguísticas
Toque no botão Probabilidades de idioma para buscar uma lista de hipóteses de idioma para a entrada do usuário.
O HandleLanguageProbabilitiesButtonTap
método da LanguageRecognizerViewController
classe instancia um NLLanguageRecognizer
e pede que ele Process
o texto do usuário. Em seguida, chama o reconhecedor de linguagem GetNativeLanguageHypotheses
método, que busca um dicionário de línguas e probabilidades associadas. A LanguageRecognizerTableViewController
classe então renderiza essas linguagens e 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);
}
}
Os valores potenciais NLLanguage
incluem:
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
Uma lista completa de idiomas suportados está disponível como parte do NLLanguage
Documentação da API enum.
Tokenizando texto em palavras, frases e parágrafos
A guia Tokenizer do aplicativo de exemplo demonstra como separar um bloco de texto em suas palavras ou frases componentes com um NLTokenizer
arquivo .
Toque no botão Palavras ou Frases para buscar uma lista de tokens. Cada token é associado a uma palavra ou frase no texto original.
ShowTokens
divide a entrada do usuário em tokens chamando o GetTokens
método de um NLTokenizer
. Esse método retorna uma matriz de NSValue
objetos, cada um encapsulando um NSRange
valor correspondente a um token no 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
Renderiza um único token em cada célula da tabela. Ele extrai um NSRange
de um token NSValue
, localiza a cadeia de caracteres correspondente no texto original e define um rótulo na célula de exibição de tabela:
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;
}
Marcando entidades nomeadas e partes da fala
A guia Tagger do aplicativo de exemplo XamarinNL demonstra como usar o NLTagger
para associar categorias a tokens de uma cadeia de caracteres de entrada.
A estrutura de Linguagem Natural inclui suporte interno para reconhecer pessoas, lugares, organizações e partes da fala.
Observação
A estrutura de linguagem natural também oferece suporte a esquemas de marcação personalizados por meio de modelos de ML Core fornecidos pelo desenvolvedor. Para obter mais informações, dê uma olhada na sessão Introducing Natural Language Framework da WWDC 2018.
Toque no botão Entidades nomeadas ou Partes da fala para buscar:
- Uma matriz de
NSValue
objetos, cada um encapsulando umNSRange
para um token no texto original. - Uma matriz de valores – categorias para os
NSValue
tokens no mesmo índice deNLTag
matriz.
Em LanguageTaggerViewController
, HandlePartsOfSpeechButtonTap
e HandleNamedEntitiesButtonTap
cada chamada ShowTags
, passando um NLTagScheme
– ou NLTagScheme.LexicalClass
(para partes do discurso) ou NLTagScheme.NameType
(para entidades nomeadas).
ShowTags
cria um NLTagger
, instanciando-o NLTagScheme
com uma matriz de tipos para os quais ele será consultado NLTagScheme
(nesse caso, apenas o valor passado). Em seguida, ele usa o GetTags
no NLTagger
para determinar as marcas relevantes para o texto na entrada do usuário.
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);
}
}
As tags são exibidas em uma tabela pelo LanguageTaggerTableViewController
.
Os valores potenciais NLTag
incluem:
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
Uma lista completa de tags suportadas está disponível como parte do NLTag
Documentação da API enum.