Análise de sentimento não convencional: BERT vs CatBoost

Introdução

A análise de sentimento é uma técnica de processamento de linguagem natural (PNL) usada para determinar se os dados (texto) são positivos , negativos ou neutros .





A análise de sentimento é fundamental para compreender as nuances emocionais de uma linguagem. Isso, por sua vez, ajuda a classificar automaticamente as opiniões por trás das avaliações, discussões em mídias sociais, comentários e muito mais.





Embora a análise sentimental tenha se tornado extremamente popular nos últimos anos, o trabalho nela continuou desde o início dos anos 2000. As técnicas tradicionais de aprendizado de máquina, como Naive Bayesian, Logistic Regression e Support Vector Machines (SVMs), são amplamente utilizadas para grandes volumes porque são bem dimensionadas. Na prática, os métodos de aprendizado profundo (DL) provaram fornecer a melhor precisão para uma variedade de tarefas de PNL, incluindo análise de sentimento; no entanto, eles tendem a ser mais lentos e caros para aprender e usar.





por Giacomo Veneri
por Giacomo Veneri

Neste artigo, quero oferecer uma alternativa pouco conhecida que combina velocidade e qualidade. Um modelo de linha de base é necessário para avaliações e conclusões comparativas. Eu escolhi o conhecido e testado BERT.





Dados

 —  , , . , — .





, , , .





- 3, .





 BERT

TensorFlow Hub. TensorFlow Hub —  , . , BERT Faster R-CNN, .





!pip install tensorflow_hub
!pip install tensorflow_text
      
      



small_bert/bert_en_uncased_L-4_H-512_A-8 —  BERT, « Well-Read Students Learn Better: On the Importance of Pre-training Compact Models». BERT . , BERT. , .





bert_en_uncased_preprocess —  BERT. , BooksCorpus. « », , , .





tfhub_handle_encoder = \
    "https://tfhub.dev/tensorflow/small_bert/bert_en_uncased_L-4_H-512_A-8/1"
tfhub_handle_preprocess = \
    "https://tfhub.dev/tensorflow/bert_en_uncased_preprocess/3"
      
      



, . - , SOTA(State-of-the-Art).





def build_classifier_model():
    
    text_input = tf.keras.layers.Input(
        shape=(), dtype=tf.string, name='text')
    
    preprocessing_layer = hub.KerasLayer(
        tfhub_handle_preprocess, name='preprocessing')
    
    encoder_inputs = preprocessing_layer(text_input)
    encoder = hub.KerasLayer(
        tfhub_handle_encoder, trainable=True, name='BERT_encoder')
    
    outputs = encoder(encoder_inputs)
    net = outputs['pooled_output']
    net = tf.keras.layers.Dropout(0.1)(net)
    net = tf.keras.layers.Dense(
        3, activation='softmax', name='classifier')(net)
    model = tf.keras.Model(text_input, net)
    
    loss = tf.keras.losses.CategoricalCrossentropy(from_logits=True)
    metric = tf.metrics.CategoricalAccuracy('accuracy')
    optimizer = Adam(
        learning_rate=5e-05, epsilon=1e-08, decay=0.01, clipnorm=1.0)
    model.compile(
        optimizer=optimizer, loss=loss, metrics=metric)
    model.summary()
    return model
      
      



30% .





train, valid = train_test_split(
    df_train,
    train_size=0.7,
    random_state=0,
    stratify=df_train['Sentiment'])y_train, X_train = \
    train['Sentiment'], train.drop(['Sentiment'], axis=1)
y_valid, X_valid = \
    valid['Sentiment'], valid.drop(['Sentiment'], axis=1)y_train_c = tf.keras.utils.to_categorical(
    y_train.astype('category').cat.codes.values, num_classes=3)
y_valid_c = tf.keras.utils.to_categorical(
    y_valid.astype('category').cat.codes.values, num_classes=3)
      
      



 —  .





history = classifier_model.fit(
    x=X_train['Tweet'].values,
    y=y_train_c,
    validation_data=(X_valid['Tweet'].values, y_valid_c),
    epochs=5)
      
      



BERT Accuracy: 0.833859920501709
      
      



(Confusion Matrix) —  , , . , ( ). , .





Classification Report —  , .





. , , .





CatBoost

CatBoost —  . 0.19.1, .





, CatBoost . ,  —  CatBoost 20–40 , , CatBoost , . , , .





!pip install catboost
      
      



; . .





def fit_model(train_pool, test_pool, **kwargs):
    model = CatBoostClassifier(
        task_type='GPU',
        iterations=5000,
        eval_metric='Accuracy',
        od_type='Iter',
        od_wait=500,
        **kwargs
    )return model.fit(
        train_pool,
        eval_set=test_pool,
        verbose=100,
        plot=True,
        use_best_model=True)
      
      



CatBoost Pool. Pool —  , , , .





text_features —  ( ) ( ). , ( : list, numpy.ndarray, pandas.DataFrame, pandas.Series). - , , . feature_names , , pandas.DataFrame , .







:





  • tokenizers —  .





  • dictionaries — , .





  • feature_calcers —  , .





; .





model = fit_model(
    train_pool, valid_pool,
    learning_rate=0.35,
    tokenizers=[
        {
            'tokenizer_id': 'Sense',
            'separator_type': 'BySense',
            'lowercasing': 'True',
            'token_types':['Word', 'Number', 'SentenceBreak'],
            'sub_tokens_policy':'SeveralTokens'
        }      
    ],
    dictionaries = [
        {
            'dictionary_id': 'Word',
            'max_dictionary_size': '50000'
        }
    ],
    feature_calcers = [
        'BoW:top_tokens_count=10000'
    ]
)
      
      



PrecisĂŁo
Accuracy
Perda
Loss
CatBoost model accuracy: 0.8299104791995787
      
      



. - ? , , .  —  , .





y_proba_avg = np.argmax((y_proba_cb + y_proba_bert)/2, axis=1)
      
      



.





Average accuracy: 0.855713533438652
      
      



:





  • BERT ;





  • Criou um modelo com CatBoost usando recursos integrados de processamento de texto;





  • examinamos o que aconteceria se calculássemos a mĂ©dia dos resultados de ambos os modelos.





Na minha opinião, soluções SOTA complexas e lentas podem ser evitadas na maioria dos casos, especialmente se a velocidade for uma necessidade crítica.





CatBoost fornece excelentes recursos de análise de sentimento de texto direto da caixa. Para entusiastas competitivos como Kaggle , DrivenData , etc., CatBoost pode fornecer um bom modelo tanto como uma solução básica quanto como parte de um conjunto de modelos.





O cĂłdigo do artigo pode ser visto aqui .








All Articles