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)

此时,才真正变成向量

发表回复