TabularDataset,从数据集到向量的流程
前言:在尝试手打一个新闻分类模型的时候,参考网上的一些开源项目,其中经常有用到TabularDataset这个类,而无论是源码注释还是网上博客对这个类的解析都少之又少。此blog以记录在这里的一个挖掘经验、结果。
库引用:
import torch import config as c # 本地目录下py脚本,不是系统库 from torchtext.legacy.data import Field, TabularDatase from torchtext.vocab import Vectors
局部源码:(部分源码,无法运行,仅供参考)
def load():
# 创建Field对象
TEXT = Field(sequential=True, tokenize=jiebatokenize)
LABEL = Field(sequential=False, dtype=torch.int64)
# 读取数据
traindataset, valdataset, testdataset = TabularDataset.splits(
path='../data',
train='cnews.train.txt',
validation='cnews.val.txt',
test='cnews.test.txt',
format='tsv',
fields=[('Label', LABEL), ('Text', TEXT)]
)
#读取词向量
wordvectors = Vectors(name='../data/sgns.sogounews.bigram-char_3')
#建立词表
TEXT.build_vocab(traindataset, valdataset, testdataset, vectors=wordvectors)
LABEL.build_vocab(traindataset, valdataset, testdataset)
config = c.Config(vocabulary_length=len(TEXT.vocab),
embedding_dimension=TEXT.vocab.vectors.size()[-1],
wordvectors=TEXT.vocab.vectors,
classesnumber=len(LABEL.vocab)
)
return traindataset, valdataset, testdataset, config
TabularDataset这个类来自torchtext.legacy.data,在torchtext的官方文档中写有是Lua torch的移植库,找不到相关文档,那我们只能手动调试看看它的结构如何:(注意:下图中的traindata与上文源码traindataset是同一个对象,而下文的traindataset是加入了迭代器)

field中可以看到我们之前添加的Field,似于用在预处理,可以看见我们设置的torch.int64的dtype

而examples则是我们在他们之中存放的数据,无论是Label还是Text都是str类型,并不是加入Field后便改变

从迭代器里面提取
for batches in traindataset:
texts = batches.Text
labels = batches.Label
<略>
module_output = TextCNN(texts)
提取之后的,无论是texts还是lables都是Tensor数组,在这个过程可能便是从str到Tensor的过程了


再到后面,来到了模型里面
x = self.embedding(x)

此时,才真正变成向量