はじめに
torchtextとは
torchtextは、pytorchのNLP用のデータローダです。
Pytorchとそのdataloaderについてはこちらでまとめているのぜひ見てみてください。
PytorchはWIPなためドキュメントもそこまでないので、今回はソースコードを読んでまとめてみました。違う点があれば教えていただければ幸いです。
torchtextでできること
torchtextは、言語周りの前処理と有名データセットのデータローダなどをしてくれます。
embeddingや語彙、index to string, string to indexの辞書などを自動でやってくれたりします。
現時点で使えるデータセットは下記のような感じです。
– 感情分析: SST and IMDb
– 質問分類: TREC
– 含意推論: SNLI
– 言語モデル: Wikitext-2
下記のようなデータセットにも対応予定とのことです。(10/16時点)
– 質問応答: SQuAD
– 機械翻訳: Multi30k, IWSLT, WMT
アーキテクチャ
torchtextの構造は下記のようになっています。
1つ1つのモジュールについて説明していきます。
Dataset
このDataset
クラスは、PytorchのDataset
クラスとは別物です。メソッドは下記の通りです。
– init
: self.examples
と self.fields
をセット
– splits
: train, dev, validに関するpathを引数に取り、それぞれのデータを返す
– get
, getattr
, iter
, len
: self.examples
の値を返す
TabularDataset
, ZipDataset
等データセットの拡張子ごとにサブクラスがあり、読み込みを行ないます
Example
Example
は、前処理語のデータのオブジェクトです。
TextField
が持つpreprocess
を使って前処理され、Datasetのself.fields
のkeyでアクセスできます。
Field
Field
は、データの種類ごとの前処理とVocab
オブジェクトを保持しています。メソッドは下記のようになっています。
– preprocess(data)
:設定した前処理を行います。前処理の設定は、init
でtokenize
引数で渡すことでできます。
– build_vocab(data)
:引数のデータからVocab
オブジェクトを作成します
– pad(minibatch)
:paddingされたデータを作成します
– numericalize(data)
:Variableに変換します
Vocab
Vocab
は、与えられた生データからNLPの処理でよく使う辞書等を作成してくれます。
具体的には、init
時にデータから下記を作成します。
– freqs:単語のカウンター
– itos:indexから文字の辞書
– stoi:文字からindexの辞書
– wordvectors:埋め込み行列(Tensor型)、wv_typeを引数で渡すと学習済みのモデルを使います
Iterator
data.Iterator.splits
等でDatasetを引数にミニバッチを返すiteratorを作成します。
理由はわかりませんが、pytorchのでデフォルトのdataloaderとは全く関係ないです。
Padding最小にするBucketIterator
など、
テキスト周り用に少しカスタマイズされています。
返り値は、Batch
オブジェクトを返します。(Batchオブジェクトに関しては割愛します)
まとめ
Pytorchのデフォルトと全く別の発展をしていて、少し雑然としている気がします。
基本的に使い方は、下記のような順になります。
– Dataset
のサブクラスで読み込むソースなどを定義
– 使うデータセットに合わせて’Field’のインスタンス作成(label
, text
といったfieldを作る)
– Dataset
のサブクラスの引数に作成したField
インスタンスを渡し、Dataset
インスタンスを作成
– Field
インスタンスのbuild_vocab
メソッドでVocab
インスタンスを作成
– data.Iterator
等のメソッドを用いてiteratorを作成
– 処理の最中で必要に応じてField
インスタンス下のVocab
インスタンスメソッドを利用
やはりかなり複雑な感じになってしまっています。
Pytorchのdataloaderとかといつかマージされていくと使いやすくなるのかなーと妄想しつつ、当面はNLP周りでは結構お世話になりそうです。
発表資料
発表スライドを載せておくので、参考にしていただければ幸いです。