#python #machine-learning #nlp #embedding #bert-language-model
Вопрос:
У меня есть набор данных, одна функция-текст и еще 4 функции. Векторизатор предложений-Берта преобразует текстовые данные в тензоры. Я могу использовать эти разреженные матрицы непосредственно с классификатором машинного обучения. Могу ли я заменить текстовый столбец тензорами? И как я могу обучить модель. Приведенный ниже код показывает, как я преобразую текст в векторы.
model = SentenceTransformer('sentence-transformers/LaBSE')
sentence_embeddings = model.encode(X_train['tweet'], convert_to_tensor=True, show_progress_bar=True)
sentence_embeddings1 = model.encode(X_test['tweet'], convert_to_tensor=True, show_progress_bar=True)
Ответ №1:
Давайте предположим, что это ваши данные
X_train = pd.DataFrame({
'tweet':['foo', 'foo', 'bar'],
'feature1':[1, 1, 0],
'feature2':[1, 0, 1],
})
y_train = [1, 1, 0]
и вы готовы использовать его с sklearn
API (перекрестная проверка, конвейер, поиск по сетке и так далее). Существует утилита с именем ColumnTransformer
, которая может сопоставлять фреймы данных pandas с нужными данными, используя определенные пользователем произвольные функции! все, что вам нужно сделать, это определить функцию и создать на ее основе должностное sklearn.transformer
лицо.
model = SentenceTransformer('mrm8488/bert-tiny-finetuned-squadv2') # model named is changed for time and computation gians :)
embedder = FunctionTransformer(lambda item:model.encode(item, convert_to_tensor=True, show_progress_bar=False).detach().cpu().numpy())
После этого вы сможете использовать трансформатор, как и любой другой трансформатор, и отобразить свой текстовый столбец в семантическое пространство, например:
preprocessor = ColumnTransformer(
transformers=[('embedder', embedder, 'tweet')],
remainder='passthrough'
)
X_train = preprocessor.fit_transform(X_train) # X_train.shape => (len(df), your_transformer_model_hidden_dim your_features_count)
X_train
это будут те данные, которые вам нужны. Его правильно использовать с sklearn
экосистемой.
gnb = GaussianNB()
gnb.fit(X_train, y_train)
выход:
GaussianNB(priors=None, var_smoothing=1e-09)
предостережение: Числовые характеристики и вложения твитов должны принадлежать к одному и тому же МАСШТАБУ, иначе некоторые из них будут доминировать над другими и снижать производительность