Я пытаюсь преобразовать текст, используя sklearn
CountVectorizer
внутри конвейеров в сочетании с ColumnTransformer
. Однако конвейер возвращает неверный массив. Почему мой конвейер с ColumnTransformer
дает мне неправильный массив 1 на 1 для CountVectorize
-d текста?
Я понимаю, что мог бы просто использовать один конвейер с CountVectorizer
и опустить ColumnTransformer
. Однако позже мне нужно будет добавить числовые столбцы, что делает необходимым ColumnTransformer
. Первоначально я попытался это сделать, нашел ошибки и изолировал проблему от проблемы, описанной выше.
Я попытался ввести X
в виде серии вместо фрейма данных, но получил другую ошибку: IndexError: tuple index out of range
data = pd.DataFrame(data={'text_feat':['This is my first sentence.','This is my second.'],
'numeric_feat':[1,2],
'target':[3,4]})
X = data.loc[:,['text_feat', 'numeric_feat']]
y = data.loc[:,'target']
# first pipeline
text_features = ['text_feat']
text_transformer = Pipeline(
steps = [('vec', CountVectorizer())])
# wrap in ColumnTransformer
preprocessor = ColumnTransformer(
transformers=[('text', text_transformer, text_features)])
# second pipeline
pipeline = Pipeline(steps=[('preprocessor', preprocessor)])
# single pipeline works as expected
X_expected = text_transformer.fit_transform(X['text_feat'])
# but this fails
X_test = pipeline.fit_transform(X)
print('Expected:')
print(X_expected.toarray())
print('Got:')
print(X_test)
Я ожидал массив 2 на 6 array([[1, 1, 1, 0, 1, 1], [0, 1, 1, 1, 0, 1]])
(матрица термина документа от CountVectorizer). Вместо этого я получил это: array([[1]])
. Есть идеи?