Классификация документов с использованием сверточной нейронной сети

11

Я пытаюсь использовать CNN (сверточная нейронная сеть) для классификации документов. CNN для коротких текстовых / предложений было изучено во многих работах. Тем не менее, кажется, что ни один документ не использовал CNN для длинного текста или документа.
Моя проблема заключается в том , что существует слишком много функций из документа. В моем наборе данных каждый документ содержит более 1000 токенов / слов. Кормить каждый пример с CNN, конвертировать каждый документ в матрицу с помощью word2vec или перчатки в результате большой матрицы. Для каждой матрицы, высота длина документа, а ширина размера слова вложения вектора. В моем наборе данных содержится более 9000 примеров, и на обучение сети (целую неделю) уходит много времени, что затрудняет точную настройку параметров.
Еще один метод извлечения признаков - использовать один горячий вектор для каждого слова, но это создаст очень разреженные матрицы. И, конечно, этот метод даже требует больше времени для обучения, чем предыдущий метод.
Так есть ли лучший способ для извлечения функций без создания больших входных матриц?
И как мы должны обрабатывать документы различной длины? В настоящее время я добавляю специальные строки, чтобы документ имел одинаковую длину, но я не думаю, что это хорошее решение.

lenhhoxung
источник
2
Ли использование TfIdf векторизатор , кажется , подходит? Может быть , в сочетании с word2vec оставить только верхние х слов для каждого документа?
Диего
Ну, я не знаю, что такое Tfldf. Я собираюсь проверить это, чтобы увидеть, работает ли это. Спасибо
lenhhoxung
scikit-learn.org/stable/modules/… вот например
Диего
Я просто проверяю это и думаю, что это мне не поможет. По сути, этот вспомогательный класс создает матрицу для набора документов. Каждый вектор строки (двоичный или счетчик слов) в матрице соответствует документу, но для CNN нам нужна матрица для каждого документа.
lenhhoxung
Задача состояла в том, чтобы оставить только x нетривиальных слов в документе, ранжированных по их TfIdf. Затем используйте исходную кодировку для построения матриц документов. Не уверен, что эта идея двухэтапного подхода встречалась
Диего

Ответы:

8

Вы можете уменьшить длину входных данных, представив свои документы в виде серии векторов предложений вместо более длинных серий векторов слов. Doc2vec - это один из способов сделать это (каждое предложение будет «документом»).

Если вы не хотите использовать Doc2vec, одним из способов создания векторов предложений будет усреднение векторов слов для каждого предложения, давая вам один вектор одинаковой ширины для каждого предложения. Это может быть не так точно, как некоторые методы, доступные через Doc2Vec, но я использовал его с большим успехом для моделирования тем.

В любом случае, когда у вас есть векторы предложений, выстраивайте их в последовательности для каждого документа, как вы уже делали для векторов слов, и затем просматривайте свою модель. Поскольку длина последовательности для каждого документа короче, ваша модель должна работать быстрее, чем с векторами слов.

Кстати, этот метод может работать при увеличении или уменьшении, чтобы удовлетворить ваши требования к точности и скорости. (например, если ваш CNN все еще тренируется слишком медленно с векторами предложений, вы можете вместо этого создать векторы абзацев).

Одним из способов обработки документов различной длины является заполнение. Все ваши последовательности документов должны быть равны по длине вашему самому длинному документу. Таким образом, если ваш самый длинный документ 400 предложений, то все последовательности документов будут иметь длину 400 векторов. Документы короче максимальной длины будут дополнены векторами, заполненными нулями.

Андрей
источник
Интересная идея. Я попробую это :)
lenhhoxung
Могу я задать вопрос? Как я могу иметь дело с документами, которые имеют существенно различную длину (5 предложений / документ, 500 предложений / документ), даже если я представляю их в векторах предложений? Заполнение здесь кажется странным ...
stackunderflow
1
При обработке речи некоторые люди упорядочивают последовательности на основе их длины, чтобы последовательности с одинаковой длиной были в одной и той же партии. Это может работать для текстовой последовательности.
Sutee
4

Вы можете использовать региональные вложения. Вместо преобразования отдельных «токенов» в векторы вы можете использовать стратегию преобразования областей текста в векторы. Этот подход используется здесь: https://arxiv.org/abs/1504.01255

Если вы не ограничены CNN, вы можете использовать иерархические модели внимания, такие как эта: https://www.cs.cmu.edu/~diyiy/docs/naacl16.pdf, где у вас есть конвейер такого типа: word vectors (combined into) sentence vectors (combined into) final document vector

Обратите внимание, что с помощью этого метода вам все равно придется преобразовывать все векторы слов в вложения, но не все сразу.

Для обработки документов различной длины заполнение / резка пока является единственным решением.

Наконец, чтобы увеличить скорость, вы можете попытаться уменьшить размер текста, включив только важные разделы (возможно, достаточно только начала документа, чтобы иметь хорошую точность классификации)

pygabriel
источник
1
Спасибо за вашу ссылку. Встраивание региона интересно. Что касается документа переменного размера, как упоминалось в этой статье arxiv.org/abs/1412.1058 (того же автора), мы можем использовать несколько блоков объединения вместо заполнения / вырезания.
lenhhoxung