Ошибка при создании фрейма из матрицы svd

Мне нужно получить векторное представление слов с помощью tf-idf и понизить размерность векторов до 300, чтобы в дальнейшем я мог сложить этот вектор с предобученным word2vec. В качестве корпуса слов используются твиты. Я обучил TfidfVectorizer, а так же применил svd разложение с помощью TruncatedSVD. Чтобы в дальнейшем было удобно получать вектор конкретного слова, я решил создать фрейм с размерностью 300 на размер словаря. Вот мой код:

vectorizer = TfidfVectorizer()
svd_model = TruncatedSVD(n_components=300, n_iter=10)
X = vectorizer.fit_transform(dev_data['text'])
V=svd_model.fit_transform(X.transpose())
V=V.transpose()
tokenizer = nltk.WordPunctTokenizer()
df = pd.DataFrame(V, columns = [tokenizer.tokenize(elem.lower()) for elem in vectorizer.get_feature_names()])

Но я получаю ошибку введите сюда описание изображения

У меня несколько вопросов:

  1. Сама ошибка)
  2. Уместен ли такой подход в этой задаче? Смогу ли я потом сложить эти вектора? (после svd разложения я получаю scipy матрицу, которая выглядит как матрица разреженных данных, а не обычная блочная)
  3. Могу ли я не создавать фрейм, а получать вектор для слова другим, более простым путем?

Ответы (1 шт):

Автор решения: CrazyElf
V=svd_model.fit_transform(X.transpose())
V=V.transpose()

А зачем вы делаете transpose?? Не нужно этого делать, насколько я понимаю, вы тут сокращаете совсем не то, что нужно - не размерность векторов слов, а количество слов в тексте.

Разреженные вектора матрицы - прекрасный инструмент, он очень экономит память при работе с векторами слов. С ними можно делать практически всё тоже самое, что с обычными векторами, только при этом сильно экономится память, да и вычислительные ресурсы (если вы умножаете разреженные вектора и матрицы). Главное постараться не вы ходить из разреженных матриц в обычные, а то тогда резко может кончиться оперативная память.

По третьему вопросу не совсем понятно, в чём проблема. Вроде у вас и так все нужные данные уже есть, зачем вам нужен именно DataFrame - не очень понятно.

→ Ссылка