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