Я вижу два варианта для вас, если вы хотите уменьшить размер векторизации Tfidf.
Предположим, у вас есть следующие данные:
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.decomposition import TruncatedSVD
X = ["When I wake up in the morning I always eat apples",
"What do you eat in the morning",
"Usually I only drink coffee",
"How awful, I really cannot stand coffee"]
При применении преобразования Tfidf вы будетеполучить матрицу формы (4,21):
vectorizer = TfidfVectorizer()
vectorized_X = vectorizer.fit_transform(X)
vectorized_X.shape
>>> (4,21)
Теперь давайте предположим, что иметь 21 столбец - это слишком много, и мы хотели уменьшить его.
Вариант 1
Вы можете использовать уменьшение размерности.Наиболее естественным после выполнения Tfidf является использование усеченного SVD.Это выполняет линейное уменьшение размерности вашей векторизации tfidf.Приятно то, что вы можете указать количество новых компонентов, которые вы хотите сохранить:
svd = TruncatedSVD(n_components=2)
reduced_X = svd.fit_transform(vectorized_X)
reduced_X.shape
>>> (4,2)
Опция 2
Tfidf позволяет указать, сколькослова, которые вы хотите сохранить в векторизации.Затем он возвращает векторизацию, выполненную только для верхних слов с точки зрения частоты слова.
vectorizer_reduction = TfidfVectorizer(max_features = 5)
vectorized_reduced_X = vectorizer_reduction.fit_transform(X)
vectorized_reduced_X.shape
>>> (4,5)
Если бы у меня был выбор между двумя, я бы выбрал Вариант 1 , потому что он сначала учитывает всю информацию, а затем суммирует ее, тогда как Вариант 2 просто отбрасывает информацию с самого начала.Но я также ожидал бы, что Вариант 1 займет больше времени ... так что, возможно, оптимальным решением может быть сочетание двух (сначала применить ограничительный Tfidf, а затем SVD)?