Несколько предложений и заполнение документа для классификации текста - PullRequest
0 голосов
/ 12 июня 2018

Учитывая, что документ состоит из нескольких предложений, каждое предложение состоит из токенов, и каждый токен имеет предварительно обученный вектор, скажем, 50 измерений, я бы подумал, что тензор будет (ndocs, nsents, nwords, ndims) классифицироватьсяпредложения с последовательным контекстом документа.

В типичной классификации предложений предложения дополняются нулями, чтобы получить предложения одинаковой длины и разрешить последующую классификацию.Обычно это происходит путем создания слоя 2D-встраивания с nsamples x ntokens в качестве входных данных.Учитывая, что аналогичным образом в документах не будет одинакового количества предложений, потребуется ли для этого добавление в документ строк с нулями?

Учитывая, что задачей здесь является классификация предложений в контексте документа, это может быть представлено как проблема «многие ко многим», как показано на рисунке ниже, где красными единицами являются предложения (а не слова).Каждое предложение (nwords, ndims).

Reference: Karpathy Источник: 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
...