Analisis Sentimen Tidak Konvensional: BERT vs CatBoost

pengantar

Analisis sentimen adalah teknik pemrosesan bahasa alami (NLP) yang digunakan untuk menentukan apakah data (teks) positif , negatif, atau netral .





Analisis sentimen sangat penting untuk memahami nuansa emosional suatu bahasa. Ini, pada gilirannya, membantu menyortir opini di balik ulasan, diskusi media sosial, komentar, dan lainnya secara otomatis.





Meskipun analisis sentimental telah menjadi sangat populer dalam beberapa tahun terakhir, pengerjaannya terus berlanjut sejak awal tahun 2000-an. Teknik pembelajaran mesin tradisional seperti Naive Bayesian, Logistic Regression, dan Support Vector Machines (SVM) banyak digunakan untuk volume besar karena dapat diskalakan dengan baik. Dalam praktiknya, metode deep learning (DL) telah terbukti memberikan akurasi terbaik untuk berbagai tugas NLP, termasuk analisis sentimen; namun, mereka cenderung lebih lambat dan lebih mahal untuk dipelajari dan digunakan.





oleh Giacomo Veneri
oleh Giacomo Veneri

Dalam artikel ini, saya ingin menawarkan alternatif yang sedikit diketahui yang menggabungkan kecepatan dan kualitas. Model dasar diperlukan untuk penilaian dan kesimpulan komparatif. Saya memilih BERT yang telah teruji waktu dan populer.





Data

β€Šβ€”β€Š , , . , β€” .





, , , .





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



Ketepatan
Accuracy
Kerugian
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 ;





  • Membuat model dengan CatBoost menggunakan kemampuan pengolah kata bawaan;





  • kami melihat apa yang akan terjadi jika kami menghitung rata-rata hasil dari kedua model.





Menurut pendapat saya, solusi SOTA yang rumit dan lambat dapat dihindari dalam banyak kasus, terutama jika kecepatan sangat dibutuhkan.





CatBoost memberikan kemampuan analisis sentimen teks yang sangat baik langsung dari kotaknya. Untuk penggemar kompetitif seperti Kaggle , DrivenData , dll., CatBoost dapat menyediakan model yang baik sebagai solusi dasar dan sebagai bagian dari ansambel model.





Kode dari artikel tersebut dapat dilihat di sini .








All Articles