torchtext入門教程,輕鬆玩轉文本數據處理
用深度學習做nlp也有一段時間了,熟悉這塊內容的同學都知道,實踐演算法的時候,寫模型是個簡單的事,最麻煩的是數據處理,數據處理不僅會浪費我們大部分時間,而且會消耗很大的計算資源,浪費人力物力。今年開始接觸pytorch,簡潔的API,動態圖,更加靈活的編寫模式,諸多優點不用多說。最近嘗試使用torchtext工具,這裡想先說明的是,torchtext並不是pytorch所獨有的,使用其它深度學習框架,torchtext仍然可以使用。但是比較麻煩的是,並沒有很好很全面的torchtext教程,給同學們入門造成了一定麻煩,這也是我寫這篇文章的目的。
0.首先整體介紹一下torchtext的組件。
torchtext包含以下組件:
Field :主要包含以下數據預處理的配置信息,比如指定分詞方法,是否轉成小寫,起始字元,結束字元,補全字元以及詞典等等
Dataset :繼承自pytorch的Dataset,用於載入數據,提供了TabularDataset可以指點路徑,格式,Field信息就可以方便的完成數據載入。同時torchtext還提供預先構建的常用數據集的Dataset對象,可以直接載入使用,splits方法可以同時載入訓練集,驗證集和測試集。
Iterator : 主要是數據輸出的模型的迭代器,可以支持batch定製
1. Field
Field 包含一寫文本處理的通用參數的設置,同時還包含一個詞典對象,可以把文本數據表示成數字類型,進而可以把文本表示成需要的tensor類型
以下是Field對象包含的參數:
sequential: 是否把數據表示成序列,如果是False, 不能使用分詞 默認值: True.
use_vocab: 是否使用詞典對象. 如果是False 數據的類型必須已經是數值類型. 默認值: True.
init_token: 每一條數據的起始字元 默認值: None.
eos_token: 每條數據的結尾字元 默認值: None.
fix_length: 修改每條數據的長度為該值,不夠的用pad_token補全. 默認值: None.
tensor_type: 把數據轉換成的tensor類型 默認值: torch.LongTensor.
preprocessing:在分詞之後和數值化之前使用的管道 默認值: None.
postprocessing: 數值化之後和轉化成tensor之前使用的管道默認值: None.
lower: 是否把數據轉化為小寫 默認值: False.
tokenize: 分詞函數. 默認值: str.split.
include_lengths: 是否返回一個已經補全的最小batch的元組和和一個包含每條數據長度的列表 . 默認值: False.
batch_first: Whether to produce tensors with the batch dimension first. 默認值: False.
pad_token: 用於補全的字元. 默認值: "<pad>".
unk_token: 不存在詞典里的字元. 默認值: "<unk>".
pad_first: 是否補全第一個字元. 默認值: False.
重要的幾個方法:
pad(minibatch): 在一個batch對齊每條數據
build_vocab(): 建立詞典
numericalize(): 把文本數據數值化,返回tensor
簡單的栗子如下,建一個Field對象
TEXT = data.Field(tokenize=data.get_tokenizer(spacy), init_token=<SOS>, eos_token=<EOS>,lower=True)
2.Dataset
torchtext的Dataset是繼承自pytorch的Dataset,提供了一個可以下載壓縮數據並解壓的方法(支持.zip, .gz, .tgz)
splits方法可以同時讀取訓練集,驗證集,測試集
TabularDataset可以很方便的讀取CSV, TSV, or 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)])
載入數據後可以建立詞典,建立詞典的時候可以使用與訓練的word vector
TEXT.build_vocab(train, vectors="glove.6B.100d")
3. Iterator
Iterator是torchtext到模型的輸出,它提供了我們對數據的一般處理方式,比如打亂,排序,等等,可以動態修改batch大小,這裡也有splits方法 可以同時輸出訓練集,驗證集,測試集
參數如下:
dataset: 載入的數據集
batch_size: Batch 大小.
batch_size_fn: 產生動態的batch大小 的函數
sort_key: 排序的key
train: 是否是一個訓練集
repeat: 是否在不同epoch中重複迭代
shuffle: 是否打亂數據
sort: 是否對數據進行排序
sort_within_batch: batch內部是否排序
device: 建立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)
現在包含的數據集包括:
- Sentiment analysis: SST and IMDb
- Question classification: TREC
- Entailment: SNLI
- Language modeling: WikiText-2
- Machine translation: Multi30k, IWSLT, WMT14
完整例子如下,短短几行就把詞典和數據batch做好了。
import spacyimport torchfrom torchtext import data, datasetsspacy_en = spacy.load(en)def tokenizer(text): # create a tokenizer function return [tok.text for tok in spacy_en.tokenizer(text)]TEXT = data.Field(sequential=True, tokenize=tokenizer, lower=True, fix_length=150)LABEL = data.Field(sequential=False, use_vocab=False)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")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)vocab = TEXT.vocab
推薦閱讀:
※為何讀不懂你的那個TA
※CRF 小結
※AI+互聯網金融--入職半年總結
※tf.nn.nce_loss 來自一篇古老的文章
TAG:深度學習DeepLearning | 自然語言處理 |