Учитывая, что документ состоит из нескольких предложений, каждое предложение состоит из токенов, и каждый токен имеет предварительно обученный вектор, скажем, 50 измерений, я бы подумал, что тензор будет (ndocs, nsents, nwords, ndims) классифицироватьсяпредложения с последовательным контекстом документа.
В типичной классификации предложений предложения дополняются нулями, чтобы получить предложения одинаковой длины и разрешить последующую классификацию.Обычно это происходит путем создания слоя 2D-встраивания с nsamples x ntokens в качестве входных данных.Учитывая, что аналогичным образом в документах не будет одинакового количества предложений, потребуется ли для этого добавление в документ строк с нулями?
Учитывая, что задачей здесь является классификация предложений в контексте документа, это может быть представлено как проблема «многие ко многим», как показано на рисунке ниже, где красными единицами являются предложения (а не слова).Каждое предложение (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