Skip to content
Snippets Groups Projects
Commit c86bf97b authored by Guillaume Di Fatta's avatar Guillaume Di Fatta
Browse files

Merge branch 'salvador' into 'main'

J aime le riz noir dans le poke bowl

See merge request !3
parents 003cc7e6 054778d3
No related branches found
No related tags found
1 merge request!3J aime le riz noir dans le poke bowl
"""
Ce programme permet d'analyser un dataframe de tweet (sentiments)
et de renvoyer des dataframes prêt à la visualisation
"""
import math
import pandas as pd
from nrclex import NRCLex
from textblob import TextBlob
def emo_analysis(dataframe):
"""Analyse les sentiments présents dans les tweets fournis
Args:
dataframe (dataframe): dataframe avec les tweets
Returns:
list(dataframe,dataframe): listes de deux dataframes.
Le premier contient le traitement des emotions
et le second le traitement global
"""
# on ne garde que les textes
data_text = dataframe['full_text']
# on crée une chaine de caractère contenant tous les textes concaténés
stack = data_text.str.cat(others=None, sep=None,
na_rep=None, join='left')
# on calcule les occurences des mots par émotion
scores_dict = NRCLex(stack).raw_emotion_scores
# si aucun mot n'a été trouvés pour une catégorie, on crée la case et on la met à zéro
for word in ['fear', 'anger', 'joy', 'sadness', 'disgust', 'surprise', 'negative', 'positive']:
if word not in scores_dict:
scores_dict[word] = 0
# PARTIE 1 : EMOTIONS
# pour calculer la fréquence on a besoin d'un compteur des 6 émotions
emo_tot = scores_dict['fear'] + scores_dict['anger'] + scores_dict['joy'] + \
scores_dict['sadness'] + scores_dict['disgust'] + \
scores_dict['surprise']
# on crée le dataframe des émotions
dataframe1 = pd.DataFrame({
'Emotion': ['fear', 'anger', 'joy', 'sadness', 'disgust', 'surprise'],
'Frequency': [scores_dict['fear']/emo_tot,
scores_dict['anger']/emo_tot,
scores_dict['joy']/emo_tot,
scores_dict['sadness']/emo_tot,
scores_dict['disgust']/emo_tot,
scores_dict['surprise']/emo_tot]
})
# PARTIE 2 : OTHER DATA
global_tot = scores_dict['positive'] + scores_dict['negative']
stack_tb = TextBlob(stack)
fav = dataframe['favorite_count']
fav_freq = fav.mean()/7500000
alpha = 2000000
# pour la fame, on fait une comparaison au tweet le plus liké : 7.5 millions
# on a donc un résultat entre 0 et 1
# on veut zoomer proche de zéro, et tasser proche de 1, en gardant des résultats entre 0 et 1
# on utilise la fonction f(x)=log(1+alpha*x)/log(1+alpha)
dataframe2 = pd.DataFrame({
'Global': ['Positivity', 'Subjectivity', 'Fame'],
'Frequency': [scores_dict['positive']/global_tot,
stack_tb.sentiment.subjectivity,
math.log(1+alpha*fav_freq)/math.log(1+alpha)]
})
return ([dataframe1, dataframe2])
"""
A partir d'un dataframe, on fait une selection des 12
mots les plus fréquents pour ensuite créer la mosaïque d'images.
"""
from collections import Counter
from textblob import TextBlob
def frequent_words(dataframe, num):
"""recherche les n mots les plus fréquents dans
un dataframe de tweets
Args:
dataframe (datafram): contient les tweets
num (integer): nombre de mots recherchés
Returns:
list(strings): liste des mots n mots les plus fréquents
"""
text = ""
for tweet in dataframe["full_text"]:
text += " " + tweet
text = text.lower()
# On enlève au texte les chaines de carctères inutiles qui reviennent souvent
remove = ["https://t.co/", "&amp", "@",
"▫️", "", "'", "", "\"", " i ", " t ", " s "]
for mot in remove:
text = text.replace(mot, ' ')
text = TextBlob(text)
nouns_in_text = [w for (w, pos) in text.tags if (
pos[0] == 'N' or pos[0] == 'NN' or pos[0] == 'NNP' or pos[0] == 'NNS' or pos[0] == 'NNPS')]
# on enlève les mots de moins de 3 caractères
i = 0
while i < len(nouns_in_text):
if len(nouns_in_text[i]) < 3:
nouns_in_text.pop(i)
i = i+1
# On crée une liste avec des couples de la forme ("mot", nombre d'occurrences).
counter = Counter(nouns_in_text)
# on supprime le mot 's' qui apparait tout le temps
del counter['s']
# On prend dans la liste Counter les n mots les plus fréquents.
most_frequent = counter.most_common(num)
# Finalement, on fait une liste uniquement avec les mots.
most_frequent_words = [couple[0] for couple in most_frequent]
return most_frequent_words
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment