使用torchtext將文本轉爲ID表示
此文詳細介紹瞭如何使用torchtext加載文本數據並且轉爲由ID表示的數據。
概覽圖:
torchtext 加載文本數據
def get_dataset(path, text_field, label_field):
train, dev = data.TabularDataset.splits(
# 支持 json, dict, csv, tsv 文件格式
path=path, format='csv', skip_header=True,
train='train.csv', validation='test.csv',
fields=[
('index', None),
('label', label_field),
('text', text_field)
]
)
return train, dev
使用torchtext 進行數據預處理
def word_cut(text):
# 此處傳入的是句子
# 去除異常符號,數字等操作可以在分詞之前操作
return [word for word in text.split(' ')]
text_field.tokenize = word_cut # 文本分詞,可以使用其他分詞技術先進行數據預處理之後再加載
def preprocess(text):
# 去除停止詞,同義詞替換等操作
pass
text_field.preprocessing = preprocess # 預處理程序,tokenize之後numericalizing之前執行
def postprocess(text):
pass
text_field.postprocessing = postprocess # 該函數在numericalizing之後但數據類型未轉成tensor之前
構建詞彙表
# 可以選擇根據當前數據進行詞彙表的構建;也可以根據預訓練好的模型進行詞彙表的構建(第二種效果更好)
# 預訓練模型一般非常大,直接下載他人訓練好的即可,例如ELMo模型
# 構建詞彙表後,word將全部由ID替代
text_field.build_vocab(train_dataset, dev_dataset)
if args.static and args.pretrained_name and args.pretrained_path:
vectors = Vectors(name=args.pretrained_name, cache=args.pretrained_path)
text_field.build_vocab(train_dataset, dev_dataset, vectors=vectors)
else:
text_field.build_vocab(train_dataset, dev_dataset)
batch分割
train_iter, dev_iter = data.Iterator.splits(
(train_dataset, dev_dataset),
batch_sizes=(batch_size, len(dev_dataset)),
sort_key=lambda x: len(x.text),
**kwargs)