diff --git a/src/old_coding_weeks/emotions_fct.py b/src/old_coding_weeks/emotions_fct.py new file mode 100644 index 0000000000000000000000000000000000000000..e502aa86cc64c7c7dbbb8fccb2b571c3d489660a --- /dev/null +++ b/src/old_coding_weeks/emotions_fct.py @@ -0,0 +1,77 @@ + +""" + 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]) diff --git a/src/old_coding_weeks/fetch_words.py b/src/old_coding_weeks/fetch_words.py new file mode 100644 index 0000000000000000000000000000000000000000..85b0160f73b2fb6962966b0b9ab7477c2cc5cc88 --- /dev/null +++ b/src/old_coding_weeks/fetch_words.py @@ -0,0 +1,60 @@ + +""" +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/", "&", "@", + "▫️", "•", "'", " ’ ", "\"", " 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