<jupyter_start><jupyter_text>Importation et Concaténation<jupyter_code>dfS = pd.read_csv('data/labeled_samples/sample_Sylvere.csv', delimiter=',', header=None)
dfF = pd.read_csv('data/labeled_samples/sample_Francois.csv', delimiter=',', header=None)
dfV = pd.read_csv('data/labeled_samples/sample_Vitali2.csv', delimiter=',', header=None)
dfW = pd.read_csv('data/labeled_samples/sample_Wesley_labeled.csv', delimiter=',', header=None)
dfC = pd.read_csv('data/labeled_samples/sample_Cedric_labeled.csv', delimiter=',', header=None)
dfFa = pd.read_csv('data/labeled_samples/sample_Fatima.csv', delimiter=',', header=None)
#Concatene tous nos csv dans un seul dataframe
df = pd.concat([dfS, dfF, dfC, dfV, dfFa, dfW], ignore_index=True, axis=0)
df.rename(columns={0: 'id', 1 : 'label', 2 : 'review'}, inplace = True)
df.head()
#ajout de nouveaux commentaires
new_sample = pd.read_csv('data/labeled_samples/aditional_sample_labeled.csv', encoding = 'UTF-8')
new_sample = new_sample[['Unnamed: 0', 'label','caption']]
new_sample.rename(columns={'Unnamed: 0': 'id', 'caption' : 'review'}, inplace = True)
df = pd.concat([df,new_sample], ignore_index=True)<jupyter_output><empty_output><jupyter_text>Data cleaning<jupyter_code>#supprimer les ligne avec les NAs
print('Avant:', len(df))
df.dropna(inplace = True)
print('Après:', len(df))
#Normalisation des labels
di  = {'temps d''attente' : "temps d'attente",
       "temps d' attente" : "temps d'attente",
       "temps d'attente n" : "temps d'attente",
       "temps d'attente N" : "temps d'attente",
       " temps attente" : "temps d'attente",
       "'temps d''attente'" : "temps d'attente",
       "temps d’attente" : "temps d'attente",
       "temps d'attente " : "temps d'attente",
       "temps-attente" : "temps d'attente",
       "temps d'attentes" : "temps d'attente",
       "Temps d'attente" : "temps d'attente",
       "Temps-Attente" : "temps d'attente",
       "Temps d'attente " : "temps d'attente",
       "relation commerciale" : "relation commercial",
       "relation-commerciale" : "relation commercial",
       " relation commerciale" : "relation commercial",
       "relation commerciale " : "relation commercial",
       "emotion" : "émotion",
       "emotion ": "émotion",
       "Emotion / Ressenti" : "émotion",
       "Emotion" : "émotion",
       " Emotion/Ressenti" : "émotion", 
       "emotion/ressenti" : "émotion",                         
       "emotion / ressenti" : "émotion",
       "emotion-ressenti" : "émotion",
       "temps d''attente" : "temps d'attente",
       "accueil" : "accueil / politesse",
       "Acceuil" : "accueil / politesse",
       "accueil" : "accueil / politesse",
       "acceuil / politesse" : "accueil / politesse",
       "accueil-politesse" : "accueil / politesse",
       "accueil/politesse" : "accueil / politesse",
       " accueil/politesse" : "accueil / politesse",
       "accueil" : "accueil / politesse",
       "problème-technique" : "problème technique",
       "probleme technique" : "problème technique",
       "Problème-Technique" : "problème technique",
       " problème technique  " : "problème technique",
       "Problème technique" : "problème technique",
       "Probleme Technique" : "problème technique",
       "Problème Technique" : "problème technique",
       "acceuil" : "accueil / politesse",
       "accueil" : "accueil / politesse",
       "accueil " : "accueil / politesse",
       "Accueil" : "accueil / politesse",
       "Accueil-politesse" : "accueil / politesse",
       "Acceuil / Politesse" : "accueil / politesse",
       "Accueil / Politesse" : "accueil / politesse",
       "motion" : "émotion",
       "Emotion" : "émotion",
       "Emotion ": "émotion",
       "Emotion-Ressenti" : "émotion",
       "cadre/atmosphère" : "cadre / atmosphère",
       "cadre-atmosphère" : "cadre / atmosphère",
       "cadre" : "cadre / atmosphère",
       "Cadre-Atmosphère" : "cadre / atmosphère",
       "cadre / atmosphere" : "cadre / atmosphère",
       "cadre / atmosphere " : "cadre / atmosphère",
       "relation commerciale" : "relation commercial",
       "Relation commercial" : "relation commercial",
       "changement d’opérateur / départ boutique" : "changement d'opérateur",
       "'changement d''opérateur'" : "changement d'opérateur",
       "changement-opérateur" : "changement d'opérateur",
       "Changement d'opérateur" : "changement d'opérateur",
       "Changement-Opérateur" : "changement d'opérateur",
       " accueil politesse" : "accueil / politesse",
       " emotion/ressenti" : "émotion",
       "conseil" : "relation commercial",
       "Mauvais service client" : "relation commercial",
       "Relation-Commerciale" : "relation commercial",
       "Relation commerciale" : "relation commercial",
       "Relation Commercial" : "relation commercial",
       "cadre / atmosphere" : "cadre / atmosphère",
       "Cadre / Atmosphère": "cadre / atmosphère",
       "Cadre / Atmosphere" : "cadre / atmosphère",
       "Cadre / Atmosphere " : "cadre / atmosphère",
       "Cadre" : "cadre / atmosphère"}
df.replace({"label": di}, inplace=True)
#calculer la taille des classes
df['label'].value_counts()
#suppresion de la catégorie "changement d'opérateur"
df = df[df.label != "changement d'opérateur"]
# tous les carateres en miniscule et le contenu des colonnes en string 
df = pd.concat([df[col].astype(str).str.lower() for col in df.columns], axis=1)<jupyter_output><empty_output><jupyter_text>Création de TRAIN set<jupyter_code>train_data = df.groupby('label').apply(lambda x: x.sample(n=60))
train_data.to_csv('data/train.csv', index=False, encoding = 'UTF-8')<jupyter_output><empty_output><jupyter_text>Tokenisation et Visualisation<jupyter_code>import nltk
from nltk.corpus import stopwords
#stopwords.words('french')
from string import punctuation
import re

from nltk.stem import WordNetLemmatizer
lemmatizer = WordNetLemmatizer()

from nltk import word_tokenize, pos_tag<jupyter_output><empty_output><jupyter_text>Tokenisation<jupyter_code>df.head()
# les commentaires sont mis dans df_comment
df_comment = df['review']
type(df_comment)
#place les commentaires dans une varb en str
commentstr = ''.join(df_comment)
print(type(commentstr))
#les commentaires stocker dans un string pour pouvoir les passer dans le tokenizer
commentstr
#commentstr3 = tknzr.tokenize(commentstr)
# On met la methode RegexTokennizer dans la varb tokenizer
tokenizer = nltk.RegexpTokenizer(r'\w+')

# On transforme commentstr en token
commentstr4 = tokenizer.tokenize(commentstr)
print(len(commentstr4))
type(commentstr4)<jupyter_output><empty_output><jupyter_text>Visulisation des données<jupyter_code># Stocke dans freq la frequence d'apparition des mots dans nos tokens

freq = nltk.FreqDist(commentstr4)
freq
len(freq)
#places les mots(tokens) les plus  frequents dans 'freq_mostcom' un dict{}
freq_mostcom = freq.most_common(25)
freq_mostcom
#place les comment les plus frequents dans un dataframe pour faire un graph

df_freq = pd.DataFrame.from_dict(freq_mostcom)
df_freq.columns = ['mots', 'total']

df_freq
df_freq.plot.bar(x='mots',y='total')

import seaborn as sns


sns.set(rc={'figure.figsize':(13,8)})

graph = sns.barplot(x="mots", y="total", data=df_freq, palette="Blues_d", orient="v" )
graph.set_xticklabels(graph.get_xticklabels(), rotation=30)<jupyter_output><empty_output><jupyter_text>Analyse des données et stopwords<jupyter_code>no_stopwords = set(('ne', 'pas','n'))

punctuation = set(punctuation) - set(('?', '!'))

stoplist = set(nltk.corpus.stopwords.words('french')) - no_stopwords

len(stoplist)<jupyter_output><empty_output><jupyter_text>Suppression des mots les plus fréquents<jupyter_code>#les 18 mots les plus frequents
freq_mostcom18 = freq.most_common(18)
#rajoute les 18 mots les plus frequents a la stoplist
stoplist.update(freq_mostcom18)

len(stoplist)
comment5 = []
#Stock dans comment5, tous les mots non présent dans la stoplist et punctuation
comment5 += [w for w in commentstr4 if not w in list(stoplist) and (w not in punctuation)]
comment5
len(comment5)<jupyter_output><empty_output><jupyter_text>Mots les moins fréquents<jupyter_code>#Les moins frequents

freq_less = dict(freq.most_common()[-100:])
freq_less<jupyter_output><empty_output><jupyter_text>Mots par nombres d'apparitions<jupyter_code>#Place les valeurs du dict avec les frequences d'apparition des mots dans nb1()
nb1 = freq.values()

nb1
from collections import Counter

#Counter va compter la frequence d'apparition des mots par nombre(nb1 = valeurs du dict Freq) 
nb_apparition_mots = Counter(nb1)

#frequence d'apparition des mots par nombre, classer du plus petit au plus grand
#ex: il y a 1945 mots qui apparaissent 1 fois 

nb_apparition_mots.most_common()<jupyter_output><empty_output><jupyter_text>Mots par ordre alphabétique<jupyter_code>#Les mots du dataset ranger par ordre alphabetiques
mots_alphabetique = sorted(freq)
type(mots_alphabetique), len(mots_alphabetique)
mots_alphabetique<jupyter_output><empty_output><jupyter_text>Suppression de nombres<jupyter_code>#les 93 premiers(a supprimer), qui sont des nombres ou des heures
nb_a_supp = mots_alphabetique[:93]
#rajoute les nb a la stoplist
stoplist.update(nb_a_supp)

len(stoplist)
stoplist
comment7 = []
comment7 = [w for w in commentstr4 if not w in list(stoplist) and (w not in punctuation)]

len(comment7)
len(freq)
len(commentstr4)<jupyter_output><empty_output><jupyter_text>suppression de mots récurrents<jupyter_code>freq2 = nltk.FreqDist(comment7)


len(freq2)
freq2.most_common() 
mots_a_sup = ("tant pouvais pouvoir faire bonjour comme etc lorsque dit cet veut veux rue alpagué dû première côté quel certain doit opã oui mn haut pris faut u deux cette tout si car ã my problã of allez leurs puis entre bonour voir aussi quoi cela autres e the lã in for alors prendre ça dire aller après donc i to être and rã tã trã fois traduit dã fait chez cette ã mère tabac poste mis go  are went some sold  us when up do french venez agrã quâ ds annã occupã allã mãªme là nâ number your apple who weeks about quickly quant effet passée min rj11 esim demain pompom durant viendrais sent habite trois hors ainsi all dés train vont chère via troisième just think their better first could but new now our what selling even allée mains imprimante justificatif rendue vie midi r coise film ue faisant mise bã mã numã ãªtes sale wanted will from after talk offer ration pb ok jeudi moths ve tienen hay this one opéra prenez jusqu'")
type(mots_a_sup)
mots_a_sup2 = mots_a_sup.strip(',').split()

len(mots_a_sup2)
stoplist.update(mots_a_sup2)

len(stoplist)
comment7 = [w for w in commentstr4 if not w in list(stoplist) and (w not in punctuation)]

len(comment7), type(comment7)
comment7<jupyter_output><empty_output><jupyter_text>Stemming<jupyter_code>from nltk.stem.snowball import FrenchStemmer

stemmer = FrenchStemmer()
tokens2 = tokenizer.tokenize(commentstr)

type(commentstr4), len(commentstr4)
comment_stem = [stemmer.stem(w) for w in commentstr4 if not w in list(stoplist)]
type(comment_stem), len(comment_stem)
comment_stem<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.12012987012987013, 'fraction_numerical': 0.007215007215007215, 'mean_word_length': 4.796654469419759, 'pattern_counts': {'":': 4, '<': 57, '<?xml version=': 0, '>': 57, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '14', 'dir': 'jupyter-structured-clean-dedup', 'id': '257721', 'license': 'MIT', 'n_tokens_mistral': 4026, 'n_tokens_neox': 3968, 'n_words': 973, 'path': 'nettoyage.ipynb', 'repo_name': 'FatimaMoqran/comments_classifier', 'size': '11088'}