Ошибка при создании фрейма из матрицы 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()])
У меня несколько вопросов:
- Сама ошибка)
- Уместен ли такой подход в этой задаче? Смогу ли я потом сложить эти вектора? (после svd разложения я получаю scipy матрицу, которая выглядит как матрица разреженных данных, а не обычная блочная)
- Могу ли я не создавать фрейм, а получать вектор для слова другим, более простым путем?
Ответы (1 шт):
V=svd_model.fit_transform(X.transpose())
V=V.transpose()
А зачем вы делаете transpose?? Не нужно этого делать, насколько я понимаю, вы тут сокращаете совсем не то, что нужно - не размерность векторов слов, а количество слов в тексте.
Разреженные вектора матрицы - прекрасный инструмент, он очень экономит память при работе с векторами слов. С ними можно делать практически всё тоже самое, что с обычными векторами, только при этом сильно экономится память, да и вычислительные ресурсы (если вы умножаете разреженные вектора и матрицы). Главное постараться не вы ходить из разреженных матриц в обычные, а то тогда резко может кончиться оперативная память.
По третьему вопросу не совсем понятно, в чём проблема. Вроде у вас и так все нужные данные уже есть, зачем вам нужен именно DataFrame - не очень понятно.
