TFIDF для большого набора данных
У меня есть корпус, который содержит около 8 миллионов статей новостей, мне нужно получить представление TFIDF из них как разреженной матрицы. Я смог сделать это, используя scikit-learn для относительно меньшего количества образцов, но я считаю, что он не может использоваться для такого огромного набора данных, поскольку он сначала загружает входную матрицу в память и что это дорогостоящий процесс.
Кто-нибудь знает, какой был бы лучший способ извлечения векторов TFIDF для больших наборов данных?
Ответы
Ответ 1
Gensim имеет эффективную модель tf-idf и не требует одновременного хранения всего в памяти.
Ваш корпус просто должен быть повторяемым, поэтому ему не нужно иметь весь корпус в памяти за раз.
Согласно комментариям, скрипт make_wiki проходит через Википедию на расстоянии около 50 метров на ноутбуке.
Ответ 2
Я считаю, что вы можете использовать HashingVectorizer
, чтобы получить небольшую csr_matrix
из ваших текстовых данных, а затем использовать TfidfTransformer
. Хранение разреженной матрицы из 8M строк и нескольких десятков тысяч столбцов не является таким большим делом. Другим вариантом было бы вовсе не использовать TF-IDF - это может быть так, что ваша система работает достаточно хорошо без нее.
На практике вам может потребоваться подзадача вашего набора данных - иногда система будет делать то же самое, просто изучая 10% всех доступных данных. Это эмпирический вопрос, нет способа заранее сказать, какая стратегия будет лучше для вашей задачи. Я бы не стал беспокоиться о масштабировании до документа 8M, пока не убедился, что он мне нужен (т.е. Пока я не увижу кривую обучения, демонстрирующую четкую тенденцию к повышению).
Ниже я кое-что работаю над этим утром в качестве примера. Вы можете видеть, что производительность системы имеет тенденцию улучшаться, поскольку я добавляю больше документов, но она уже находится на этапе, где это, кажется, мало чем отличается. Учитывая, сколько времени требуется на тренировку, я не думаю, что обучение этому на 500 файлов стоит моего времени.
![]()