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 値が考えられます。
AmharicArabicArmenianBengaliBulgarianBurmeseCatalanCherokeeCroatianCzechDanishDutchEnglishFinnishFrenchGeorgianGermanGreekGujaratiHebrewHindiHungarianIcelandicIndonesianItalianJapaneseKannadaKhmerKoreanLaoMalayMalayalamMarathiMongolianNorwegianOriyaPersianPolishPortuguesePunjabiRomanianRussianSimplifiedChineseSinhaleseSlovakSpanishSwedishTamilTeluguThaiTibetanTraditionalChineseTurkishUkrainianUndeterminedUrduVietnamese
サポートされている言語の完全な一覧は、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 値が考えられます。
AdjectiveAdverbClassifierCloseParenthesisCloseQuoteConjunctionDashDeterminerIdiomInterjectionNounNumberOpenParenthesisOpenQuoteOrganizationNameOtherOtherPunctuationOtherWhitespaceOtherWordParagraphBreakParticlePersonalNamePlaceNamePrepositionPronounPunctuationSentenceTerminatorVerbWhitespaceWordWordJoiner
サポートされているタグの完全な一覧は、NLTag 列挙型 API ドキュメントの一部として提供されています。