Análisis de sentimiento no convencional: BERT vs CatBoost

IntroducciĂłn

El análisis de sentimientos es una técnica de procesamiento del lenguaje natural (PNL) que se utiliza para determinar si los datos (texto) son positivos , negativos o neutrales .





El análisis de sentimientos es fundamental para comprender los matices emocionales de un idioma. Esto, a su vez, ayuda a ordenar automáticamente las opiniones detrás de las revisiones, las discusiones en las redes sociales, los comentarios y más.





Aunque el análisis sentimental se ha vuelto extremadamente popular en los últimos años, el trabajo en él ha continuado desde principios de la década de 2000. Las técnicas tradicionales de aprendizaje automático como Naive Bayesian, Logistic Regression y Support Vector Machines (SVM) se utilizan ampliamente para grandes volúmenes porque escalan bien. En la práctica, se ha demostrado que los métodos de aprendizaje profundo (DL) brindan la mejor precisión para una variedad de tareas de PNL, incluido el análisis de sentimientos; sin embargo, tienden a ser más lentos y costosos de aprender y usar.





por Giacomo Veneri
por Giacomo Veneri

En este artĂ­culo, quiero ofrecer una alternativa poco conocida que combina velocidad y calidad. Se necesita un modelo de lĂ­nea de base para evaluaciones y conclusiones comparativas. ElegĂ­ el popular y probado BERT.





Datos

 —  , , . , — .





, , , .





- 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'
    ]
)
      
      



PrecisiĂłn
Accuracy
PĂ©rdida
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 ;





  • CreĂł un modelo con CatBoost usando capacidades integradas de procesamiento de texto;





  • Analizamos lo que sucederĂ­a si promediáramos los resultados de ambos modelos.





En mi opiniĂłn, las soluciones SOTA complejas y lentas se pueden evitar en la mayorĂ­a de los casos, especialmente si la velocidad es una necesidad crĂ­tica.





CatBoost proporciona excelentes capacidades de análisis de sentimiento de texto desde el primer momento. Para entusiastas de la competencia como Kaggle , DrivenData , etc. CatBoost puede proporcionar un buen modelo como solución básica y como parte de un conjunto de modelos.





El cĂłdigo del artĂ­culo se puede ver aquĂ­ .








All Articles