"SubwordTokens" (ネットエンコーダ)

NetEncoder[{"SubwordTokens",{token1,token2,}}]

テキストを与えられた語彙からの部分語に分割するエンコーダを表す.

NetEncoder[{"SubwordTokens",File["path"]}]

ファイルからSentencePiece BPEモデルをロードする.

NetEncoder[{"SubwordTokens",,"param"value}]

追加のパラメータが指定されているエンコーダを表す.

詳細

  • 部分語トークン化は,単語レベルのトークン化と文字レベルのトークン化の間の体系であり,そこではトークンは完全な単語または単語の一部である.
  • エンコーダの出力は1から d までの整数列である.d はトークンリストの要素数である.
  • NetEncoder[][input]はエンコーダを,出力を生み出す文字列に適用する.
  • NetEncoder[][{input1,input2,}]はエンコーダを,出力リストを生み出す文字列リストに適用する.
  • エンコーダはネットを構築するときに"port"->NetEncoder[]と指定することにより,ネットの入力ポートにエンコーダを付加することができる.
  • NetDecoder[NetEncoder[{"SubwordTokens",}]]NetDecoder[{"SubwordTokens",}]を指定のエンコーダから受け継いだ設定で作り出す.
  • NetEncoder[{"SubwordTokens",{token1,token2,},}]において,各トークンは文字列またはこれらの特殊トークンの一つでなければならない.
  • StartOfString文字列の前に現れるバーチャルトークン
    EndOfString文字列の後に現れるバーチャルトークン
    _割当てなしの文字
  • 慣例により,単語を開始するトークンは最初にスペースがある文字列 (" word"等) に対応し,単語内のトークンは最初に他の文字がある文字列 ("tion"等) に対応する.
  • トークンのリストは,常に割り当てられていない記号「_」を含まなければならない.
  • パラメータ"IncludeTerminalTokens"Trueのときは,StartOfStringEndOfStringも含まれなければならない.
  • パラメータ
  • 以下のパラメータが使用できる:
  • IgnoreCaseFalse文字列からトークンをマッチするときに大文字と小文字の違いを無視するかどうか
    "IncludeTerminalTokens"FalseStartOfStringEndOfStringのトークンを出力に含むかどうか
    "InputType""String"エンコーダへの各入力の形式
    Method"BPE"テキストを部分語に分割するアルゴリズム
    "OutputProperties""VocabularyIndex"それぞれの部分語についての出力特性
    "TargetLength"All刈込みまたは充填後の最終的な文字列の長さ
    "TextPreprocessing"None他のエンコーダ操作が適用される前に,入力テキストを変換する関数
    "UnicodeNormalization"None使用するユニコード正規化体系
    "Vocabulary"Noneエンコーダによって作り出されるトークンの集合
  • Method の設定には以下が使用可能である:
  • "BPE"バイト対符号化
    {"BPE","param"value}サブオプションの付いたバイト対符号化
    "WordPiece"WordPiece手法
  • Method{"BPE", }で使用できるサブオプションには以下のようなものがある:
  • "CombineWhitespace"False
  • 連続する空白文字をまとめるかどうか
  • "WhitespacePadding"None入力文字列への空白の挿入を制御する
  • パラメータ"WhitespacePadding"LeftまたはRightに設定することで,符号化が行われる前に入力文字列の最初または最後に空白を加えることができる.デフォルト値がNoneであれば空白は追加されない.
  • パラメータ"InputType"には以下の設定が使用できる:
  • "ListOfString"各入力テキストは文字列のリストで表される
    "String"各入力テキストは文字列で表される
  • パラメータ"OutputProperties"には以下の設定が使える:
  • "VocabularyIndex"トークンのリスト内のトークンのインデックス(デフォルト)
    "InputIndex"トークンを含む文字列のインデックス( "InputType""ListOfString"の1と異なる可能性あり)
    "StartPosition"テキスト中の最初のトークンの位置
    "EndPosition"テキスト中の最後のトークンの位置
    {prop1,prop2,}有効な特性のリスト
  • デフォルトのパラメータ設定"TargetLength"->Allでは,入力文字列内のすべてのトークンは符号化される.
  • パラメータ"TargetLength"->n では,入力文字列内の最初の n 個のトークンは符号化され,もしトークンが n 個未満であれば,充填が適用される.トークンのリストに EndOfString がある場合,充填値はそれに関連する整数コードである.それ以外の場合は最後のトークンに関連するコードが使われる.
  • "UnicodeNormalization"に使用可能な設定には,CharacterNormalizeのユニコード正規化形式が含まれる:
  • "NFD"正準分解(D形式)
    "NFC"正準分解後の正準合成(C形式)
    "NFKD"互換分解(KD形式)
    "NFKC"互換分解後の正準合成(KC形式)
    None正規化なし
  • 語彙はトークン文字列のリストとして,オプション "Vocabulary"{token1,token2,}を使って指定できる.語彙が指定されている場合,エンコーダは語彙に入っていないトークンの整数コードは作り出さない.Method"BPE"では,トークン化が語彙外のトークンを作り出す場合,そのトークンを作り出した操作は,トークンが語彙内のトークンまたは単一文字に分かれるまで逆戻しされる.
  • SentencePieceからBPEモデルをインポートする
  • SentencePieceライブラリからのBPEモデルファイルは,NetEncoder[{"SubwordTokens",File["path"],}]を使ってインポートできる.
  • SentencePieceライブラリからの語彙ファイルは,オプション"Vocabulary"File["path"]を使ってインポートできる.語彙トークンの受容の閾値は"Vocabulary"{File["path"],"Threshold"value]を使って指定できる.その際,value は数字である.閾値が指定されていない場合は語彙全体がインポートされる.
  • SentencePiece BPE語彙ファイルは整数スコアを各トークンに関連付ける.各トークンのスコアは訓練データにおける頻度に関連付けられ,頻度が最も高いトークンのスコアがゼロで,他のトークンのスコアは負の整数となる.サブオプション"VocabularyThreshold"n という数に設定することで,最小 n のスコアを持つトークンのみが語彙に受容される.
  • SentencePiece BPEモデルファイルをインポートするとき,パラメータ指定がファイル(もしあれば)からの設定を上書きする.

例題

すべて開くすべて閉じる

  (1)

訓練済みのSentencePieceモデルファイルからBPEエンコーダを作成する:

文字列を符号化する:

対応するトークンを得る:

スコープ  (1)

与えられた語彙を使ってWordPieceのトークン化を行う:

文字列を符号化する:

対応するトークンを得る:

パラメータ  (10)

"CombineWhitespace"  (1)

SentencePiece BPEモデルをインポートして,その"CombineWhitespace" 設定をオーバーライドする:

文字列を符号化する.複数のホワイトスペースは符号化する前に1つに結合されない:

このモデルのデフォルト設定は "CombineWhitespace"->Trueである:

"IgnoreCase"  (1)

SentencePiece BPEモデルをインポートし,その"IgnoreCase"設定を上書きする:

文字列を符号化する.エンコーダは大文字と小文字を区別しない:

"IncludeTerminalTokens"  (1)

SentencePiece BPEモデルには,デフォルトにより終端トークンが含まれていない.モデルをインポートし,"IncludeTerminalTokens"が使えるようにする:

文字列を符号化する.StartOfStringEndOfStringトークンが作成される:

"OutputProperties"  (1)

与えられた語彙を使った文字列のリストに対してWordPieceのトークン化を行い,各トークンについて異なる特性を得る:

文字列のリストを符号化する:

辞書から対応するトークンを得る:

各トークンを含む文字列のインデックスを得る:

各トークンの開始位置と終了位置を得る:

入力文字列から対応するトークンを得る:

"TargetLength"  (1)

SentencePiece BPEモデルをインポートし,文字列が12要素の長さになるよう充填または刈込みされるよう指定する:

文字列を符号化する.要素が12未満の出力はEndOfStringトークンによって充填される:

"TextPreprocessing"  (1)

Unicodeの最初の255文字だけを使ってBPEエンコーダを構築する:

ランダムな10個のUnicode文字で文字列を作る:

文字の中には未知のトークンにマップされるものもあるかもしれない:

前処理関数を使って文字列をUTF-8文字のみに変換する:

これですべての文字が符号化された:

"UnicodeNormalization"  (1)

Unicode正規化を行わないSentencePiece BPEモデルをインポートする:

このモデルは大文字のオメガ文字(Unicode番号937)をID29に符号化する:

オーム記号(Unicode番号8486)は認識されないため,不明のトークン(このモデルでのIDは1)として符号化される:

モデルのUnicode正規化設定を指定することで,オーム文字は符号化の前に大文字のオメガに正規化される:

"Vocabulary"  (2)

SentencePiece BPEモデルと語彙ファイルからBPEエンコーダを作成する:

語彙の制限がある文字列を符号化する:

「world」という単語は語彙に含まれていないので部分語に分割される:

語彙を含むBPEモデルをインポートし,語彙の閾値を指定する:

文字列を符号化する:

語彙の制約のため,複合トークンは生成されない:

"WhitespacePadding"  (1)

SentencePiece BPEモデルをインポートし,その"WhitespacePadding"設定を無効にする:

文字列を符号化する.最初の単語「great」は部分語に分割される:

このモデルのデフォルト設定は"WhitespacePadding"Leftだが,これは最初に空白を挿入し, 「great」というトークンとマッチするようにする:

アプリケーション  (1)

映画のレビューの断片を"positive" (高評価)または "negative"(低評価)として分類する分類器を訓練する.
まず,訓練データとテストデータを得る:

NetModelを使って,Wolfram Neural Net Repositoryからの"SubwordTokens"エンコーダを使ったEmbeddingLayerを得る:

埋込みを使って単語の文字列を取り,"positive"(高評価)または"negative"(低評価)として返すネットワークを入力として定義する:

ネットワークを5ラウンドの訓練データで訓練する.EmbeddingLayerの重みはオプションLearningRateMultipliersを使って固定する:

訓練済みネットワークをテスト集合からの例で評価し,確率を得る:

特性と関係  (1)

与えられたエンコーダと類似の指定で"SubwordTokens" デコーダを作成する:

文字列を符号化し,また復号化する:

考えられる問題  (1)

エンコーダのパラメータのほとんどは,"SubwordTokens" デコーダでは必要ないため,往復すると設定は失われてしまう可能性がある.以下のエンコーダはUnicode正規化を行う:

設定は往復することによって失われてしまう: