机器学习-TensorFlow建模过程 Linear Regression线性拟合应用
在自然语言处理领域,我们面对的原始数据通常是一些不同形式的文本文件。在上一篇文章中初步介绍了torchtext的基本使用方法,今天继续分享一下如何用torchtext把原始文本数据转换成训练中可以直接使用的Python对象。
假设我们的原始数据是用于机器翻译模型的训练,那么它可能是这样的:
He went back to the store. 他回店里去了。 CC-BY 2.0 (France) Attribution: tatoeba.org #794178 (CK) & #795619 (fucongcong)
He went to London in 1970. 他1970年去了伦敦。 CC-BY 2.0 (France) Attribution: tatoeba.org #288399 (adjusting) & #429064 (fucongcong)
He went to London in 1970. 他在1970年前往倫敦。 CC-BY 2.0 (France) Attribution: tatoeba.org #288399 (adjusting) & #805234 (Martha)
He will make you eat dirt. 他会让你吃灰的。 CC-BY 2.0 (France) Attribution: tatoeba.org #2169 (CK) & #503291 (fucongcong)
He won\'t live a long life. 他不會長壽。 CC-BY 2.0 (France) Attribution: tatoeba.org #502626 (CK) & #848736 (Martha)
He\'s good at flying kites. 他擅長放風箏。 CC-BY 2.0 (France) Attribution: tatoeba.org #301368 (CK) & #849015 (Martha)
He\'s much taller than you. 他比你高得多。 CC-BY 2.0 (France) Attribution: tatoeba.org #295647 (CK) & #833114 (Martha)
He\'s not breaking the law. 他没违法。 CC-BY 2.0 (France) Attribution: tatoeba.org #1890746 (Spamster) & #5931774 (verdastelo9604)
He\'s running very quickly. 他跑得非常快。 CC-BY 2.0 (France) Attribution: tatoeba.org #817966 (Cindrogriza) & #818163 (Martha)
He\'s sleeping like a baby. 他正睡着,像个婴儿一样。 CC-BY 2.0 (France) Attribution: tatoeba.org #2089 (CK) & #1772671 (sadhen)
He\'s very straightforward. 他说话很直接。 CC-BY 2.0 (France) Attribution: tatoeba.org #2311496 (FeuDRenais) & #2298338 (Gustav249)这是训练数据的一部分,该数据集用作英文到中文的机器翻译模型训练。每行数据包含一个英文句子和对应的中文翻译,以及一些无关的说明文档,三者之间用\'\\t\'分割。对于常见的文本格式文件如“csv”或者“tsv”等,torchtext提供了TabularDataset类以加载数据,下面说明如何使用。
数据截取
本文使用的数据集可以从这里(https://www.manythings.org/anki/)下载得到,选择Chinese (Mandarin) - English可以得到一个英文到中文的翻译数据集cmn.txt,包含约23000条句子翻译,这里为了演示方便截取其中一部分:
sed -n \'7000, 7010p\' cmn.txt > data.tsv执行之后data.tsv中会保存原始文件中7000到7010行的数据,数据截取不是必须的。
自定义分词
首先需要导入torchtext相关的包,并定义英文和中文的分词方式。
import torchtext.data as data
import nltk
import jieba
def tokenize_en(text):
\"\"\"
英文分词.
\"\"\"
return nltk.word_tokenize(text)
def tokenize_ch(text):
\"\"\"
中文分词.
\"\"\"
return list(jieba.cut(text))加载数据。
Field对象定义了需要对数据进行哪些处理
Field_SRC = data.Field(tokenize=tokenize_en, include_lengths=True,
init_token=\'<SOS>\', eos_token=\"<EOS>\")
Field_TRG = data.Field(tokenize=tokenize_ch,
init_token=\'<SOS>\', eos_token=\"<EOS>\")
data_set = data.TabularDataset(
path=\'./data.tsv\', format=\'TSV\', fields=)
print(data_set.examples.src, data_set.examples.trg) 可以看到此时data_set已经加载了原始的数据集,并且根据前面定义的分词方法对数据做了分词处理。Field_SRC对象中可以指定句子的开始和结束token,设置处理结果否包含句子长度。
划分数据集
首先根据数据集构造Vocab对象。
Field_SRC.build_vocab(data_set)
Field_TRG.build_vocab(data_set)将原始数据集进行划分成三部分,分别用于训练、交叉验证和测试,可以指定是否使用GPU。
train_set, val_set, test_set = data_set.split(split_ratio=)
train_iter, val_iter, test_iter = data.BucketIterator.splits(
(train_set, val_set, test_set), batch_sizes=(3, 1, 1), device=torch.device(\'cuda\'))遍历数据
此时得到的数据已经是可以直接参与模型训练的形式了。
for i, batch in enumerate(train_iter):
print(\'src: {}\'.format(batch.src))
print(\'trg: {}\'.format(batch.trg))
# 只打印第一批数据
if i==0:
break# 输出结果
src: (tensor([,
,
,
,
,
,
,
,
], device=\'cuda:0\'), tensor(, device=\'cuda:0\'))
trg: tensor([,
,
,
,
,
,
,
,
], device=\'cuda:0\')从输出结果中可以看出,每个batch的数据都是Tensor类型,并且device属性为cuda。