Как использовать word2vec с keras CNN (2D) для классификации текста?

Существует пример Convolution1D https://github.com/fchollet/keras/blob/master/examples/imdb_cnn.py без word2vec.

В настоящее время я использую gensim для обучения модели word2vec.

Я хочу использовать word2vec и keras cnn (2D, а не 1D) для классификации документов (китайский текст). Я изучил базовый процесс классификации текста в cnn и хочу провести тест.

Например (шаги, которые я себе представляю):

  1. Используйте хороший набор китайских токенизированных текстов для обучения модели word2vec

    model = gensim.models.Word2Vec(new_sentences, workers=10, size=200, min_count=2)
    
  2. Токенизация набора данных моих предложений в набор данных списков слов (самое длинное предложение содержит более 8000 слов, самое короткое - менее 50)

    1     ['你们', '好', '今天', '天气', '真', '好']
    2     ['嗯', '对的']
    ...
    9999  ['好', '就', '这样']
    
  3. Используйте метод для преобразования набора данных списков слов в набор данных word2vec

    преобразовать каждое слово во всех смыслах в вектор с помощью обученной модели.

    1     [[word2vec size=200], [word2vec size=200], [word2vec size=200], [word2vec size=200], [word2vec size=200], [word2vec size=200]]
    2     [[word2vec size=200], [word2vec size=200]]
    ...
    9999  [[word2vec size=200], [word2vec size=200], [word2vec size=200]]
    
  4. Заполнить набор данных word2vec (с нулевым массивом size = 200)

    1     [[word2vec size=200], [word2vec size=200], [word2vec size=200], [word2vec size=200], [word2vec size=200], [word2vec size=200]]
    2     [[word2vec size=200], [word2vec size=200], [word2vec size=200], [word2vec size=200], [word2vec size=200], [word2vec size=200]]
    ....
    9999  [[word2vec size=200], [word2vec size=200], [word2vec size=200], [word2vec size=200], [word2vec size=200], [word2vec size=200]]
    
  5. перейти на CNN (используя Convolution2D)


Я долго ищу, но не могу найти способ сделать шаг 3 (после шага 3 настройки параметров и слоев на шаге 5 тоже трудно понять).


person Mithril    schedule 17.01.2017    source источник


Ответы (1)


Преобразование отдельного предложения в 2D-вектор

Предполагая, что у вас есть список слов и модель, вы можете:

import numpy as np
sentence_vec = None
for word in sentence:
    word_vec = np.expand_dims(model[word], axis=0)
    if sentence_vec is None:
        sentence_vec = word_vec
    else:
        sentence_vec = np.concatenate((sentence_vec, word_vec), axis=0)

Что касается шага 5 - было бы полезно, если бы вы перечислили, с чем у вас проблемы. По сути, вам нужно всего лишь изменить обе одномерные операции (Convolution1D, GlobalMaxPooling1D) на их двумерные аналоги.

person ginge    schedule 17.01.2017
comment
Спасибо, не думал, что это так просто, что просто model[word]! Я просмотрел все методы gensim.models.Word2Vec и не нашел ничего с названием transform, что даже заставило меня задуматься, если я выберу неправильную библиотеку ... Насчет step 5, я просто не знаю, сколько слоев ему нужно, каждый слой какой дропаут использовать или нет? какая функция активации? и т.д .. этот шаг очень трудно понять .. - person Mithril; 17.01.2017
comment
Без предварительного опыта решения конкретной проблемы довольно сложно предположить, какая архитектура будет работать лучше всего. Я бы посоветовал поискать статьи, посвященные аналогичным вещам, и попробовать то, что они делают. Это будет включать пример 1D, который вы связали, но обновили для 2D, другие работы, которые используют CNN для текста (CharCNN и другие). В основном это метод проб и ошибок. - person ginge; 17.01.2017
comment
Я разместил вопрос о том, как использовать Convolution2D, не могли бы вы взглянуть: stackoverflow.com/questions/41798359/ - person Mithril; 23.01.2017