Améliorer le performance d’un modèle pour l’analyse de sentiments

Lima Vallantin
Wilame
Marketing Data scientist and Master's student interested in everything concerning Data, Text Mining, and Natural Language Processing. Currently speaking Brazilian Portuguese, French, English, and a tiiiiiiiiny bit of German. Want to connect? Tu peux m'envoyer un message. Pour plus d'informations sur moi, tu peux visiter cette page.

Sommaire

N'oublies pas de partager :

Partager sur linkedin
Partager sur twitter
Partager sur facebook

N'oublies pas de partager :

Partager sur linkedin
Partager sur twitter
Partager sur whatsapp
Partager sur facebook

Tu as du mal à obtenir de bons résultats lorsque tu entraînes un classificateur de texte à l'analyse des sentiments ? Pas de panique ! Avec quelques changements, tu peux commencer à obtenir de meilleurs résultats.

Depuis quelques semaines, je travaille sur ce projet intitulé Essencialia. Il s'agit d'un site web que j'ai créé pour afficher des informations sur le marché immobilier brésilien, en particulier pour la ville d'Aracaju.

Pour ceux qui sont nouveaux ici, je voudrais expliquer ce que je fais exactement. Tout d'abord, avec l'aide de Sélénium, je récupère le contenu des annonces immobilières sur des sites dédiés à cette activité.

Ensuite, en utilisant le traitement du langage naturel et le Text Mining , je récupère des informations telles que les prix de vente et de location, la localisation, les frais de copropriété, le nombre de pièces, etc.

Pour estimer les prix des maisons dans une région donnée, il est important de savoir ce qui est dit sur ce quartier par la presse ou sur les médias sociaux. La majorité des actualités sont-elles positives ou négatives ? Y a-t-il des rapports de meurtres ou de violence ?

C'est ici que le classificateur de texte entre en jeu. Pour l'instant, je ne suis intéressé que par la polarité des sentiments concernant une région de la ville. En d'autres termes, je veux saisir le degré de positivité ou de négativité.

Compris ?

Donc, maintenant que tu sais ce que j'essaie de réaliser, discutons les difficultés de ce problème et comment les surmonter.

Améliorer Le Performance D’un Modèle Pour L’analyse De Sentiments : tout commence par le thème

Le premier conseil pour obtenir de meilleurs résultats lorsqu'on travaille sur les performances d'un classificateur de texte est d'utiliser des textes spécifiques au domaine que tu analyses.

La presse utilise généralement un langage plus élaboré. Les structures des phrases sont différentes de celles que vous voyez sur Twitter. Normalement, les mots sont aussi correctement orthographiés et le ton adopté est plus neutre. Eh bien, parfois...

Les médias sociaux, cependant, sont plus polarisés en termes de sentiment et il y a beaucoup de charabia dans ce domaine. Sois prêt à traiter les fautes d'orthographe et les néologismes.

Une autre chose est le thème de la conversation. Si tu es en train d'entraîner un classificateur de texte pour le domaine biomédical, ce serait une bonne idée d'utiliser des textes biomédicaux pour son entraînement. Dans le meilleur des mondes, tu pourrais même utiliser différents classificateurs pour différents thèmes.

Mais la vie est dure et les données ne restent pas là, à t'attendre. Dans mon cas, je vais utiliser mon classificateur pour traiter des textes plus formels, rédigés par la presse locale. Et devine quel corpus j'ai utilisé pour l'entraîner ? Exactement, un corpus Twitter :D. Fais ce que je dis, pas ce que je fais.

Mais, pourquoi cette décision stupide ? Pourquoi ?

Cela nous amène au sujet suivant...

Trouve de bonnes données ou crée ton propre dataset

Si tu ne travailles qu'avec des textes rédigés en anglais, félicitations : 80% de tes problèmes sont résolus. Si tu as affaire à une autre langue, bienvenue en enfer. Il n'est pas toujours facile de trouver du matériel pour améliorer les performances de ton modèle.

Comme tu dois l'imaginer, il n'y a pas un milliard de jeux de données en portugais brésilien à disposition. Il faut donc faire de son mieux avec les données disponibles.

Pour les Portugais du Brésil, il existe un jeu de données formidable avec 800 000 tweets en portugais​1​classés comme positifs, négatifs et neutres.

Une autre option consiste à créer ton propre ensemble de données. Ce n'est pas une tâche facile : tu devras recueillir des données, trouver des personnes compétentes pour t'aider à les classer manuellement (ou tu pourrais faire une pré-classification avec un autre modèle disponible), créer un document pour aider les gens à comprendre comment classer un texte ambigu...

Je n'ai pas le temps pour cela maintenant. Mais je l'ai déjà fait dans le passé et c'est une expérience formidable.

Maintenant que tu as les données, il est temps de passer un peu de temps à les retravailler.

Passe un peu de temps à retravailler le texte

Le prétraitement est une étape cruciale dans le maniement des données textuelles. Les données textuelles sont bruyantes, lourdes et pleines d'ambiguïté. Il est donc important de normaliser ton texte avant de le soumettre à l'entraînement.

Voici quelques étapes de prétraitement :

  • Traitement des mots vides de sens, des chiffres, des hashtags, des noms d'utilisateur, des URL et des balises HTML
  • Traiter les termes de basse fréquence
  • Suppression des données personnelles et sensibles
  • Augmentation des contractions (comme "j'ai" qui devient "je ai")
  • Décider entre la racinisation ou la lemmatisation
  • Appliquer l'étiquetage morpho-syntaxique
  • La gestion des symboles diacritiques et de la ponctuation...

Traiter les mots vides

En fait, chaque problème est un problème et mérite un procédé de normalisation distinct. Dans l'article "Pourquoi la suppression des mots vides n'est-elle pas toujours une bonne idée"​2​, je parle de certains cas où tu ne voudrais pas supprimer ces mots du texte.

Et pourtant, parfois, pour améliorer les performances de ton classificateur de texte, tu devras allonger ta liste de mots vides. En fait, il existe plusieurs types de mots vides :

  • Les mots vides d’une langue: les mots comme les articles et les prépositions
  • Les mots vides de localisation: tout comme les noms de lieux et de villes
  • Les mots vides de temps: jours de la semaine, noms des mois
  • Les chiffres: nombres et indications décimales, milliers, etc.
  • Les mots vides spécifiques au domaine: ce sont les plus intéressants. Les mots vides spécifiques au domaine sont ceux qui n'ajoutent pas vraiment de nouvelles informations au texte, mais ils n'appartiennent qu'au domaine que vous analysez. Dans notre problème sur l'immobilier, il s'agirait de mots comme "maison", "appartement", " copropriété " ...

Le processus de normalisation doit être adapté à votre corpus et à vos objectifs.

Traiter les termes de basse fréquence

Si les mots vides posent un problème en raison de leur fréquence élevée, les mots qui n'apparaissent pas beaucoup posent également un problème. Ces mots peuvent provenir d'une faute d'orthographe ou d'un terme très précis qui n'est apparu qu'une fois.

Par conséquent, dans le cas d'un problème d'analyse des sentiments, ils peuvent être supprimés. Sklearn fournit le TfidfVectorizer​3​ qui convertit le corpus en une matrice TF-IDF. Tu peux utiliser les paramètres min_df et max_df pour limiter la fréquence des termes.

Tu peux décider de ne considérer aucun terme ayant une fréquence minimale de n et une fréquence maximale de m.

Raciniser et lemmatiser

Tu remarqueras peut-être que, dans certains cas, le fait de raciniser et de lemmatiser le corpus t'aidera à améliorer les performances de ton classificateur de texte.

Selon ManningRaghavan, et Schütze (2008)​4​:

“Stemming usually refers to a crude heuristic process that chops off the ends of words (…) [while] lemmatization usually refers to doing things properly with the use of a vocabulary and morphological analysis of words, normally aiming to remove inflectional endings only and to return the base or dictionary form of a word”

Si tu prends les mots "études" et "étudier" et que tu prends les racines, tu obtiendras "étud". Si tu lemmatise alors, tu obtiens le lemme "étudier".

S'il est plus facilede procéder à la racinisation, la lemmatisation est plus propre. Et, oui, tu as raison, il y a quelques "stemmers" et lemmatiseurs pour l'anglais, mais pas autant pour les autres langues...

C'est fou, non ?

Puisque tu utilises TfidfVectorizer, pense aussi à utiliser des n-grams

The TfidfVectorizer has a parameter called ngram_range. You can use it to define if you want the vectorizer to account for word combinations instead of using single tokens only.

For instance, if you have the phrase “I love apples and bananas”, a 2-gram approach will consider every combination of 2 tokens:

[("I", "love"),
("love","apples"),
("apples","and"),
("and","bananas")]

You may also want to consider using collocations, which will merge tokens that appear commonly together, such as “single_bedroom” or “beautiful_house”.

Be careful, although, if you have removed stop words, numbers, or other elements from the text. Why? Because you may start merging tokens that originally didn’t appear together.

Some transformations require a specific order

While preprocessing is necessary, it cannot be done in any order. You won’t want to remove punctuation before removing URLs if you use regex to capture the latter. If you remove punctuation from the URL “https://vallant.in/” you will get “https vallant in”.

If you merge collocations before extracting stop words, some stop words may “glue” to important terms. If you remove them first, you may end up with fake collocations.

Preprocessing order is very important and should be done in a planned order. Read the documentation for the library that you are using.

Weng (2019)​5​ suggests the preprocessing order below:

  • Remove HTML tags
  • Remove extra whitespaces
  • Convert accented characters to ASCII characters
  • Expand contractions
  • Remove special characters
  • Lowercase all texts
  • Convert number words to numeric form
  • Remove numbers
  • Remove stopwords
  • Lemmatization

Mayo​6​ suggests that the 3 main components of text preprocessing are be

  • Tokenization
  • Normalization
  • Substitution

Don’t go crazy removing everything

Sometimes, especially in the social media case, if you remove things such as usernames, hashtags and URLs you end up with nothing. This can be a problem if you have to predict a text composed entirely of these elements, like the tweet “@mary @john https://vallant.in/nlp-in-practice-with-real-estate-listings/ #awesome #checkitout”.

A better approach would be replacing these elements with placeholders. After replacement, you could have “user user url hashtag hashtag”.

It’s not the perfect solution because you lose the tweet’s meaning. You could, for instance, find a way to tokenize the hashtags to transform them into words. The approach really depends on your problem.

Use Part of Speech tags

Part of Speech tagging, A.K.A. POS tagging, is the process of assigning a tag to each token explaining its function on the sentence. For instance, a token may be a noun, a verb, an adjective… This helps the classifier to better handle ambiguity.

Some words in Portuguese can be a noun or a verb. It happens in a lot of other languages either, such as English itself. By using POS tagging, the classifier will know the difference between tokens that look the same but have different morphological roles.

Nothing is helping me

If you already tried everything, including training deep learning and generic machine learning models, maybe the problem is your corpus or the question itself can’t be solved using a text classifier.

An example would be to try to find polarity in academic texts. You may find it, but it will be harder to classify an academic text as positive or negative. You may obtain better results using tweets or social media content.

So, what do you think? How do you improve a text classifier’s performance?

Références

  1. 1.
    Portuguese Tweets for Sentiment Analysis: 800k portuguese tweets separated in positive, negative and neutral classes. Portuguese Tweets for Sentiment Analysis | Kaggle. Accessed February 19, 2021. https://www.kaggle.com/augustop/portuguese-tweets-for-sentiment-analysis
  2. 2.
    Lima Vallantin W. Why is removing stop words not always a good idea. Medium. Published June 22, 2019. Accessed February 19, 2021. https://medium.com/@limavallantin/why-is-removing-stop-words-not-always-a-good-idea-c8d35bd77214
  3. 3.
    sklearn.feature_extraction.text.TfidfVectorizer. sklearn. Accessed February 19, 2021. https://scikit-learn.org/stable/modules/generated/sklearn.feature_extraction.text.TfidfVectorizer.html
  4. 4.
    D. Manning C, Raghavan P, Schütze H. Introduction to Information Retrieval. Cambridge University Press; 2008.
  5. 5.
    Weng J. NLP Text Preprocessing: A Practical Guide and Template. Medium. Published August 30, 2019. Accessed February 19, 2021. https://towardsdatascience.com/nlp-text-preprocessing-a-practical-guide-and-template-d80874676e79
  6. 6.
    Mayo M. A General Approach to Preprocessing Text Data. KDnuggets. Accessed February 19, 2021. https://www.kdnuggets.com/2017/12/general-approach-preprocessing-text-data.html

N'oublies pas de partager :

Partager sur linkedin
Partager sur twitter
Partager sur whatsapp
Partager sur facebook

Laisser un commentaire