鉴于一个文件由多个句子组成,每个句子都构成了令牌,每个令牌都有一个50维的预训练矢量,我认为张量将是(ndocs,nsents,nwords,ndims)来分类句子与文档的顺序上下文。
在典型的句子分类中,用0&s填充句子以获得相等长度的句子并允许随后的分类。通常通过创建具有nsamples x ntokens作为输入的2D嵌入层来进行。鉴于同样的情况,文档不会有相同数量的句子,这是否需要在文档中追加0行?
鉴于此处的任务是文档上下文中的句子分类,这可以表示为多对多问题,如下图所示,其中红色单位是句子(不是单词)。每个句子都是(nwords,ndims)。
资料来源:Karpathy
假设(ndocs,nsents,nwords,ndims)是正确的维度,您将如何继续嵌入图层和后续的lstm图层?
问题:
文件是否应填零,以使所有文件的句子数相同?
在(ndocs,nsents,nwords,ndims)的情况下如何初始化嵌入? Embedding()是否能够处理嵌套的令牌索引列表,或者每个句子是否应由Embedding()层表示,因此最终得到:
doc1 = [sent1_embed_layer,sent2_embed_layer,sent3_embed_layer],doc2 = [sent1_embed_layer,sent2_embed_layer,sent3_embed_layer]
反过来:
embeds = [[doc1_sent1_embed_layer, doc1_sent2_embed_layer, doc1_sent3_embed_layer], [doc2_sent1_embed_layer, doc2_sent2_embed_layer, doc2_sent3_embed_layer]]
在下面添加一些代码,说明如何准备数据以获得上述数据结构(假设每个句子中的标记已经映射到它们的索引)。
max_sent_length = 100
max_sents = 70
# pad sentences to max length and pad documents to max number of sentences
padded_docs = []
for doc in docs:
padded_sents = []
for sent in doc:
padded_sents.append(pad_sequences(sent, max_length=max_sent_length))
padded_doc = padded_sents
while len(padded_doc) < max_sents:
padded_doc.append([0]*max_sent_length)
padded_docs.append(padded_doc)
# now we have a list of docs, each consisting of an equal number of sentences, each consisting of an equal number of token indices