Path: blob/master/site/ja/tutorials/load_data/text.ipynb
25118 views
Copyright 2018 The TensorFlow Authors.
テキストを読み込む
このチュートリアルでは、テキストを読み込んで前処理する 2 つの方法を紹介します。
まず、Keras ユーティリティと前処理レイヤーを使用します。これには、データを
tf.data.Dataset
に変換するためのtf.keras.utils.text_dataset_from_directory
とデータを標準化、トークン化、およびベクトル化するためのtf.keras.layers.TextVectorization
が含まれます。TensorFlow を初めて使用する場合は、これらから始める必要があります。次に、
tf.data.TextLineDataset
などの低レベルのユーティリティを使用してテキストファイルを読み込み、text.UnicodeScriptTokenizer
やtext.case_fold_utf8
などの TensorFlow Text APIを使用して、よりきめ細かい制御のためにデータを前処理します。
例 1: StackOverflow の質問のタグを予測する
最初の例として、StackOverflow からプログラミングの質問のデータセットをダウンロードします。それぞれの質問 (「ディクショナリを値で並べ替えるにはどうすればよいですか?」) は、1 つのタグ (Python
、CSharp
、JavaScript
、またはJava
) でラベルされています。このタスクでは、質問のタグを予測するモデルを開発します。これは、マルチクラス分類の例です。マルチクラス分類は、重要で広く適用できる機械学習の問題です。
データセットをダウンロードして調査する
まず、tf.keras.utils.get_file
を使用して Stack Overflow データセットをダウンロードし、ディレクトリの構造を調べます。
train/csharp
、train/java
、train/python
および train/javascript
ディレクトリには、多くのテキストファイルが含まれています。それぞれが Stack Overflow の質問です。
サンプルファイルを出力してデータを調べます。
データセットを読み込む
次に、データをディスクから読み込み、トレーニングに適した形式に準備します。これを行うには、tf.keras.utils.text_dataset_from_directory
ユーティリティを使用して、ラベル付きの tf.data.Dataset
を作成します。これは、入力パイプラインを構築するための強力なツールのコレクションです。tf.data
を始めて使用する場合は、tf.data: TensorFlow 入力パイプラインを構築するを参照してください。
tf.keras.utils.text_dataset_from_directory
API は、次のようなディレクトリ構造を想定しています。
前のセル出力が示すように、トレーニングフォルダには 8,000 の例があり、そのうち 80% (6,400) をトレーニングに使用します。tf.data.Dataset
を Model.fit
に直接渡すことで、モデルをトレーニングできます。詳細は、後ほど見ていきます。
まず、データセットを反復処理し、いくつかの例を出力して、データを確認します。
注意: 分類問題の難易度を上げるために、データセットの作成者は、プログラミングの質問で、Python、CSharp、JavaScript、Java という単語を blank に置き換えました。
ラベルは、0
、1
、2
または 3
です。これらのどれがどの文字列ラベルに対応するかを確認するには、データセットの class_names
プロパティを確認します。
次に、tf.keras.utils.text_dataset_from_directory
を使って検証およびテスト用データセットを作成します。トレーニング用セットの残りの 1,600 件のレビューを検証に使用します。
注意: tf.keras.utils.text_dataset_from_directory
の validation_split
および subset
引数を使用する場合は、必ずランダムシードを指定するか、shuffle=False
を渡して、検証とトレーニング分割に重複がないようにします。
トレーニング用データセットを準備する
次に、tf.keras.layers.TextVectorization
レイヤーを使用して、データを標準化、トークン化、およびベクトル化します。
標準化とは、テキストを前処理することを指します。通常、句読点や HTML 要素を削除して、データセットを簡素化します。
トークン化とは、文字列をトークンに分割することです(たとえば、空白で分割することにより、文を個々の単語に分割します)。
ベクトル化とは、トークンを数値に変換して、ニューラルネットワークに入力できるようにすることです。
これらのタスクはすべて、このレイヤーで実行できます。これらの詳細については、tf.keras.layers.TextVectorization
API ドキュメントを参照してください。
注意点 :
デフォルトの標準化では、テキストが小文字に変換され、句読点が削除されます (
standardize='lower_and_strip_punctuation'
)。デフォルトのトークナイザーは空白で分割されます (
split='whitespace'
)。デフォルトのベクトル化モードは
int
です (output_mode='int'
)。これは整数インデックスを出力します(トークンごとに1つ)。このモードは、語順を考慮したモデルを構築するために使用できます。binary
などの他のモードを使用して、bag-of-word モデルを構築することもできます。
TextVectorization
を使用した標準化、トークン化、およびベクトル化について詳しくみるために、2 つのモデルを作成します。
まず、
'binary'
ベクトル化モードを使用して、bag-of-words モデルを構築します。次に、1D ConvNet で
'int'
モードを使用します。
'int'
モードの場合、最大語彙サイズに加えて、明示的な最大シーケンス長 (MAX_SEQUENCE_LENGTH
) を設定する必要があります。これにより、レイヤーはシーケンスを正確に output_sequence_length
値にパディングまたは切り捨てます。
次に、TextVectorization.adapt
を呼び出して、前処理レイヤーの状態をデータセットに適合させます。これにより、モデルは文字列から整数へのインデックスを作成します。
注意: TextVectorization.adapt
を呼び出すときは、トレーニング用データのみを使用することが重要です (テスト用セットを使用すると情報が漏洩します)。
これらのレイヤーを使用してデータを前処理した結果を出力します。
上に示したように、TextVectorization
の 'binary'
モードは、入力に少なくとも 1 回存在するトークンを示す配列を返しますが、'int'
モードでは、各トークンが整数に置き換えられるため、トークンの順序が保持されます。
レイヤーで TextVectorization.get_vocabulary
を呼び出すことにより、各整数が対応するトークン (文字列) を検索できます。
モデルをトレーニングする準備がほぼ整いました。
最後の前処理ステップとして、トレーニング、検証、およびデータセットのテストのために前に作成した TextVectorization
レイヤーを適用します。
パフォーマンスのためにデータセットを構成する
以下は、データを読み込むときに I/O がブロックされないようにするために使用する必要がある 2 つの重要な方法です。
Dataset.cache
はデータをディスクから読み込んだ後、データをメモリに保持します。これにより、モデルのトレーニング中にデータセットがボトルネックになることを回避できます。データセットが大きすぎてメモリに収まらない場合は、この方法を使用して、パフォーマンスの高いオンディスクキャッシュを作成することもできます。これは、多くの小さなファイルを読み込むより効率的です。Dataset.prefetch
はトレーニング中にデータの前処理とモデルの実行をオーバーラップさせます。
以上の 2 つの方法とデータをディスクにキャッシュする方法についての詳細は、データパフォーマンスガイドの プリフェッチを参照してください。
モデルをトレーニングする
ニューラルネットワークを作成します。
'binary'
のベクトル化されたデータの場合、単純な bag-of-words 線形モデルを定義し、それを構成してトレーニングします。
次に、'int'
ベクトル化レイヤーを使用して、1D ConvNet を構築します。
2 つのモデルを比較します。
テストデータで両方のモデルを評価します。
注意: このサンプルデータセットは、かなり単純な分類問題を表しています。より複雑なデータセットと問題は、前処理戦略とモデルアーキテクチャに微妙ながら重要な違いをもたらします。さまざまなアプローチを比較するために、さまざまなハイパーパラメータとエポックを試してみてください。
モデルをエクスポートする
上記のコードでは、モデルにテキストをフィードする前に、tf.keras.layers.TextVectorization
レイヤーをデータセットに適用しました。モデルで生の文字列を処理できるようにする場合 (たとえば、展開を簡素化するため)、モデル内に TextVectorization
レイヤーを含めることができます。
これを行うには、トレーニングしたばかりの重みを使用して新しいモデルを作成できます。
これで、モデルは生の文字列を入力として受け取り、Model.predict
を使用して各ラベルのスコアを予測できます。最大スコアのラベルを見つける関数を定義します。
新しいデータで推論を実行する
モデル内にテキスト前処理ロジックを含めると、モデルを本番環境にエクスポートして展開を簡素化し、トレーニング/テストスキューの可能性を減らすことができます。
tf.keras.layers.TextVectorization
を適用する場所を選択する際に性能の違いに留意する必要があります。モデルの外部で使用すると、GPU でトレーニングするときに非同期 CPU 処理とデータのバッファリングを行うことができます。したがって、GPU でモデルをトレーニングしている場合は、モデルの開発中に最高のパフォーマンスを得るためにこのオプションを使用し、デプロイの準備ができたらモデル内に TextVectorization
レイヤーを含めるように切り替えることをお勧めします。
モデルの保存の詳細については、モデルの保存と読み込みチュートリアルをご覧ください。
例 2: イーリアスの翻訳者を予測する
以下に、tf.data.TextLineDataset
を使用してテキストファイルから例を読み込み、TensorFlow Text を使用してデータを前処理する例を示します。この例では、ホーマーのイーリアスの 3 つの異なる英語翻訳を使用し、与えられた 1 行のテキストから翻訳者を識別するようにモデルをトレーニングします。
データセットをダウンロードして調査する
3 つのテキストの翻訳者は次のとおりです。
このチュートリアルで使われているテキストファイルは、ヘッダ、フッタ、行番号、章のタイトルの削除など、いくつかの典型的な前処理が行われています。
前処理後のファイルをローカルにダウンロードします。
データセットを読み込む
以前は、tf.keras.utils.text_dataset_from_directory
では、ファイルのすべてのコンテンツが 1 つの例として扱われていました。ここでは、tf.data.TextLineDataset
を使用します。これは、テキストファイルから tf.data.Dataset
を作成するように設計されています。それぞれの例は、元のファイルからの行です。TextLineDataset
は、主に行ベースのテキストデータ (詩やエラーログなど) に役立ちます。
これらのファイルを繰り返し処理し、各ファイルを独自のデータセットに読み込みます。各例には個別にラベルを付ける必要があるため、Dataset.map
を使用して、それぞれにラベラー関数を適用します。これにより、データセット内のすべての例が繰り返され、 (example, label
) ペアが返されます。
次に、Dataset.concatenate
を使用し、これらのラベル付きデータセットを 1 つのデータセットに結合し、Dataset.shuffle
を使用してシャッフルします。
前述の手順でいくつかの例を出力します。データセットはまだバッチ処理されていないため、all_labeled_data
の各エントリは 1 つのデータポイントに対応します。
トレーニング用データセットを準備する
tf.keras.layers.TextVectorization
を使用してテキストデータセットを前処理する代わりに、TensorFlow Text API を使用してデータを標準化およびトークン化し、語彙を作成し、tf.lookup.StaticVocabularyTable
を使用してトークンを整数にマッピングし、モデルにフィードします。(詳細については TensorFlow Text を参照してください)。
テキストを小文字に変換してトークン化する関数を定義します。
TensorFlow Text は、さまざまなトークナイザーを提供します。この例では、
text.UnicodeScriptTokenizer
を使用してデータセットをトークン化します。Dataset.map
を使用して、トークン化をデータセットに適用します。
データセットを反復処理して、トークン化されたいくつかの例を出力します。
次に、トークンを頻度で並べ替え、上位の VOCAB_SIZE
トークンを保持することにより、語彙を構築します。
トークンを整数に変換するには、vocab
セットを使用して、tf.lookup.StaticVocabularyTable
を作成します。トークンを [2
, vocab_size + 2
] の範囲の整数にマップします。TextVectorization
レイヤーと同様に、0
はパディングを示すために予約されており、1
は語彙外 (OOV) トークンを示すために予約されています。
最後に、トークナイザーとルックアップテーブルを使用して、データセットを標準化、トークン化、およびベクトル化する関数を定義します。
1 つの例でこれを試して、出力を確認します。
次に、Dataset.map
を使用して、データセットに対して前処理関数を実行します。
データセットをトレーニング用セットとテスト用セットに分割する
Keras TextVectorization
レイヤーでも、ベクトル化されたデータをバッチ処理してパディングします。バッチ内の例は同じサイズと形状である必要があるため、パディングが必要です。これらのデータセットの例はすべて同じサイズではありません。テキストの各行には、異なる数の単語があります。
tf.data.Dataset
は、データセットの分割とパディングのバッチ処理をサポートしています
validation_data
および train_data
は (example, label
) ペアのコレクションではなく、バッチのコレクションです。各バッチは、配列として表される (多くの例、多くのラベル) のペアです。
以下に示します。
パディングに 0 を使用し、語彙外 (OOV) トークンに 1 を使用するため、語彙のサイズが 2 つ増えました。
以前と同じように、パフォーマンスを向上させるためにデータセットを構成します。
モデルをトレーニングする
以前と同じように、このデータセットでモデルをトレーニングできます。
モデルをエクスポートする
モデルが生の文字列を入力として受け取ることができるようにするには、カスタム前処理関数と同じ手順を実行する TextVectorization
レイヤーを作成します。すでに語彙をトレーニングしているので、新しい語彙をトレーニングする TextVectorization.adapt
の代わりに、TextVectorization.set_vocabulary
を使用できます。
エンコードされた検証セットのモデルと生の検証セットのエクスポートされたモデルの損失と正確度は、予想どおり同じです。
新しいデータで推論を実行する
TensorFlow Datasets (TFDS) を使用して、より多くのデータセットをダウンロードする
TensorFlow Dataset からより多くのデータセットをダウンロードできます。
この例では、IMDB 大規模映画レビューデータセットを使用して、感情分類のモデルをトレーニングします。
いくつかの例を出力します。
これで、以前と同じようにデータを前処理してモデルをトレーニングできます。
注意: これは二項分類の問題であるため、モデルには tf.keras.losses.SparseCategoricalCrossentropy
の代わりに tf.keras.losses.BinaryCrossentropy
を使用します。
トレーニング用データセットを準備する
モデルを作成、構成、およびトレーニングする
モデルをエクスポートする
まとめ
このチュートリアルでは、テキストを読み込んで前処理するいくつかの方法を示しました。次のステップとして、以下のような TensorFlow Text テキスト前処理 チュートリアルをご覧ください。
TensorFlow Datasets でも新しいデータセットを見つけることができます。また、tf.data
の詳細については、入力パイプラインの構築に関するガイドをご覧ください。