introduction
L'analyse des sentiments est une technique de traitement du langage naturel (PNL) utilisée pour déterminer si les données (texte) sont positives , négatives ou neutres .
L'analyse des sentiments est fondamentale pour comprendre les nuances émotionnelles d'une langue. Cela permet à son tour de trier automatiquement les opinions derrière les avis, les discussions sur les réseaux sociaux, les commentaires, etc.
Bien que l'analyse sentimentale soit devenue extrêmement populaire ces dernières années, ses travaux se poursuivent depuis le début des années 2000. Les techniques traditionnelles d'apprentissage automatique telles que Naive Bayesian, Logistic Regression et Support Vector Machines (SVM) sont largement utilisées pour les gros volumes car elles évoluent bien. Dans la pratique, il a été prouvé que les méthodes d'apprentissage en profondeur (DL) fournissent la meilleure précision pour une variété de tâches PNL, y compris l'analyse des sentiments; cependant, ils ont tendance à être plus lents et plus coûteux à apprendre et à utiliser.
Dans cet article, je souhaite proposer une alternative peu connue qui allie rapidité et qualité. Un modèle de référence est nécessaire pour les évaluations comparatives et les conclusions. J'ai choisi le BERT éprouvé et populaire.
Données
, , , .
- 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 ;
Création d'un modèle avec CatBoost en utilisant des capacités de traitement de texte intégrées;
nous avons examiné ce qui se passerait si nous faisions la moyenne des résultats des deux modèles.
À mon avis, les solutions SOTA complexes et lentes peuvent être évitées dans la plupart des cas, surtout si la vitesse est un besoin critique.
CatBoost fournit d'excellentes capacités d'analyse des sentiments de texte dès la sortie de la boîte. Pour les passionnés de compétition comme Kaggle , DrivenData , etc., CatBoost peut fournir un bon modèle à la fois comme solution de base et comme partie d'un ensemble de modèles.
Le code de l'article peut être consulté ici .