simpletransformers的 single sentence classification和sentence pair classification

simpletransformers
simple-transformers-configuration

1. 导入相关模块

import warnings
warnings.simplefilter('ignore')

import gc
import os

import numpy as np
import pandas as pd

from sklearn.model_selection import StratifiedKFold

from simpletransformers.classification import ClassificationModel, ClassificationArgs

os.environ["CUDA_DEVICE_ORDER"]="PCI_BUS_ID" 
os.environ['CUDA_VISIBLE_DEVICES'] = '3'

2. 读取数据,并处理空值


train = pd.read_csv('data/train.csv')
test = pd.read_csv('data/test.csv')

train['content'].fillna('', inplace=True)
test['content'].fillna('', inplace=True)

3. 设置模型的参数

TransformerModel具有dict参数,其中包含许多属性,这些属性提供对超参数的控制。

def get_model_args():
    model_args = ClassificationArgs()
    model_args.max_seq_length = 32 # 截取文本长度为128
    model_args.train_batch_size = 16
    model_args.num_train_epochs = 1 # 跑1epoch
    model_args.sliding_window=True     # 使用滑动窗口
    model_args.evaluate_during_training = True # 训练过程中做评估
    model_args.evaluate_during_training_verbose = True
    model_args.fp16 = False
    model_args.no_save = True # 不保存模型
    model_args.save_steps = -1 # 不根据step保存检查点
    model_args.overwrite_output_dir = True # 覆盖输出路径
    model_args.output_dir = dir    # 模型输出路径,默认为/outputs
    return model_args

4. single sentence classification 交叉验证训练模型

4.1 load标准预训练模型:huggingface标准预训练模型

model = ClassificationModel(
    "roberta", "roberta-base"
)

4.2 load社区预训练模型 社区预训练模型

model = ClassificationModel(
    "bert", "KB/bert-base-swedish-cased"
)

4.3 load本地预训练模型

outputs/best_model为本地保存模型的路径。

model = ClassificationModel(
    "bert", "outputs/best_model"
)

4.4 完整交叉验证代码

oof = []
prediction = test[['id']]
prediction['bert_pred'] = 0

n_folds = 3
kfold = StratifiedKFold(n_splits=n_folds, shuffle=True, random_state=2021)
for fold_id, (trn_idx, val_idx) in enumerate(kfold.split(train, train['label'])):
    train_df = train.iloc[trn_idx][['content', 'label']]
    valid_df = train.iloc[val_idx][['content', 'label']]
    train_df.columns = ['text', 'label']
    valid_df.columns = ['text', 'label']
    
    model_args = get_model_args()
    model = ClassificationModel('bert',
                                'hfl/chinese-roberta-wwm-ext',# 中文文本train的社区预训练模型
                                args=model_args)
    model.train_model(train_df, eval_df=valid_df)
    #result, vaild_outputs, wrong_predictions = model.eval_model(valid_df)
    # 这里的result输出一些acc,f1之类的指标
    # vaild_outputs 输出的是softmax之前的那个权重
    # wrong_predictions 输出的错误的predict
    _, vaild_outputs, _  = model.eval_model(valid_df)
    
    df_oof = train.iloc[val_idx][['id', 'label']].copy()
    df_oof['bert_pred'] = vaild_outputs[:,1]
    oof.append(df_oof)
    
    print('predict')
    _, test_outputs = model.predict([text for text in test['content']])
    prediction['bert_pred'] += test_outputs[:, 1] / kfold.n_splits
    
    del model, train_df, valid_df, vaild_outputs, test_outputs
    gc.collect()

不同任务所对应的模型

TaskModel
Binary and multi-class text classificationClassificationModel
Conversational AI (chatbot training)ConvAIModel
Language generationLanguageGenerationModel
Language model training/fine-tuningLanguageModelingModel
Multi-label text classificationMultiLabelClassificationModel
Multi-modal classification (text and image data combined)MultiModalClassificationModel
Named entity recognitionNERModel
Question answeringQuestionAnsweringModel
RegressionClassificationModel
Sentence-pair classificationClassificationModel
Text Representation GenerationRepresentationModel
Document RetrievalRetrievalModel

4.5 输出

df_oof = pd.concat(oof)
df_oof = df_oof.sort_values(by='id')
df_oof.head(10)
df_oof[['id', 'bert_pred']].to_csv('roberta_pred_oof.csv', index=False)
prediction[['id', 'bert_pred']].to_csv('roberta_pred_test.csv', index=False)

5. sentence pair classification 交叉验证训练模型

def get_model_args():
    model_args = ClassificationArgs()
    model_args.max_seq_length = 32 # 截取文本长度为128
    model_args.train_batch_size = 16
    model_args.num_train_epochs = 1 # 跑1epoch
    model_args.sliding_window=True     # 使用滑动窗口
    model_args.evaluate_during_training = True # 训练过程中做评估
    model_args.evaluate_during_training_verbose = True
    model_args.fp16 = False
    model_args.no_save = True # 不保存模型
    model_args.save_steps = -1 # 不根据step保存检查点
    model_args.overwrite_output_dir = True # 覆盖输出路径
    model_args.output_dir = dir    # 模型输出路径,默认为/outputs
    return model_args
oof = []
prediction = test[['id']]
prediction['bert_pred'] = 0

n_folds = 3
kfold = StratifiedKFold(n_splits=n_folds, shuffle=True, random_state=2021)
for fold_id, (trn_idx, val_idx) in enumerate(kfold.split(train, train['label'])):
    train_df = train.iloc[trn_idx][['level_4', 'content', 'label']]
    valid_df = train.iloc[val_idx][['level_4', 'content', 'label']]
    train_df.columns = ['text_a', 'text_b', 'label']
    valid_df.columns = ['text_a', 'text_b', 'label']
    
    model_args = get_model_args()
    model = ClassificationModel('bert',
                                'hfl/chinese-roberta-wwm-ext',# 中文文本train的社区预训练模型
                                num_labels=2,
                                args=model_args)
    model.train_model(train_df, eval_df=valid_df)
    #result, vaild_outputs, wrong_predictions = model.eval_model(valid_df)
    # 这里的result输出一些acc,f1之类的指标
    # vaild_outputs 输出的是softmax之前的那个权重
    # wrong_predictions 输出的错误的predict
    _, vaild_outputs, _  = model.eval_model(valid_df)
    
    df_oof = train.iloc[val_idx][['id', 'label']].copy()
    df_oof['bert_pred'] = vaild_outputs[:,1]
    oof.append(df_oof)
    
    print('predict')
    _, test_outputs = model.predict([list(text) for text in test[['level_4', 'content']].values])
    prediction['bert_pred'] += test_outputs[:, 1] / kfold.n_splits
    
    del model, train_df, valid_df, vaild_outputs, test_outputs
    gc.collect()
df_oof = pd.concat(oof)
df_oof = df_oof.sort_values(by='id')
df_oof.head(10)
df_oof[['id', 'bert_pred']].to_csv('roberta_pred_oof.csv', index=False)
prediction[['id', 'bert_pred']].to_csv('roberta_pred_test.csv', index=False)

6. sentence-transformers

获取文本相关性

  • 直接使用预训练模型,获取文本相关性
  • 使用训练样本微调之后,获取文本相关性
import numpy as np
import torch
from sentence_transformers import SentenceTransformer, util
### 回答1: 卷积神经网络 (Convolutional Neural Networks, CNN) 是一种常用于文本分类的深度学习模型。它通过卷积和池化层来提取文本中的特征,并使用全连接层来进行分类。 CNN 的一个优点是能够处理变长的输入,并且不需要对文本进行预处理。 ### 回答2: 卷积神经网络是一种深度学习方法,用于对文本进行分类。在训练过程中,这种网络可以自动学习输入数据的特征表示。卷积神经网络中的卷积层可以识别输入中的局部模式,这些局部模式组合起来形成更高级别的特征,最终帮助分类器确定类别。对于文本分类问题,卷积神经网络的输入是文本的词嵌入向量,可以从先验知识中自动学习特征。 在一些文本分类任务中,卷积神经网络已经取得了很好的表现。文本分类任务通常被分为两种类型:二元分类和多分类。二元分类任务是指将数据分为两类,例如垃圾邮件和非垃圾邮件。多类分类任务是指将数据分为多类,例如新闻分类。在这两种任务中,卷积神经网络都能够进行有效的分类。 对于二元分类任务,卷积神经网络可以使用一个输出节点,并使用 sigmoid 激活函数将输入映射到 0 到 1 之间的概率。对于多分类任务,卷积神经网络可以使用多个输出节点,每个节点对应一个类别,并使用 softmax 激活函数将输入映射到 0 到 1 之间,并且所有输出节点的和为 1。 要训练卷积神经网络进行文本分类,需要对模型进行三个主要的训练步骤。首先,需要构建词嵌入矩阵,该矩阵将文本中的每个词都映射到一个向量。然后,需要将文本数据转换为卷积神经网络所需的格式。最后,需要对模型进行训练,并根据测试数据进行评估。 总之,卷积神经网络已经被证明是一种强大的工具,可以用于文本分类等任务。在处理文本数据时,卷积神经网络可以自动学习输入数据的特征表示,并使用这些特征来确定文本的类别。 ### 回答3: 卷积神经网络(CNN)是一种深度学习模型,它在图像识别、计算机视觉和自然语言处理中表现出色。最近几年,CNN 在句子分类中也获得了很大的成功。 CNN 句子分类模型的输入是一个序列,输出是类别标签。与传统的 RNN 模型不同之处在于,CNN 可以使每个神经元只能捕获一个固定大小的区域的特征,从而加快模型的训练和降低了模型的复杂度。 CNN 句子分类模型的基本架构包括词嵌入层、卷积层、池化层和全连接层。词嵌入层将输入的文本转化为向量表示。卷积层通过滑动窗口对输入的序列进行卷积操作,提取出局部特征。池化层在每个滑动窗口上提取出一个最大值或平均值,进一步降低维度。最后,全连接层将提取出的特征传递到输出层进行分类。 CNN 句子分类模型的优点在于它可以处理不定长的文本序列,并在仅有少量特征的情况下表现出色。但是,CNN 模型的缺点在于不善于处理长期依赖关系,例如情感分析中的Irony识别。为了解决这个问题,可以引入 RNN 或 Transformer 等模型。 总的来说,CNN 模型为句子分类问题提供了一个简单有效的解决方案。在实践中,需要根据具体的任务选择合适的模型结构和参数设置,才能取得最佳效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值