2015-12-31 2 views
1

Предположим, у меня есть (возможно) большой корпус, около 2,5 М из них с 500 функциями (после запуска LSI по исходным данным с gensim). Мне нужен корпус для обучения моих классификаторов с помощью scikit-learn. Тем не менее, мне нужно сначала преобразовать корпус в массив numpy. Тренер создания и классификатора корпуса выполняется в двух разных сценариях.Как эффективно преобразовать Gensim corpus в массив numpy (или scipy разреженной матрицы)?

Таким образом, проблема заключается в том, что размер моей коллекции, как ожидается, будет расти, и на этом этапе у меня уже недостаточно памяти (32 ГБ на машине), чтобы конвертировать все сразу (с gensim.matutils.corpus2dense). Чтобы обойти проблему, я конвертирую один вектор за другим одновременно, но он очень медленный.

Я рассмотрел вопрос о сдаче корпуса в формате svmlight, а также scikit-learn загрузить его sklearn.datasets.load_svmlight_file. Но тогда это, вероятно, означало бы, что мне нужно будет сразу загрузить все в память?

В любом случае я могу эффективно конвертировать из gensim corpus в массив numpy (или scipy редкую матрицу)?

+0

Одно быстрое примечание: поскольку вы выполнили LSI, теперь у вас плотные данные. Таким образом, не так много смысла для вывода матрицы scipy.sparse. Массив numpy будет использовать меньше памяти для данных, которые являются полностью плотными. – Dthal

+0

да, нужно найти способ сделать это быстро, если это возможно (и я почесываю голову сейчас, потому что я не мог воспроизвести проблему с памятью при преобразовании всего корпуса) – Jeffrey04

ответ

1

Я не очень знающие о Gensim, поэтому я затрудняюсь ответить, но здесь идет:

Ваши данные не помещаются в памяти, так что вам придется либо поток его (в основном то, что вы делаете сейчас) или вырезать его. Мне кажется, что gensim.utils.chunkize куски его для вас, и вы должны иметь возможность получить плотный массив numpy, который вам нужен, с as_numpy=True. Вам придется использовать модели sklearn, поддерживающие partial_fit. Они обучаются итеративно, по одной партии за раз. Хорошими являются SGD classifier и Passive-Aggressive Classifier. Обязательно передайте аргумент классов, по крайней мере, при первом вызове partial_fit. Я рекомендую прочитать документы на out-of-core scaling.

+0

LOL, я экспериментировал с chunkize вчера, и я полностью пропущено as_numpy * facepalm *, да, он уже использует partial_fit (я заменяю некоторые компоненты из scikit-learn -> gensim) – Jeffrey04