Xamarin.iOS での自然言語フレームワークの使用
iOS 12 で導入された自然言語フレームワークにより、デバイス上の自然言語処理が可能になります。 言語認識、トークン化、タグ付けがサポートされます。 トークン化は、テキストをその構成要素である単語、文、または段落に分割することです。タグ付けは、品詞、人、場所、組織を識別します。
自然言語フレームワークで Core ML カスタム モデルを使用して、特殊なコンテキストでテキストを分類およびタグ付けすることもできます。
NSLinguisticTagger クラスは引き続き使用できます。 ただし、自然言語処理に使用する推奨メカニズムは自然言語フレームワークです。
サンプル アプリ: XamarinNL
Xamarin.iOS で自然言語フレームワークを使用する方法を学習するには、以下の概念を確認してください。
言語を認識する
サンプル アプリの [Recognizer] タブは、NLLanguageRecognizer
を使用してテキスト ブロックの言語を判別する方法を示します。
Note
言語認識は、特定の種類のテキスト分類です。 自然言語フレームワークでは、開発者が提供する Core ML モデルを使用したカスタム テキスト分類もサポートされています。 詳細については、WWDC 2018 の自然言語フレームワークの概要セッションを参照してください。
主要言語
[Language] ボタンをタップして、ユーザーによる入力の主要言語を示します。
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();
}
}
言語確率
[Language probabilities] ボタンをタップして、ユーザーによる入力の言語仮説の一覧をフェッチします。
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
を使用してテキスト ブロックをコンポーネントの単語または文に区切る方法を示します。
[Words] または [Sentences] ボタンをタップして、トークンの一覧をフェッチします。 各トークンは、元のテキスト内の単語または文に関連付けられています。
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
は、各テーブル セルに 1 つのトークンをレンダリングします。 トークン 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 サンプル アプリの [Tagger] タブは、NLTagger
クラスを使用してカテゴリを入力文字列のトークンに関連付ける方法を示します。
自然言語フレームワークには、人、場所、組織、品詞を認識するためのサポートが組み込まれています。
Note
自然言語フレームワークでは、開発者が提供する Core ML モデルを使用したカスタム タグ付けスキームもサポートされています。 詳細については、WWDC 2018 の自然言語フレームワークの概要セッションを参照してください。
[Named entities] または [Parts of speech] ボタンをタップして、以下のものをフェッチします。
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 ドキュメントの一部として提供されています。