Использование Sentence-Bert с другими функциями в scikit-узнайте

#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)

предостережение: Числовые характеристики и вложения твитов должны принадлежать к одному и тому же МАСШТАБУ, иначе некоторые из них будут доминировать над другими и снижать производительность