Cet article a été publié dans le cadre du Blogathon sur la science des données
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:
- Nettoyer le texte
- Tokenisation
- Enrichissement: étiquetage point de vente
- Suppression des mots parasites
- 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()
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()
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.
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.
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”.
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.
Exemple de suppression de mots vides:
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
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.
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.
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é.
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)
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()
Compter le nombre d'avis positifs, négatif et neutre.
tb_counts = fin_data.Analysis.value_counts() tb_counts
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.
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:
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..