Unkonventionelle Stimmungsanalyse: BERT vs CatBoost

EinfĂĽhrung

Die Stimmungsanalyse ist eine NLP-Technik (Natural Language Processing), mit der ermittelt wird, ob Daten (Text) positiv , negativ oder neutral sind .





Die Stimmungsanalyse ist grundlegend für das Verständnis der emotionalen Nuancen einer Sprache. Dies hilft wiederum dabei, die Meinungen hinter Bewertungen, Social-Media-Diskussionen, Kommentaren und mehr automatisch zu sortieren.





Obwohl die sentimentale Analyse in den letzten Jahren sehr populär geworden ist, wurde die Arbeit seit Anfang der 2000er Jahre fortgesetzt. Traditionelle Techniken des maschinellen Lernens wie Naive Bayesian, Logistic Regression und Support Vector Machines (SVMs) werden häufig für große Volumina verwendet, da sie sich gut skalieren lassen. In der Praxis hat sich gezeigt, dass Deep Learning (DL) -Methoden die beste Genauigkeit für eine Vielzahl von NLP-Aufgaben bieten, einschließlich der Stimmungsanalyse. Sie sind jedoch in der Regel langsamer und teurer zu erlernen und zu verwenden.





von Giacomo Veneri
von Giacomo Veneri

In diesem Artikel möchte ich eine wenig bekannte Alternative anbieten, die Geschwindigkeit und Qualität kombiniert. Für vergleichende Bewertungen und Schlussfolgerungen wird ein Basismodell benötigt. Ich habe mich für das bewährte und beliebte BERT entschieden.





Daten

 —  , , . , — .





, , , .





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



Richtigkeit
Accuracy
Verlust
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 ;





  • Erstellt ein Modell mit CatBoost unter Verwendung integrierter Textverarbeitungsfunktionen.





  • Wir haben uns angesehen, was passieren wĂĽrde, wenn wir die Ergebnisse beider Modelle mitteln wĂĽrden.





Meiner Meinung nach können komplexe und langsame SOTA-Lösungen in den meisten Fällen vermieden werden, insbesondere wenn Geschwindigkeit ein kritischer Bedarf ist.





CatBoost bietet sofort hervorragende Funktionen zur Analyse der Textstimmung. Für Wettbewerbsbegeisterte wie Kaggle , DrivenData usw. kann CatBoost ein gutes Modell sowohl als Basislösung als auch als Teil eines Ensembles von Modellen bereitstellen.





Der Code aus dem Artikel kann hier eingesehen werden .








All Articles