Analyse des sentiments basée sur des règles en Python pour les scientifiques des données

Partager sur Facebook
Partager sur Twitter
Partager sur lié
Partager sur télégramme
Partager sur WhatsApp

Contenu

Cet article a été publié dans le cadre du Blogathon sur la science des données

50131couverture-5049842
Image de l'auteur prise en ligne sur befunky.com

D'après les experts, les 80% des données mondiales sont sous forme de données non structurées (images, vidéos, texte, etc.). Ces données pourraient être générées par des tweets / publications sur les réseaux sociaux, transcriptions d'appels, revues d'enquêtes ou d'entretiens, SMS sur les blogs, forum, informations, etc.

Il est humainement impossible de lire tout le texte sur le Web et de trouver des modèles. Cependant, il y a certainement un besoin pour l'entreprise d'analyser ces données pour prendre de meilleures mesures.

L'analyse des sentiments est l'un de ces processus permettant d'obtenir des connaissances à partir de données textuelles.. Pour obtenir les données pour l'analyse des sentiments, on peut directement extraire le contenu des pages Web en utilisant différentes techniques de grattage Web.

Si vous débutez dans le grattage Web, n'hésitez pas à consulter mon article “Web scraping avec Python: BelleSoupe”.

Qu'est-ce que l'analyse des sentiments?

Analyse des sentiments (également connu sous le nom d'exploration d'opinion ou d'émotion IA) est un sous-domaine de la PNL qui mesure l'inclinaison des opinions des gens (positif / négatif / neutre) dans un texte non structuré.

L'analyse des sentiments peut être effectuée en utilisant deux approches: basé sur des règles, basé sur l'apprentissage automatique.

Quelques applications de l'analyse des sentiments

  • Analyse du marché
  • Veille des réseaux sociaux
  • Analyse des retours clients: analyse de l'opinion ou de la réputation de la marque
  • Étude de marché

Qu'est-ce que le traitement du langage naturel (PNL)?

Le langage naturel est la façon dont nous, les humains, nous communiquons entre nous. Il peut s'agir de voix ou de texte. La PNL est la manipulation automatique du langage naturel par un logiciel. La PNL est un terme de niveau supérieur et est la combinaison de Compréhension du langage naturel (NLU) Oui Génération du langage naturel (GNL).

PNL = NLU + GNL

Certaines des bibliothèques de traitement du langage naturel de Python (PNL) fils:

  • Boîte à outils du langage naturel (NLTK)
  • TextBlob
  • ESPACER
  • Gensim
  • NoyauPNL

J'espère que nous avons une compréhension de base des termes Analyse des sentiments, PNL.

Cet article se concentre sur l'approche basée sur les règles de l'analyse des sentiments..

Approche basée sur des règles

Il s'agit d'une approche pratique pour analyser du texte sans formation ni à l'aide de modèles d'apprentissage automatique. Le résultat de cette approche est un ensemble de règles sur la base desquelles le texte est qualifié de positif. / négatif / neutre. Ces règles sont également appelées lexiques. Donc, l'approche basée sur les règles est appelée l'approche basée sur le lexique.

Les approches lexicales largement utilisées sont TextBlob, VADER, SentiWordNet.

Étapes de prétraitement des données:

  1. Nettoyer le texte
  2. Tokenisation
  3. Enrichissement: étiquetage point de vente
  4. Suppression des mots parasites
  5. Obtenez les mots racines

Avant de plonger dans les étapes ci-dessus, permettez-moi d'importer les données texte à partir d'un fichier txt.

Importez un fichier texte en utilisant Les pandas lisent CSV une fonction

# installer et importer la bibliothèque pandas
importer des pandas au format pd
# Création d'un cadre de données pandas à partir du fichier reviews.txt
données = pd.read_csv('avis.txt', sep = 't')
data.head()
48089ensemble de données-1090908

Cela n'a pas l'air bien. Ensuite, maintenant nous allons publier le “Sans nom: 0 " colonne à l'aide de la df.drop une fonction.

mydata = data.drop('Anonyme: 0', axe=1)
mesdonnées.head()
20134mesdonnées-2063250

Notre ensemble de données a un total de 240 observations (Commentaires).

Paso 1: Nettoyer le texte

Dans cette étape, nous devons supprimer les caractères spéciaux, numéros de texte. Nous pouvons utiliser le opérations d'expression régulière bibliothèque Python.

# Définir une fonction pour nettoyer le texte
def propre(texte):
# Supprime tous les caractères spéciaux et numériques quittant les alphabets
    texte = re.sub('[^ A-Za-z]+', ' ', texte)
    texte de retour

# Nettoyer le texte dans la colonne de révision
mes données[« Avis nettoyés »] = mesdonnées['revoir'].appliquer(nettoyer)
mesdonnées.head()

Explication: "Nettoyer" est la fonction qui prend du texte en entrée et le renvoie sans signes de ponctuation ni chiffres. Nous l'appliquons à la colonne « revue’ et nous créons une nouvelle colonne « Avis propres’ avec du texte clair.

50038nettoyé-3997448

Génial, Regardez l'image ci-dessus, tous les caractères spéciaux et chiffres sont supprimés.

Paso 2: Tokenisation

La tokenisation est le processus de division du texte en morceaux plus petits appelés Tokens. Peut être fait au niveau de la phrase (tokenisation de la phrase) ou par mot (tokenisation des mots).

Je vais effectuer la tokenisation au niveau du mot en utilisant tokenizar nltk fonction word_tokenize ().

Noter: Étant donné que nos données textuelles sont un peu volumineuses, je vais d'abord illustrer les étapes 2-5 avec de petits exemples de phrases.

Dis que nous avons une prière “Ceci est un article sur l'analyse des sentiments.". Peut être divisé en petits morceaux (enregistrements) comme il est montré dans ce qui suit.

36212tokenisation-1723070

Paso 3: Enrichissement: Etiquetage PLV

Étiquetage des parties du discours (PDV) est un processus de conversion de chaque jeton en un tuple qui a la forme (mot, étiqueter). Le balisage POS est essentiel pour préserver le contexte du mot et est essentiel pour le stemming.

Ceci peut être réalisé en utilisant nltk pos_tag une fonction.

Vous trouverez ci-dessous les balises POS de l'exemple de phrase “Ceci est un article sur l'analyse d'opinion”.

69315pos-6811672

Voir la liste des étiquettes pos de possibles. ici.

Paso 4: suppression des mots parasites

Les mots vides en anglais sont des mots qui contiennent très peu d'informations utiles. Nous devons les supprimer dans le cadre du prétraitement du texte. nltk a une liste de mots vides pour chaque langue.

Voir les mots vides en anglais.

74081mots vides-6310789

Exemple de suppression de mots vides:

82407mots vides20suppression-5989652

Les mots vides, est, un, sur sont supprimés et la phrase de sortie est « Analyse de l'opinion de l'article ».

Paso 5: obtenir les mots racines

Une racine fait partie d'un mot responsable de son sens lexical. Les deux techniques populaires pour obtenir les mots racines / racine sont la racine et la lemmatisation.

La principale différence est que Stemming donne souvent des mots racines absurdes, car il coupe juste quelques caractères à la fin. La tige fournit des racines significatives, cependant, nécessite des balises POS des mots.

Exemple pour illustrer la différence entre Stemming et Lematization: Cliquez ici pour obtenir le code

86878tigevslemma-1806383

Si nous regardons l'exemple précédent, La sortie de Stemming est Stem et la sortie de Lemmatizatine est Lemma.

Par le mot regarde, la tige coup d'œil cela n'a pas de sens. Alors que, la devise voir c'est parfait.

Maintenant, nous avons compris les étapes 2-5 prendre des exemples simples. Sans plus tarder, revenons à notre vrai problème.

Code pour les étapes 2 une 4: tokenisation, Etiquetage PLV, suppression des mots parasites

importer nltk
nltk.télécharger('Point')
de nltk.tokenize importer word_tokenize
de nltk importer pos_tag
nltk.télécharger('mots vides')
à partir de nltk.corpus importer des mots vides
nltk.télécharger('wordnet')
de nltk.corpus importer wordnet

# Dictionnaire de tagueur de point de vente
pos_dict = {'J':wordnet.ADJ, 'V':wordnet.VERBE, 'N':wordnet.NOM, 'R':wordnet.ADV}
def token_stop_pos(texte):
    balises = pos_tag(word_tokenize(texte))
    nouvelle liste = []
    pour mot, balise dans les balises:
        si mot.inférieur() pas dans l'ensemble(mots.mots.mots('Anglais')):
        newlist.append(tuple([mot, pos_dict.get(étiqueter[0])]))
    retourner la nouvelle liste

mes données['POS étiqueté'] = mesdonnées[« Avis nettoyés »].appliquer(jeton_stop_pos)
mesdonnées.head()

Explication: token_stop_pos est la fonction qui prend le texte et effectue la tokenisation, supprimer les mots vides et marquer les mots dans votre point de vente. Nous l'appliquons à la rubrique « Avis propres’ et nous créons une nouvelle colonne pour les données 'POS tagged'.

Comme mentionné précédemment, pour obtenir la devise précise, WordNetLemmatizer nécessite des balises POS en forme de « n », 'une', etc. Mais les balises POS obtenues à partir de pos_tag ont la forme 'NN', 'ADJ', etc.

Pour attribuer pos_tag aux balises wordnet, nous créons un dictionnaire pos_dict. Tout pos_tag commençant par J est mappé sur wordnet.ADJ, tout pos_tag commençant par R est mappé sur wordnet.ADV, et ainsi de suite.

Nos balises d'intérêt sont Noun, Adjectif, Adverbe, Verbe. Tout de ces quatre est affecté à Aucun.

686262-4-5372365

Dans la figure ci-dessus, nous pouvons voir que chaque mot de la colonne 'POS étiqueté’ mappe à votre point de vente à partir de pos_dict.

Code pour l'étape 5: obtenir les mots racines – Lématisation

à partir de nltk.stem importer WordNetLemmatizer
wordnet_lemmatizer = WordNetLemmatizer()
déf lemmatiser(pos_data):
    lemme_rew = " "
    pour mot, pos dans pos_data:
    sinon pos:
        lemme = mot
        lemma_rew = lemma_rew + " " + lemme
    autre:
        lemme = wordnet_lemmatizer.lemmatize(mot, position = position)
        lemma_rew = lemma_rew + " " + lemme
    retour lemma_rew

mes données['Lemme'] = mesdonnées['POS étiqueté'].appliquer(lemmatiser)
mesdonnées.head()

Explication: lemmatize est une fonction qui prend des tuples pos_tag et donne le lemme pour chaque mot dans pos_tag en fonction du position de ce mot. Nous l'appliquons à la colonne 'POS étiqueté’ et nous créons une colonne ‘Lema’ pour stocker la sortie.

993625-1353868

Oui, après un long voyage, nous en avons fini avec le pré-traitement du texte.

À présent, prenez une minute pour regarder les colonnes « revue », 'Devise’ et regardez comment le texte est traité.

94682prétraité-3532175

Lorsque nous avons terminé le prétraitement des données, nos données finales semblent propres. Faites une courte pause et revenez pour continuer la tâche réelle.

Analyse des sentiments à l'aide de TextBlob:

TextBlob est une bibliothèque Python pour le traitement de données textuelles. Fournit une API cohérente pour plonger dans les tâches courantes de traitement du langage naturel (PNL), comme marquer une partie du discours, extraction de syntagmes nominaux, analyse des sentiments et plus.

Les deux mesures utilisées pour analyser le sentiment sont:

  • Polarité: explique à quel point l'opinion est positive ou négative.
  • Subjectivité: parler de la subjectivité de l'opinion.

TextBlob (texte) .le sentiment nous donne les valeurs de Polarité, Subjectivité.
La polarité varie de -1 une 1 (1 est plus positif, 0 es neutre, -1 est plus négatif)
La subjectivité varie de 0 une 1 (0 c'est très objectif et 1 très subjectif)

88020tb-3016001
Exemple de sentiment TextBlob

Code Python:

à partir de textblob importer TextBlob
# fonction pour calculer la subjectivité
def getSubjectivité(revoir):
    retourner TextBlob(revoir).sentiment.subjectivité
    # fonction pour calculer la polarité
    def getPolarity(revoir):
        retourner TextBlob(revoir).sentiment.polarité

# fonction d'analyse des avis
analyse de déf(But):
    si score < 0:
        retourner 'Négatif'
    score elif == 0:
        retourner 'Neutre'
    autre:
        retourner 'positif'

Explication: fonctions créées pour obtenir des valeurs de polarité, subjectivité et étiqueter la critique en fonction du score de polarité.

Créer un nouveau bloc de données avec la révision, colonnes de lemmes et appliquer les fonctions ci-dessus

fin_data = pd.DataFrame(mes données[['revoir', 'Lemme']])
# fin_données['Subjectivité'] = fin_données['Lemme'].appliquer(obtenirSubjectivité) 
fin_données['Polarité'] = fin_données['Lemme'].appliquer(obtenirPolarité) 
fin_données['Une analyse'] = fin_données['Polarité'].appliquer(une analyse)
fin_data.head()
34789texteblob-5657703

Compter le nombre d'avis positifs, négatif et neutre.

tb_counts = fin_data.Analysis.value_counts()

tb_counts
55142textblobcount-9212161
Nombre d'avis positifs, négatif et neutre

Analyse des sentiments avec VADER

VADER signifie Valence Aware Dictionary et Sentiment Reasoner. Le sentiment de Vador ne dit pas seulement si la déclaration est positive ou négative ainsi que l'intensité de l'émotion.

52362vs-5728415

La somme des intensités pos, négatif, nouveau là-bas 1. Le composé varie de -1 une 1 y est la métrique utilisée pour dessiner le sentiment global.
positif si composé> = 0.5
neutre oui -0,5 <composé <0,5
négatif oui -0,5> = composé

Code Python:

de VaderSentiment.vaderSentiment importer SentimentIntensityAnalyzer
analyseur = SentimentIntensityAnalyzer()
# fonction pour calculer le sentiment du père
analyse du sentiment du père def(revoir):
    vs = analyseur.polarity_scores(revoir)
    retour vs['composé']
    fin_données[« Sentiment du père »] = fin_données['Lemme'].appliquer(analyse du sentiment du père)
# fonction à analyser
def vader_analysis(composé):
    si composé >= 0.5:
        retourner 'positif'
    composé elif <= -0.5 :
        retourner 'Négatif'
    autre:
        retourner 'Neutre'
fin_données[« Analyse de Vador »] = fin_données[« Sentiment du père »].appliquer(vader_analysis)
fin_data.head()

Explication: Fonctionnalités conçues pour obtenir des scores Vader et des critiques de balises basées sur des scores composites

Compter le nombre d'avis positifs, négatif et neutre.

Father_counts = fin_data[« Analyse de Vador »].value_counts()
vader_counts

Analyse des sentiments à l'aide de SentiWordNet

SentiWordNet utilise la base de données WordNet. Il est important d'obtenir le point de vente, devise de chaque mot. Ensuite, nous utiliserons la devise, POS pour obtenir les ensembles de synonymes (synsets). Ensuite, on obtient les scores objectifs, négatif et positif pour tous les synthétiseurs possibles ou le premier synthétiseur et nous étiquetons le texte.

oui note positive> note négative, le sentiment est positif
oui note positive <note négative, le sentiment est négatif
si score positif = score négatif, le sentiment est neutre

Code Python:

nltk.télécharger('sentiwordnet')
depuis nltk.corpus importer sentiwordnet en tant que swn
def sentiwordnetanalyse(pos_data):
    sentiments = 0
    jetons_compte = 0
    pour mot, pos dans pos_data:
        sinon pos:
            Continuez
            lemme = wordnet_lemmatizer.lemmatize(mot, position = position)
        sinon lemme:
            Continuez
            synsets = wordnet.synsets(lemme, position = position)
        sinon des synsets:
            Continuez
            # Prendre le premier sens, le plus commun
            synset = synsets[0]
            noise_synset = noise.senti_synset(synset.nom())
            sentiment += swn_synset.pos_score() - swn_synset.neg_score()
            jetons_count += 1
            # imprimer(swn_synset.pos_score(),swn_synset.neg_score(),swn_synset.obj_score())
        sinon tokens_count:
            revenir 0
        si sentiment>0:
            revenir "Positif"
        si sentiment==0:
            revenir "Neutre"
        autre:
            revenir "Négatif"

fin_données['Analyse SWN'] = mesdonnées['POS étiqueté'].appliquer(sentiwordnetanalyse)
fin_data.head()

Explication: Nous créons une fonction pour obtenir les scores positifs et négatifs pour le premier mot du synset, puis étiquetons le texte en calculant le sentiment comme la différence des scores positifs et négatifs.

Compter le nombre d'avis positifs, négatif et neutre.

swn_counts= fin_data['Analyse SWN'].value_counts()
compte_swn

Jusqu'ici, Nous avons vu la mise en œuvre de l'analyse des sentiments en utilisant certaines des techniques populaires basées sur le lexique. Maintenant, faites rapidement une visualisation et comparez les résultats.

Représentation visuelle des résultats TextBlob, VADER, SentiWordNet

Nous allons retracer le nombre d'avis positifs, négatif et neutre pour les trois techniques.

importer matplotlib.pyplot en tant que plt
%matplotlib en ligne
plt.figure(taille de la figue=(15,7))
plt.sous-intrigue(1,3,1)
plt.titre("Résultats TextBlob")
plt.pie(tb_counts.values, étiquettes = tb_counts.index, exploser = (0, 0, 0.25), autopct="%1.1F%%", shadow=Faux)
plt.sous-intrigue(1,3,2)
plt.titre("Résultats de VADER")
plt.pie(vader_counts.values, étiquettes = vader_counts.index, exploser = (0, 0, 0.25), autopct="%1.1F%%", shadow=Faux)
plt.sous-intrigue(1,3,3)
plt.titre("Résultats SentiWordNet")
plt.pie(swn_counts.values, étiquettes = swn_counts.index, exploser = (0, 0, 0.25), autopct="%1.1F%%", shadow=Faux)

Si nous regardons l'image ci-dessus, Les résultats TextBlob et SentiWordNet semblent un peu proches, tandis que les résultats de VADER montrent une grande variation.

Remarques finales:

Félicitations 🎉 à nous. A la fin de cet article, Nous avons appris les différentes étapes du prétraitement des données et les différentes approches lexicales de l'analyse des sentiments. Nous comparons les résultats de TextBlob, VADER, SentiWordNet à l'aide de camemberts.

Les références:

Documentation TextBlob

Analyse des sentiments VADER

SentiWordNet

Voir le carnet Jupyter complet ici hébergé sur GitHub.

Les supports présentés dans cet article ne sont pas la propriété d'Analytics Vidhya et sont utilisés à la discrétion de l'auteur..

Abonnez-vous à notre newsletter

Nous ne vous enverrons pas de courrier SPAM. Nous le détestons autant que vous.