Обучение модели без учителя на нескольких текстовых признаках
Предположим, что есть 3 признака, которые содержат текст. Текст является произвольным(не категориальным). Скажем эти признаки могут являться комментариями, содержанием и т.п. Но возникает проблема обучения модели. Возможно, это глупый вопрос, но как подать сразу несколько признаков на обучение?
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.cluster import KMeans
# Образование DataFrame'a для обучения
data = df[["текстовый_признак1", "текстовый_признак2", "текстовый_признак3"]]
# Векторизатор
tfvec = TfidfVectorizer(stop_words = stop_words)
text_vec = tfvec.fit_transform(data)
# Обучение модели
kmeans = KMeans(n_clusters = 5, random_state = 142)
kmeans.fit(text_vec)
kmeans_pred = kmeans.fit_predict(text_vec)
При попытке использовать данный код получается разреженная матрица 3x3, хотя data является полноценным DataFrame'ом со всеми необходимыми данными, но, когда подаётся 1 признак, то разреженная матрица получается ожидаемого размера(1367x460) и тогда уже можно производить обучение
Ответы (2 шт):
Судя по ответу из комментария, вы хотите объединить все текстовые признаки в один.
Так и сделайте:
text = (df["текстовый_признак1"]
+ " " + df["текстовый_признак2"]
+ " " + df["текстовый_признак3"])
# Векторизатор
tfvec = TfidfVectorizer(stop_words = stop_words)
text_vec = tfvec.fit_transform(text)
...
Если словари фич пересекаются, то простая конкатенация признаков может быть не лучшим решением, ведь может оказаться важным, в каком именно из признаков оказалось то или иное слово, а при конкатенации признаков эта информация теряется. Объединять фичи можно и просто соединив столбцы вышедшие из трансформеров после преобразования отдельно каждой фичи (для последующего вертикального соединения столбцов есть методы и в Pandas и в Numpy), а можно использовать функцию FeatureUnion из Sklearn специально предназначенную для соединения нескольких фич в процессе обработки входных данных.
Пример из документации:
from sklearn.pipeline import FeatureUnion
from sklearn.decomposition import PCA, TruncatedSVD
union = FeatureUnion([("pca", PCA(n_components=1)),
("svd", TruncatedSVD(n_components=2))])
X_new = union.fit_transform(X)