将自然语言框架与 Xamarin.iOS 配合使用
自然语言框架在 iOS 12 中引入,支持设备上的自然语言处理。 它支持语言识别、标记和标记。 标记化将文本拆分为其组件字词、句子或段落;标记可标识语音、人员、地点和组织的各个部分。
自然语言框架还可以使用自定义 Core ML 模型在专用上下文中对文本进行分类和标记。
NSLinguisticTagger 类仍然可用。 但是,自然语言框架是用于自然语言处理的首选机制。
示例应用:XamarinNL
若要了解如何将自然语言框架与 Xamarin.iOS 配合使用,请浏览以下概念:
识别语言
示例应用的“识别器”选项卡演示如何使用 NLLanguageRecognizer
以确定文本块的语言。
注意
语言识别是一种特定的文本分类类型。 自然语言框架还支持通过开发人员提供的 Core ML 模型进行自定义文本分类。 有关详细信息,请查看 WWDC 2018 中的“自然语言框架简介”会话。
主要语言
点击“语言”按钮,识别用户输入中的主要语言。
LanguageRecognizerViewController
的 HandleDetermineLanguageButtonTap
方法使用 NLLanguageRecognizer
的 GetDominantLanguage
方法用于提取 NLLanguage
用于文本中找到的主要语言:
partial void HandleDetermineLanguageButtonTap(UIButton sender)
{
UserInput.ResignFirstResponder();
if (!String.IsNullOrWhiteSpace(UserInput.Text))
{
NLLanguage lang = NLLanguageRecognizer.GetDominantLanguage(UserInput.Text);
DominantLanguageLabel.Text = lang.ToString();
}
}
语言概率
点击“语言概率”按钮,获取用户输入的语言假设列表。
LanguageRecognizerViewController
类的 HandleLanguageProbabilitiesButtonTap
方法实例化 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
通过调用以下内容将用户的输入拆分为令牌 NLTokenizer
的 GetTokens
方法。 此方法会返回一个数组 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
类将类别与输入字符串的标记相关联。
自然语言框架包括对识别人员、地点、组织和词性的内置支持。
注意
自然语言框架还支持通过开发人员提供的 Core ML 模型自定义标记方案。 有关详细信息,请查看 WWDC 2018 中的“自然语言框架简介”会话。
点击“命名实体”或“词性”按钮以提取:
- 一个由
NSValue
对象构成的数组,每个对象在原始文本中包装令牌的NSRange
。 - 一个
NLTag
值的数组 - 用于相同数组索引处的NSValue
令牌的类别。
在 LanguageTaggerViewController
中,HandlePartsOfSpeechButtonTap
和 HandleNamedEntitiesButtonTap
均调用 ShowTags
,传递 NLTagScheme
,即 NLTagScheme.LexicalClass
(对于词性)或 NLTagScheme.NameType
(对于命名实体)。
ShowTags
创建一个 NLTagger
,并使用要查询其 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 文档。