Esempio n. 1
0
class Interface:
    fig=None
    def __init__(self, top=None):
        '''This class configures and populates the toplevel window.
           top is the toplevel containing window.'''
        _bgcolor = '#d9d9d9'  # X11 color: 'gray85'
        _fgcolor = '#000000'  # X11 color: 'black'
        _compcolor = '#d9d9d9' # X11 color: 'gray85'
        _ana1color = '#d9d9d9' # X11 color: 'gray85'
        _ana2color = '#ececec' # Closest X11 color: 'gray92'
        self.style = ttk.Style()
        if sys.platform == "win32":
            self.style.theme_use('winnative')
        self.style.configure('.',background=_bgcolor)
        self.style.configure('.',foreground=_fgcolor)
        self.style.configure('.',font="TkDefaultFont")
        self.style.map('.',background=
            [('selected', _compcolor), ('active',_ana2color)])

        top.geometry("1360x768")
        top.title("Analyseur des Corpus")
        top.configure(background="#d9d9d9")
        top.configure(cursor="xterm")

        self.Titre = tk.Label(top)
        self.Titre.pack()
        self.Titre.configure(background="#d9d9d9")
        self.Titre.configure(disabledforeground="#a3a3a3")
        self.Titre.configure(font="-family {8514oem} -size 18")
        self.Titre.configure(foreground="#000000")
        self.Titre.configure(text='''Analyse Comparatif des Corpus''')

        self.menubar = tk.Menu(top,font="TkMenuFont",bg=_bgcolor,fg=_fgcolor)
        top.configure(menu = self.menubar)
        
        #Fram champ de recherche
        self.zone_recherche = tk.LabelFrame(top)
        self.zone_recherche.place(x=10, y=50, relheight=0.13,width=300)
        self.zone_recherche.configure(relief='groove')
        self.zone_recherche.configure(foreground="black")
        self.zone_recherche.configure(text='''recherche''')
        self.zone_recherche.configure(background="#d9d9d9")
        
        
        #Label mot clé
        self.Nom_auteur = tk.Label(self.zone_recherche)
        self.Nom_auteur.place(relx=0.018, rely=0.299, height=17.3, width=75.48
                , bordermode='ignore')
        self.Nom_auteur.configure(background="#d9d9d9",disabledforeground="#a3a3a3"
                                  ,foreground="#000000",text='''Mot clé''' )
        
        #champ de saisie pour le mot clé
        self.EntryNA = tk.Entry(self.zone_recherche, textvariable=IS.keyword)
        self.EntryNA.place(relx=0.250, rely=0.272, height=24, width=130, bordermode='ignore')
        self.EntryNA.configure(background="white")
        self.EntryNA.configure(disabledforeground="#a3a3a3")
        self.EntryNA.configure(font="TkFixedFont")
        self.EntryNA.configure(foreground="#000000")
        self.EntryNA.configure(insertbackground="black")
        
        #Fram Paramétrage de la recherche
        self.parametre = tk.LabelFrame(top)
        self.parametre.place(x=10, y=150, height=400, width=300)
        self.parametre.configure(relief='groove')
        self.parametre.configure(foreground="black")
        self.parametre.configure(text='''Paramétrage de la recherche''')
        self.parametre.configure(background="#d9d9d9")
        
        #Fram Résultat
        self.resultat = tk.LabelFrame(top)
        self.resultat.place(x=320, y=50, height=550, width=900)
        self.resultat.configure(relief='groove')
        self.resultat.configure(foreground="black")
        self.resultat.configure(text=' ')
        self.resultat.configure(background="#d9d9d9")
        

        
        #Label choix-corpus
        self.Affichage = tk.Label(self.parametre)
        self.Affichage.place(x=10, y=30 ,height=20.6, width=55.48, bordermode='ignore')
        self.Affichage.configure(background="#d9d9d9")
        self.Affichage.configure(disabledforeground="#a3a3a3")
        self.Affichage.configure(foreground="#000000")
        self.Affichage.configure(text='''Corpus''')
        
        #champ selectionné sur choix-corpus
        self.TComboboxAff = ttk.Combobox(self.parametre)
        self.TComboboxAff.place(x=70, y=30, height=24, width=80, bordermode='ignore')
        self.TComboboxAff.configure(textvariable=IS.comboAff)
        self.TComboboxAff.configure(cursor="fleur")
        self.TComboboxAff.configure(values=["Reddit","Arxiv","Tous"])
        
        
        #Fram Filtrage temporelle
        self.temporelle = tk.LabelFrame(self.parametre)
        self.temporelle.place(relx=0.03, rely=0.20, height=130
                , width=250)
        self.temporelle.configure(relief='groove')
        self.temporelle.configure(foreground="black")
        self.temporelle.configure(text='''Filtrage temporel''')
        self.temporelle.configure(background="#d9d9d9")

        
        #◘Label jour
        self.jour = tk.Label(self.temporelle)
        self.jour.place(x=10, y=30
                , bordermode='ignore')
        self.jour.configure(background="#d9d9d9")
        self.jour.configure(disabledforeground="#a3a3a3")
        self.jour.configure(foreground="#000000")
        self.jour.configure(text='''Jour''')
        
        #champ saisie jour
        self.entryJour = ttk.Combobox(self.temporelle)
        self.entryJour.place(x=10, y=60, height=24, width=65, bordermode='ignore')
        self.entryJour.configure(textvariable=IS.jour)
        self.entryJour.configure(takefocus="")
        days=['01','02','03','04','05','06','07','08','09','10','11',
              '12','13','14','15','16','17','18','19','20','21','22','23',
              '24','25','26','27','28','30','31']
        self.entryJour.configure(values=days)
        
        #◘Label Mois
        self.mois = tk.Label(self.temporelle)
        self.mois.place(x=85, y=30, bordermode='ignore')
        self.mois.configure(background="#d9d9d9")
        self.mois.configure(disabledforeground="#a3a3a3")
        self.mois.configure(foreground="#000000")
        self.mois.configure(text='''Mois''')
        
        #champ saisie Mois
        self.entryMois = ttk.Combobox(self.temporelle)
        self.entryMois.place(x=85, y=60, height=24
                , width=80, bordermode='ignore')
        self.entryMois.configure(textvariable=IS.mois)
        self.entryMois.configure(takefocus="")
         # month contient les mois de l'année
        months=['January','February','March','April','May','June','July',
                'August','September','October','November','December']
        self.entryMois.configure(values=months)
        
        #◘Label Année
        self.annee = tk.Label(self.temporelle)
        self.annee.place(x=175, y=30
                , bordermode='ignore')
        self.annee.configure(background="#d9d9d9")
        self.annee.configure(disabledforeground="#a3a3a3")
        self.annee.configure(foreground="#000000")
        self.annee.configure(text='''Année''')
        
        #champ saisie Année
        self.entryAnnee = ttk.Combobox(self.temporelle)
        self.entryAnnee.place(x=175, y=60, height=24
                , width=65, bordermode='ignore')
        self.entryAnnee.configure(textvariable=IS.annee)
        self.entryAnnee.configure(takefocus="")
        years=['2018','2019','2020','2021']
        self.entryAnnee.configure(values=years)
        
        #Label champ limite
        self.labelLimite=tk.Label(self.parametre, text="Top", background="#d9d9d9")
        self.labelLimite.place(x=85,y=230)
        
        #valeur limit
        self.valLimite=tk.Spinbox(self.parametre, from_=1, to=10, width=5,textvariable=IS.limite)
        self.valLimite.place(x=120,y=230)
        
        
        #Nettoyage & Normalisation
        self.menubar = tk.Menu(top)
        self.menu1 = tk.Menu(self.menubar, tearoff=0)
        self.menu1.add_command(label="Stopwords", command=self.stopwords)
        self.menu1.add_command(label="Lemmatisation",command=self.lemmatisation)
        self.menu1.add_command(label="Stemming", command=self.stemming)
        self.menu1.add_command(label="Search Words", command=self.relationImportance) 
        self.menubar.add_cascade(label="Corpus actions", menu=self.menu1)
        
        #action date
        self.menu2 = tk.Menu(self.menubar, tearoff=0)
        self.menu2.add_command(label="jour/mois", command=self.day_management)
        self.menu2.add_command(label="mois",command=self.month_management)
        self.menu2.add_command(label="année", command=self.year_management)
        self.menu2.add_command(label="date complète", command=self.date_management)
        self.menubar.add_cascade(label="Time actions", menu=self.menu2)
        
        top.config(menu=self.menubar)
        
        ############ gestion des bouttons #####################
        
        # 1- boutton sur le mot clé
        
        self.Button1 = tk.Button(self.zone_recherche, text="recherche", command=self.conconrdance)
        self.Button1.place(x=230,y=10, height=24)
        
        # 2- boutton choix corpus
        
        self.Button2 = tk.Button(self.parametre, text="recherche", command=self.action_corpus)
        self.Button2.place(x=230,y=12, height=24)
        
        
        #bouton de renitialisation 
        self.ButtonRecherche = tk.Button(top, command=self.renitialisation)
        self.ButtonRecherche.place(x=10, y=575, height=28, width=76.13)
        self.ButtonRecherche.configure(activebackground="#ececec")
        self.ButtonRecherche.configure(activeforeground="#000000")
        self.ButtonRecherche.configure(background="#d9d9d9")
        self.ButtonRecherche.configure(disabledforeground="#a3a3a3")
        self.ButtonRecherche.configure(foreground="#000000")
        self.ButtonRecherche.configure(highlightbackground="#d9d9d9")
        self.ButtonRecherche.configure(highlightcolor="black")
        self.ButtonRecherche.configure(pady="0")
        self.ButtonRecherche.configure(text='''Reset''')

        #####instance corpus
        
        self.corpus_general,self.corpus_reddit,self.corpus_arxiv=Corpus("Corona").remplir_corpus()
######################################################################
##################### methode de classe ##############################    
    #reset le cadre resultat
    def clearFrame(self,frame):
        # destroy all widgets from frame
        for widget in frame.winfo_children():
           widget.destroy()
        frame.pack_forget()
        
    #### fonction renitialisation
    def renitialisation(self):
        self.clearFrame(self.resultat)
        IS.jour.set("day")
        IS.mois.set("Month")
        IS.annee.set("Year")
        IS.limite.set(10)
        IS.comboAff.set("Tous")
        IS.keyword.set("")
        
        
    # action freq_stats sur l'ensemble de doonées 
    def freq_stats(self,stats,couleur,titre,limite):
        df = pandas.DataFrame.from_dict(stats, orient='index').head(limite)
        df = df.sort_values(by = 'total', ascending = False)
        fig = df.plot(figsize=(20,10),kind='bar', color=couleur, title=titre).get_figure()
        canvas = FigureCanvasTkAgg(fig, master=self.resultat)
        canvas.get_tk_widget().pack()
        canvas.draw()
        
    def action_corpus(self):
        self.clearFrame(self.resultat)
        var=IS.comboAff.get()
        limite=IS.limite.get()
        
        if var=="Tous":
            freq,stats,voc = self.corpus_general.freq_stats_corpus1(True)
            titre="Top "+str(limite)+" publication(s) Redit-Arxiv par nombre de mots"
            self.freq_stats(stats, IS.colorAllCorpus, titre, limite)
        elif var=="Reddit" :
            freq,stats,voc = self.corpus_reddit.freq_stats_corpus1(False)
            titre="Top "+str(limite)+" publication(s) Reddit par nombre de mots"
            self.freq_stats(stats, IS.colorReddit, titre, limite)
        else :
            freq,stats,voc = self.corpus_arxiv.freq_stats_corpus1(False)
            titre="Top "+str(limite)+" publication(s) Arxiv par nombre de mots"
            self.freq_stats(stats, IS.colorArxiv, titre, limite)
            
    #action stopwords
    def stopwords(self):
            self.clearFrame(self.resultat)
            var=IS.comboAff.get()
            limite=IS.limite.get()
            if var=="Tous":
                freq,stats,voc = self.corpus_general.freq_stats_corpus2(True)
                titre="Top "+str(limite)+" publication(s) Reddit-Arxiv apres suppression de stopwords"
                self.freq_stats(stats, IS.colorAllCorpus, titre, limite)
            elif var=="Reddit":
                freq,stats,voc = self.corpus_reddit.freq_stats_corpus2(False)
                titre="Top "+str(limite)+" publication(s) Reddit apres suppression de stopwords"
                self.freq_stats(stats, IS.colorReddit, titre, limite)
               
            else :
                freq,stats,voc = self.corpus_arxiv.freq_stats_corpus2(False)
                titre="Top "+str(limite)+" publication(s) Arxiv apres suppression de stopwords"
                self.freq_stats(stats, IS.colorArxiv, titre, limite)
            
    #action lemmatisation
    def lemmatisation(self):
            self.clearFrame(self.resultat)
            var=IS.comboAff.get()
            limite=IS.limite.get()
            if var=="Tous" : 
                freq,stats,voc = self.corpus_general.freq_stats_corpus3(True)
                titre="Top "+str(limite)+" publication(s) Reddit-Arxiv apres lemmatisation"
                self.freq_stats(stats, IS.colorAllCorpus, titre, limite)
            elif var=="Reddit":
                freq,stats,voc = self.corpus_reddit.freq_stats_corpus3(False)
                titre="Top "+str(limite)+" publication(s) Reddit apres lemmatisation"
                self.freq_stats(stats, IS.colorReddit, titre, limite)
            else:
                freq,stats,voc = self.corpus_arxiv.freq_stats_corpus3(False)
                titre="Top "+str(limite)+" publication(s) Arxiv apres lemmatisation"
                self.freq_stats(stats, IS.colorArxiv, titre, limite)
                
            
    #action stemming
    def stemming(self):
            self.clearFrame(self.resultat)
            var=IS.comboAff.get()
            limite=IS.limite.get()
            if var=="Tous":
                freq,stats,voc = self.corpus_general.freq_stats_corpus4(True)
                titre="Top "+str(limite)+" publication(s) Reddit-Arxiv apres stemming"
                self.freq_stats(stats, IS.colorAllCorpus, titre, limite)   
            elif var=="Reddit":
                freq,stats,voc = self.corpus_reddit.freq_stats_corpus4(False)
                titre="Top "+str(limite)+" publication(s) Reddit apres stemming"
                self.freq_stats(stats, IS.colorReddit, titre, limite)
            else :
                freq,stats,voc = self.corpus_arxiv.freq_stats_corpus4(False)
                titre="Top "+str(limite)+" publication(s) Arxiv apres stemming"
                self.freq_stats(stats, IS.colorArxiv, titre, limite)

    #########################################
    #les action sur la date
    
    #sur l'année
    def year_management(self):
        self.clearFrame(self.resultat)
        IS.mois.set("")
        IS.jour.set("")
        var_year=IS.annee.get()
        var_limite=IS.limite.get()
        var_corpus=IS.comboAff.get()
        
        if var_corpus=="Tous":
           result=self.corpus_general.most_frequent_word_by_year(var_year, var_limite)
           titre=" Le(s) "+str(var_limite)+" mots le(s) plus fréquent(s) en "+var_year+" sur les deux Corpus"
           couleur=IS.colorAllCorpus
        elif var_corpus=="Reddit":
           result=self.corpus_reddit.most_frequent_word_by_year(var_year, var_limite)
           titre=" Le(s) "+str(var_limite)+" mots le(s) plus fréquent(s) en "+var_year+" sur Reddit"
           couleur=IS.colorReddit
        else :
            result=self.corpus_arxiv.most_frequent_word_by_year(var_year, var_limite)
            titre=" Le(s) "+str(var_limite)+" mots le(s) plus fréquent(s) en "+var_year+" sur Arxiv"
            couleur=IS.colorArxiv
        
        if len(result) ==0:
            showinfo("alerte", "Pas de resultat!")
        else:
            mon_dic=dict((x,y) for x, y in result)
            # for key in mon_dic.keys():
            #     if key.isdigit():
            #         del mon_dic[key]
            df = pandas.DataFrame.from_dict(mon_dic, orient='index')
            fig = df.plot(figsize=(20,10),kind='bar', color=couleur, title=titre).get_figure()
            canvas = FigureCanvasTkAgg(fig, master=self.resultat)
            canvas.get_tk_widget().pack()
            canvas.draw()
    
    #sur le mois
    def month_management(self):
        self.clearFrame(self.resultat)
        IS.annee.set("")
        IS.jour.set("")
        var_month=IS.mois.get()
        var_limite=IS.limite.get()
        var_corpus=IS.comboAff.get()
        
        if var_corpus=="Tous":
           result=self.corpus_general.most_frequent_word_by_month(var_month, var_limite)
           titre=" Le(s) "+str(var_limite)+" mots le(s) plus fréquent(s) en "+var_month+" sur les deux Corpus"
           couleur=IS.colorAllCorpus
        elif var_corpus=="Reddit":
           result=self.corpus_reddit.most_frequent_word_by_month(var_month, var_limite)
           titre=" Le(s) "+str(var_limite)+" mots le(s) plus fréquent(s) en "+var_month+" sur Reddit"
           couleur=IS.colorReddit
        else :
            result=self.corpus_arxiv.most_frequent_word_by_month(var_month, var_limite)
            titre=" Le(s) "+str(var_limite)+" mots le(s) plus fréquent(s) en "+var_month+" sur Arxiv"
            couleur=IS.colorArxiv
        
        if len(result) ==0:
            showinfo("alerte", "Pas de resultat!")
        else:
            mon_dic=dict((x,y) for x, y in result)
            df = pandas.DataFrame.from_dict(mon_dic, orient='index')
            fig = df.plot(figsize=(20,10),kind='bar', color=couleur, title=titre).get_figure()
            canvas = FigureCanvasTkAgg(fig, master=self.resultat)
            canvas.get_tk_widget().pack()
            canvas.draw()
    #pour un jour donné
    def day_management(self):
        self.clearFrame(self.resultat)
        IS.annee.set("")
        IS.mois.set("")
        var_day=IS.jour.get()
        var_limite=IS.limite.get()
        var_corpus=IS.comboAff.get()
        
        if var_corpus=="Tous":
           result=self.corpus_general.most_frequent_word_by_day(var_day, var_limite)
           titre=" Le(s) "+str(var_limite)+" mots le(s) plus fréquent(s) le "+var_day+" de chaque mois sur les deux Corpus"
           couleur=IS.colorAllCorpus
        elif var_corpus=="Reddit":
           result=self.corpus_reddit.most_frequent_word_by_day(var_day, var_limite)
           titre=" Le(s) "+str(var_limite)+" mots le(s) plus fréquent(s) le "+var_day+" de chaque mois sur Reddit"
           couleur=IS.colorReddit
        else :
            result=self.corpus_arxiv.most_frequent_word_by_day(var_day, var_limite)
            titre=" Le(s) "+str(var_limite)+" mots le(s) plus fréquent(s) le "+var_day+" de chaque mois sur Arxiv"
            couleur=IS.colorArxiv
        
        if len(result) ==0:
            showinfo("alerte", "Pas de resultat!")
        else:
            mon_dic=dict((x,y) for x, y in result)
            df = pandas.DataFrame.from_dict(mon_dic, orient='index')
            fig = df.plot(figsize=(20,10),kind='bar', color=couleur, title=titre).get_figure()
            canvas = FigureCanvasTkAgg(fig, master=self.resultat)
            canvas.get_tk_widget().pack()
            canvas.draw()
    #pour une date donnée
    def date_management(self):
        self.clearFrame(self.resultat)
        var_day=IS.jour.get()
        var_m=IS.mois.get()
        var_year=IS.annee.get()
        var_month=IS.dic_date.get(var_m)
        var_date=var_year+"-"+var_month+"-"+var_day
        var_limite=IS.limite.get()
        var_corpus=IS.comboAff.get()
        
        if var_corpus=="Tous":
           result=self.corpus_general.most_frequent_word(var_date, var_limite)
           titre=" Le(s) "+str(var_limite)+" mots le(s) plus fréquent(s) le "+var_date+" sur les deux Corpus"
           couleur=IS.colorAllCorpus
        elif var_corpus=="Reddit":
           result=self.corpus_reddit.most_frequent_word(var_date, var_limite)
           titre=" Le(s) "+str(var_limite)+" mots le(s) plus fréquent(s) le "+var_date+" sur Reddit"
           couleur=IS.colorReddit
        else :
            result=self.corpus_arxiv.most_frequent_word(var_date, var_limite)
            titre=" Le(s) "+str(var_limite)+" mots le(s) plus fréquent(s) le "+var_date+" sur Arxiv"
            couleur=IS.colorArxiv
        
        if len(result) ==0:
            showinfo("alerte", "Pas de resultat!")
        else:
            mon_dic=dict((x,y) for x, y in result)
            df = pandas.DataFrame.from_dict(mon_dic, orient='index')
            fig = df.plot(figsize=(20,10),kind='bar', color=couleur, title=titre).get_figure()
            canvas = FigureCanvasTkAgg(fig, master=self.resultat)
            canvas.get_tk_widget().pack()
            canvas.draw()
            
    ##################################### word_cummun and specifique
    
    def relationImportance(self):
        self.clearFrame(self.resultat)
        wordCommun,specificReddit,specifArxiv=self.corpus_general.wordcommun_and_wordspecific()
        var_corpus=IS.comboAff.get()
        
        if var_corpus=='Tous' :
            df=sorted(list(wordCommun))
            message="Mots communs pour les deux corpus"
        elif var_corpus =='Reddit':
            df=sorted(list(specificReddit))
            message='Mots spécifiques pour Reddit'
        else :
            df=sorted(list(specifArxiv))
            message='Mots spécifiques pour Arxiv'
        
        
        titre=tk.Label(self.resultat, text=message, background="#d9d9d9",font="-family {8514oem} -size 14")
        titre.pack()
        
        scrollbar = tk.Scrollbar(self.resultat)
        scrollbar.pack(side="right", fill="y")
        
        listbox = tk.Listbox(self.resultat, yscrollcommand=scrollbar.set)
        for i in df:
            listbox.insert("end", i)
        listbox.pack(side="left", fill="both")
        scrollbar.config(command=listbox.yview)
        
    #### recherche de la conconrdance
    
    def conconrdance(self):
        self.clearFrame(self.resultat)
        result=self.corpus_general.concorde(IS.keyword.get()).head(100)
        if len(result)==0:
            showinfo("alerte", "Pas de resultat!")
        else :
            vargauche=result['gauche'].values.tolist()
            vardroite=result['droite'].values.tolist()
            motif=result['motif'].values.tolist()
            
            titre=tk.Label(self.resultat, text="concordance du mot "+IS.keyword.get(), background="#d9d9d9",
                           font="-family {8514oem} -size 14")
            titre.pack()
            
            self.scrollbar = tk.Scrollbar(self.resultat,command=self.scrollBoth)
            self.scrollbar.pack(side="right", fill="y")
            
            self.listbox1 = tk.Listbox(self.resultat, yscrollcommand=self.scrollbar.set)
            for i in vargauche:
                self.listbox1.insert("end", i)
            self.listbox1.pack(side="left", fill="both")
            
            
            self.listbox2 = tk.Listbox(self.resultat, yscrollcommand=self.scrollbar.set)
            for i in motif:
                self.listbox2.insert("end", i)
            self.listbox2.pack(side="left", fill="both")
            
            self.listbox3 = tk.Listbox(self.resultat, yscrollcommand=self.scrollbar.set)
            for i in vardroite:
                self.listbox3.insert("end", i)
            self.listbox3.pack(side="left", fill="both")
            
    def scrollBoth(self,*args):
        self.listbox1.yview(*args)
        self.listbox2.yview(*args)
        self.listbox3.yview(*args)
        self.scrollbar.set(*args)