Torchtextイントロチュートリアル、簡単に再生できるテキストデータ処理
Torchtext Intro Tutorial
ディープラーニングでnlpを学ぶのは久しぶりです。このコンテンツに精通している学生は、アルゴリズムを練習するとき、モデルを書くことは簡単なことであることを知っています。最も厄介なのはデータ処理です。データ処理は私たちの時間のほとんどを浪費するだけでなく、多くのコンピューティングリソースを消費し、人的資源と材料資源を浪費します。今年、私はpytorch、シンプルなAPI、動的マップ、より柔軟な書き込みモード、言うまでもなく多くの利点に連絡を取り始めました。最近、トーチテキストツールを使用しようとしました。ここで、torchtextはpytorchに固有のものではないことを説明したいと思います。他の深層学習フレームワークでは、トーチテキストを引き続き使用できます。しかし、もっと厄介なのは、非常に優れた包括的なトーチテキストチュートリアルがないため、学生が始めるのにいくつかの問題が発生したことです。これが私のこの記事の執筆の目的です。
まず、トーチテキストのコンポーネントを見てみましょう。
Torchtextには、次のコンポーネントが含まれています :
- フィールド:主に、単語のセグメンテーション方法の指定、小文字、開始文字、終了文字、完了文字、辞書などに変換するかどうかなど、データ前処理の次の構成情報が含まれます。
- データセット:データの読み込みに使用されるpytorchのデータセットから継承され、TabularDatasetがパス、形式を指定できることを提供します。フィールド情報はデータの読み込みを簡単に完了できます。同時に、tortextは、直接ロードできる一般的なデータセットのビルド済みデータセットオブジェクトも提供します。 splitsメソッドは、トレーニングセット、検証セット、およびテストセットを同時にロードできます。
- イテレータ:主にバッチカスタマイズをサポートできるデータ出力のモデルであるイテレータ
1.フィールド
フィールドには、テキスト処理を書き込むための一般的なパラメータのセットが含まれています。また、テキストデータを数値型として表すことができる辞書オブジェクトも含まれています。これにより、テキストを目的のテンソル型として表すことができます。
Fieldオブジェクトに含まれるパラメータは次のとおりです。
- シーケンシャル:データをシーケンスとして表すかどうか(Falseの場合)、セグメンテーションという単語を使用できません。デフォルト:True。
- Use_vocab:辞書オブジェクトを使用するかどうか。 Falseデータのタイプがすでに数値タイプである必要がある場合。デフォルト:True。
- Init_token:各データの開始文字デフォルト:なし。
- Eos_token:各データの終了文字デフォルト:なし。
- Fix_length:各データの長さをこの値に変更します。pad_tokenで完了するには不十分です。デフォルト:なし。
- Tensor_type:データをデフォルト値に変換するテンソルのタイプ:torch.LongTensor。
- 前処理:単語のセグメンテーションの後、デジタル化の前に使用されるパイプデフォルト:なし。
- 後処理:デジタル化後、テンソルに変換する前に使用されるパイプのデフォルト値:なし。
- 小文字:データを小文字に変換するかどうかデフォルト:False。
- トークン化:ワードブレーカー機能。デフォルト:str.split。
- Include_lengths:完了した最小のバッチのタプルと各データの長さを含むリストを返すかどうか。デフォルト:False。
- Batch_first:最初にバッチ次元でテンソルを生成するかどうか。デフォルト:False。
- Pad_token:完了するために使用される文字。デフォルト: ''。
- Unk_token:辞書に文字がありません。デフォルト: ''。
- Pad_first:最初の文字を完成させるかどうか。デフォルト:False。
重要な方法は次のとおりです。
- パッド(ミニバッチ):各データをバッチで整列します
- Build_vocab():辞書を作成します
- Numericalize():テキストデータをデジタル化し、テンソルを返します
単純な栗は次のとおりです。Fieldオブジェクトを作成します
TEXT = data.Field(tokenize=data.get_tokenizer('spacy'), init_token='', eos_token='',lower=True)
2.データセット
torchtextデータセットは、pytorchから継承し、圧縮データをダウンロードして圧縮する方法を提供するデータセットです(.zip、.gz、.tgzをサポート)
splitsメソッドは、トレーニングセット、検証セット、およびテストセットを同時に読み取ることができます。
TabularDataset CSV、TSV、またはJSON形式のファイルを読み取ると非常に便利です。例は次のとおりです。
train, val, test = data.TabularDataset.splits( path='./data/', train='train.tsv', validation='val.tsv', test='test.tsv', format='tsv', fields=[('Text', TEXT), ('Label', LABEL)])
データをロードした後、辞書を作成できます。辞書を作成するときは、トレーニングされた単語ベクトルを使用できます。
TEXT.build_vocab(train, vectors='glove.6B.100d')
3.イテレータ
イテレータはモデルへのトーチテキストの出力であり、スクランブリング、並べ替えなどのデータの一般的な処理を提供し、バッチサイズを動的に変更できます。ここでは、splitsメソッドでトレーニングセット、検証を同時に出力することもできます。セット、テストセット
パラメータは次のとおりです。
- データセット:ロードされたデータセット
- Batch_size:バッチサイズ。
- Batch_size_fn:動的バッチサイズを生成する関数
- Sort_key:ソートされたキー
- 電車:それはトレーニングセットですか?
- 繰り返します:異なるエポックを反復するかどうか
- シャッフル:データを台無しにしますか?
- 並べ替え:データを並べ替えるかどうか
- Sort_within_batch:バッチが内部でソートされているかどうか
- デバイス:バッチを作成するデバイス-1:CPU 0、1 ...:対応するGPU
使用法は次のとおりです。
train_iter, val_iter, test_iter = data.Iterator.splits( (train, val, test), sort_key=lambda x: len(x.Text), batch_sizes=(32, 256, 256), device=-1)
4.その他
Torchtextは、一般的なテキストデータセットを提供し、以下を使用して直接ロードできます。
train,val,test = datasets.WikiText2.splits(text_field=TEXT)
現在含まれているデータセットは次のとおりです。
- 感情分析:SSTおよびIMDb
- 質問の分類:TREC
- 含意:SNLI
- 言語モデリング:WikiText-2
- 機械翻訳:Multi30k、IWSLT、WMT14
完全な例は次のとおりです。辞書とデータバッチはわずか数行で完了します。
import jieba import torch from torchtext import data, datasets regex = re.compile(r'[^u4e00-u9fa5aA-Za-z0-9]') def tokenizer(text): # create a tokenizer function text = regex.sub(' ', text) return [word for word in jieba.cut(text) if word.strip()] text = data.Field(sequential=True, tokenize=tokenizer, fix_length=150) label = data.Field(sequential=False, use_vocab=False) train, val = data.TabularDataset.splits( path='./data/', train='/brucewu/projects/pytorch_tutorials/chinese_text_cnn/data/train.tsv', validation='/brucewu/projects/pytorch_tutorials/chinese_text_cnn/data/dev.tsv', format='tsv', fields=[('text', text), ('label', label)]) text.build_vocab(train, val, vectors=Vectors(name='/brucewu/projects/pytorch_tutorials/chinese_text_cnn/data/eco_article.vector')) train_iter, val_iter = data.Iterator.splits( (train, val), sort_key=lambda x: len(x.text), batch_sizes=(32, 256), device=-1) vocab = text.vocab
注意すべきいくつかのポイント
- CPUで実行している場合は、device = -1を設定する必要があります。 GPUで実行している場合は、device = 0に設定する必要があります。
- Torchtextは動的パディングを使用します。つまり、 バッチ内のすべての文は、バッチ内の最長の文の長さに埋め込まれます