X-Git-Url: http://iramuteq.org/git?p=iramuteq;a=blobdiff_plain;f=ProfList.py;h=41dd3df3db7baa8ce511fddbd12870cc0ed22dad;hp=f564d6099172310d1f434a71a0e276941cf94426;hb=434a6105156cca276a69c294c8b99369cf41c66f;hpb=5d8c9f5cd6399fd4a7192b655b4aa0a7923d11b6 diff --git a/ProfList.py b/ProfList.py index f564d60..41dd3df 100644 --- a/ProfList.py +++ b/ProfList.py @@ -20,18 +20,19 @@ import wx.lib.mixins.listctrl as listmix #from tabsimi import DoSimi from listlex import ListForSpec from chemins import ConstructPathOut, ffr -from dialog import PrefExport, PrefUCECarac, SearchDial, message -from tableau import Tableau +from dialog import PrefExport, PrefUCECarac, SearchDial, message, MessageImage, BarFrame +from tableau import Tableau, copymatrix from search_tools import SearchFrame import webbrowser #import cStringIO import tempfile import codecs -from functions import exec_rcode, MessageImage, progressbar, treat_var_mod, doconcorde +from functions import exec_rcode, progressbar, treat_var_mod, doconcorde from PrintRScript import barplot from textclassechd import ClasseCHD from shutil import copyfile from operator import itemgetter +from copy import copy #--------------------------------------------------------------------------- class ProfListctrlPanel(wx.ListCtrl, listmix.ListCtrlAutoWidthMixin, listmix.ColumnSorterMixin): @@ -43,6 +44,7 @@ class ProfListctrlPanel(wx.ListCtrl, listmix.ListCtrlAutoWidthMixin, listmix.Col self.Source = gparent self.cl = cl self.var_mod = {} + self.them_mod = {} line1 = profclasse.pop(0) classen = [line for line in profclasse if line[0] != '*' and line[0] != '*****'] @@ -274,6 +276,9 @@ class ProfListctrlPanel(wx.ListCtrl, listmix.ListCtrlAutoWidthMixin, listmix.Col self.idlexdendro = wx.NewId() self.idcloud = wx.NewId() self.idexport = wx.NewId() + self.idexporttropes = wx.NewId() + self.idexportowledge = wx.NewId() + self.onmaketgen = wx.NewId() # self.export_classes = wx.NewId() self.Bind(wx.EVT_MENU, self.OnPopupOne, id=self.popupID1) @@ -296,6 +301,9 @@ class ProfListctrlPanel(wx.ListCtrl, listmix.ListCtrlAutoWidthMixin, listmix.Col self.Bind(wx.EVT_MENU, self.onlexdendro, id = self.idlexdendro) self.Bind(wx.EVT_MENU, self.oncloud, id = self.idcloud) self.Bind(wx.EVT_MENU, self.onexport, id = self.idexport) + self.Bind(wx.EVT_MENU, self.onexporttropes, id = self.idexporttropes) + self.Bind(wx.EVT_MENU, self.onexportowledge, id = self.idexportowledge) + self.Bind(wx.EVT_MENU, self.OnMakeTgen, id=self.onmaketgen) # self.Bind(wx.EVT_MENU, self.on_export_classes, id = self.export_classes) # self.Bind(wx.EVT_MENU, self.OnPopupThree, id=self.popupID3) @@ -314,7 +322,8 @@ class ProfListctrlPanel(wx.ListCtrl, listmix.ListCtrlAutoWidthMixin, listmix.Col menu_conc.Append(self.popupID2, u"dans les segments de texte de la classe") menu_conc.Append(self.popupID3, u"dans les segments de texte classés") menu_conc.Append(self.popupID4, u"dans tous les segments de texte") - menu.AppendMenu(-1, u"Concordancier", menu_conc) + menu.AppendMenu(-1, u"Concordancier", menu_conc) + menu.Append(self.onmaketgen, _(u"Make Tgen").decode('utf8')) menu_cnrtl = wx.Menu() menu_cnrtl.Append(self.popupID5, u"Définition") menu_cnrtl.Append(self.popupID6, u"Etymologie") @@ -329,6 +338,8 @@ class ProfListctrlPanel(wx.ListCtrl, listmix.ListCtrlAutoWidthMixin, listmix.Col menu.Append(self.iducecarac, u"Segments de texte caractéristiques") menu.Append(self.idcloud, u"Nuage de la classe") menu.Append(self.idexport, u'Exporter...') + menu.Append(self.idexporttropes, 'Exporter pour Tropes') + menu.Append(self.idexportowledge, 'Exporter pour Owledge') #menu.Append(self.popupID2, u"Concordancier") # menu.Append(self.popupID3, "recharger") @@ -347,7 +358,7 @@ class ProfListctrlPanel(wx.ListCtrl, listmix.ListCtrlAutoWidthMixin, listmix.Col menu.Append(self.pop2, u"Chi2 par classe") menu.Append(self.pop3, u"Chi2 modalités de la variable") menu.AppendSeparator() - menu.Append(self.pop1, u"Graph de la classe") + menu.Append(self.pop1, u"Graphe de la classe") self.PopupMenu(menu) menu.Destroy() @@ -355,7 +366,7 @@ class ProfListctrlPanel(wx.ListCtrl, listmix.ListCtrlAutoWidthMixin, listmix.Col if 'corpus' in dir(self.Source): corpus = self.Source.corpus prof = [[self.la[i], self.lchi[i], self.lfreq[i]] for i, val in enumerate(self.la)] - parametres = self.Source.parametres + parametres = copy(self.Source.parametres) parametres['clusterprof'] = prof parametres['type'] = 'clustercloud' parametres['prof'] = self.Source.pathout['actprof_classe_%i.csv' % self.cl] @@ -379,6 +390,28 @@ class ProfListctrlPanel(wx.ListCtrl, listmix.ListCtrlAutoWidthMixin, listmix.Col #if 'corpus' in dir(self.Source): # corpus = self.Source.corpus #ClasseCHD(self.parent, corpus, self.cl) + + def onexporttropes(self, evt) : + if 'corpus' in dir(self.Source): + corpus = self.Source.corpus + if self.Source.parametres['classif_mode'] != 2 : + uci = False + else : + uci = True + fileout = self.Source.pathout['export_tropes_classe_%i.txt' % self.cl] + corpus.export_tropes(fileout, self.cl, uci = uci) + + def onexportowledge(self, evt): + if 'corpus' in dir(self.Source): + corpus = self.Source.corpus + if self.Source.parametres['classif_mode'] != 2 : + uci = False + else : + uci = True + repout = self.Source.pathout['export_owledge_classe_%i' % self.cl] + if not os.path.exists(repout) : + os.mkdir(repout) + corpus.export_owledge(repout, self.cl, uci = uci) def getselectedwords(self) : words = [self.getColumnText(self.GetFirstSelected(), 6)] @@ -388,15 +421,30 @@ class ProfListctrlPanel(wx.ListCtrl, listmix.ListCtrlAutoWidthMixin, listmix.Col words.append(self.getColumnText(last, 6)) return words - def quest_var_mod(self, evt) : + def quest_var_mod(self, evt) : + word = self.getselectedwords()[0] + if len(word.split('_')) <= 1 : + dial = wx.MessageDialog(self, u"Ce n'est pas une forme du type variable_modalité", u"Problème", wx.OK | wx.ICON_WARNING) + dial.CenterOnParent() + dial.ShowModal() + dial.Destroy() + return + if 'corpus' in dir(self.Source): corpus = self.Source.corpus - if self.var_mod == {} : - self.var_mod = self.Source.corpus.make_etoiles_dict() + if word.startswith(u'-*') : + if self.them_mod == {} : + self.them_mod = self.Source.corpus.make_theme_dict() + var_mod = self.them_mod + else : + if self.var_mod == {} : + self.var_mod = self.Source.corpus.make_etoiles_dict() + var_mod = self.var_mod else : corpus = self.Source.tableau if self.var_mod == {} : self.var_mod = treat_var_mod([val for val in corpus.actives] + [val for val in corpus.sups]) + var_mod = self.var_mod with codecs.open(self.Source.pathout['chisqtable'], 'r', corpus.parametres['syscoding']) as f : chistable = [line.replace('\n','').replace('\r','').replace('"','').replace(',','.').split(';') for line in f] title = chistable[0] @@ -404,44 +452,34 @@ class ProfListctrlPanel(wx.ListCtrl, listmix.ListCtrlAutoWidthMixin, listmix.Col chistable.pop(0) vchistable = [line[1:] for line in chistable] fchistable = [line[0] for line in chistable] - word = self.getselectedwords()[0] - if len(word.split('_')) > 1 : - var = word.split('_') - #words = ['_'.join([var[0],word]) for word in self.var_mod[var[0]]] - words = [word for word in self.var_mod[var[0]]] - words.sort() - tableout = [] - kwords = [] - for word in words : - if word in fchistable : - tableout.append(vchistable[fchistable.index(word)]) - kwords.append(word) - tmpgraph = tempfile.mktemp(dir=self.Source.parent.TEMPDIR) - txt = barplot(tableout, kwords, title, self.Source.parent.RscriptsPath['Rgraph'], tmpgraph) - tmpscript = tempfile.mktemp(dir=self.Source.parent.TEMPDIR) - file = open(tmpscript,'w') - file.write(txt) - file.close() - exec_rcode(self.Source.parent.RPath, tmpscript, wait = True) - win = MessageImage(self,u"Graphique", size=(700, 500)) - win.addsaveimage(tmpgraph) - txt = "" % tmpgraph - win.HtmlPage.SetPage(txt) - win.Show(True) - else : - dial = wx.MessageDialog(self, u"Ce n'est pas une forme du type variable_modalité", u"Problème", wx.OK | wx.ICON_WARNING) + + var = word.split('_') + #words = ['_'.join([var[0],word]) for word in self.var_mod[var[0]]] + try : + words = [word for word in var_mod[var[0]]] + except KeyError: + dial = wx.MessageDialog(self, _(u"This is not a meta-data"), u"Problème", wx.OK | wx.ICON_WARNING) dial.CenterOnParent() dial.ShowModal() dial.Destroy() + return + words.sort() + tableout = [] + kwords = [] + for word in words : + if word in fchistable : + tableout.append(vchistable[fchistable.index(word)]) + kwords.append(word) + BarFrame(self.Source.parent, tableout, title, kwords) def quest_simi(self, evt) : tableau = self.Source.tableau + tab = tableau.make_table_from_classe(self.cl, self.la) + pathout = ConstructPathOut(self.Source.pathout.dirout, 'simi_classe_%i' %self.cl) if self.tmpchi is None : - self.tmpchi = tempfile.mktemp(dir=self.Source.parent.TEMPDIR) + self.tmpchi = os.path.join(pathout,'chi.csv') with open(self.tmpchi, 'w') as f: f.write('\n'.join([str(val) for val in self.lchi])) - tab = tableau.make_table_from_classe(self.cl, self.la) - pathout = ConstructPathOut(self.Source.pathout.dirout, 'simi_classe_%i' %self.cl) self.filename = os.path.join(pathout,'mat01.csv') tableau.printtable(self.filename, tab) del tab @@ -478,21 +516,27 @@ class ProfListctrlPanel(wx.ListCtrl, listmix.ListCtrlAutoWidthMixin, listmix.Col 'com' : 0, 'communities' : 0, 'halo' : 0, - 'tmpchi': self.tmpchi + 'tmpchi': self.tmpchi, + 'fromprof' : True, + 'edgecurved' : True, } act = {} + tableau = copymatrix(tableau) tableau.chi = {} tableau.lchi = self.lchi - tableau.parametre['fromprof'] = True + #tableau.parametres['fromprof'] = True for i, val in enumerate(self.la) : act[val] = [self.lfreq[i]] tableau.chi[val] = [self.lchi[i]] - self.parent.SimiCluster(parametres = paramsimi, fromprof = ffr(self.filename), pathout = pathout, listactives = self.la, actives = act, tableau = tableau) + paramsimi['listactives'] = copy(self.la) + paramsimi['actives'] = copy(act) + paramsimi['pathout'] = pathout + self.parent.SimiCluster(parametres = paramsimi, fromprof = ffr(self.filename), tableau = tableau) def onwordgraph(self, evt): word = self.getColumnText(self.GetFirstSelected(), 6) if self.tmpchi is None : - self.tmpchi = tempfile.mktemp(dir=self.Source.parent.TEMPDIR) + self.tmpchi = os.path.join(self.Source.parametres['pathout'],'chi_%i.csv' % self.cl) with open(self.tmpchi, 'w') as f: f.write('\n'.join([str(val) for val in self.lchi])) index = self.la.index(word) @@ -508,7 +552,7 @@ class ProfListctrlPanel(wx.ListCtrl, listmix.ListCtrlAutoWidthMixin, listmix.Col def on_graph(self, evt): if self.tmpchi is None : - self.tmpchi = tempfile.mktemp(dir=self.Source.parent.TEMPDIR) + self.tmpchi = os.path.join(self.Source.parametres['pathout'],'chi_%i.csv' % self.cl) with open(self.tmpchi, 'w') as f: f.write('\n'.join([str(val) for val in self.lchi])) parametres = {'type' : 'clustersimitxt', @@ -572,11 +616,11 @@ class ProfListctrlPanel(wx.ListCtrl, listmix.ListCtrlAutoWidthMixin, listmix.Col nuces = [val[1] for val in ntab2] dlg.Update(3, u'concordancier...') ucis_txt, ucestxt = doconcorde(corpus, nuces, self.la, uci = uci) - dlg.Update(4, u'texte...') - win = message(self, u"Segments de texte caractéristiques - Classe %i" % self.cl, (750, 600)) - win.html = '\n' + '
'.join(['
'.join([ucis_txt[i], '
score : %.2f
' % ntab2[i][0], ucestxt[i]]) for i in range(0,len(ucestxt))]) + '\n' - win.HtmlPage.SetPage(win.html) + items = dict([[i, '
'.join([ucis_txt[i], '
score : %.2f

' % ntab2[i][0], ucestxt[i]])] for i, uce in enumerate(nuces)]) dlg.Destroy() + win = message(self, items, u"Segments de texte caractéristiques - Classe %i" % self.cl, (750, 600), uceids = nuces) + #win.html = '\n' + '
'.join(['
'.join([ucis_txt[i], '
score : %.2f
' % ntab2[i][0], ucestxt[i]]) for i in range(0,len(ucestxt))]) + '\n' + #win.HtmlPage.SetPage(win.html) win.Show(True) def on_tablex(self, evt): @@ -596,28 +640,7 @@ class ProfListctrlPanel(wx.ListCtrl, listmix.ListCtrlAutoWidthMixin, listmix.Col tmpgraph = tempfile.mktemp(dir=self.Source.parent.TEMPDIR) nbcl = len(title) nbwords = len(words) - txt = barplot(tableout, words, title, self.Source.parent.RscriptsPath['Rgraph'], tmpgraph) - #print 'ATTENTION TEST R' - #txt = """ - #sink('/Users/pierre/Desktop/qdfqsdfqsdfqsdf.txt') - #Sys.getlocale() - #sink() - #""" - tmpscript = tempfile.mktemp(dir=self.Source.parent.TEMPDIR) - file = open(tmpscript,'w') - file.write(txt) - file.close() - exec_rcode(self.Source.parent.RPath, tmpscript, wait = True) - w = 100 + (20 * nbwords) + (100 * nbcl) - h = 100 + (nbwords * 15) - if w > 1100 : w = 1100 - if h > 800 : h = 800 - if h < 450 : h = 450 - win = MessageImage(self, u"Graphique", size=(w, h)) - win.addsaveimage(tmpgraph) - txt = "" % tmpgraph - win.HtmlPage.SetPage(txt) - win.Show(True) + BarFrame(self.Source.parent, tableout, title, words) def onlexdendro(self, evt): if 'corpus' in dir(self.Source): @@ -633,35 +656,7 @@ class ProfListctrlPanel(wx.ListCtrl, listmix.ListCtrlAutoWidthMixin, listmix.Col fchistable = [line[0] for line in chistable] words = self.getselectedwords() tableout = [vchistable[fchistable.index(word)] for word in words] - tmpgraph = tempfile.mktemp(dir=self.Source.parent.TEMPDIR) - txttable = 'c(' + ','.join([','.join(line) for line in tableout]) + ')' - rownames = 'c("' + '","'.join(words) + '")' - colnames = 'c("' + '","'.join(title) + '")' - nbcl = len(title) - rownb = len(words) - txt = """ - load("%s") - di <- matrix(data=%s, nrow=%i, byrow = TRUE) - rownames(di)<- %s - colnames(di) <- %s - library(ape) - source("%s") - height <- (30*ncol(di)) + (15*nrow(di)) - height <- ifelse(height <= 400, 400, height) - width <- 500 - open_file_graph("%s", width=width, height=height) - plot.dendro.lex(tree.cut1$tree.cl, di) - """ % (self.Source.pathout['Rdendro'], txttable, rownb, rownames, colnames, self.Source.parent.RscriptsPath['Rgraph'], ffr(tmpgraph)) - tmpscript = tempfile.mktemp(dir=self.Source.parent.TEMPDIR) - file = open(tmpscript,'w') - file.write(txt) - file.close() - exec_rcode(self.Source.parent.RPath, tmpscript, wait = True) - win = MessageImage(self, u"Graphique", size=(700, 500)) - win.addsaveimage(tmpgraph) - txt = "" % tmpgraph - win.HtmlPage.SetPage(txt) - win.Show(True) + BarFrame(self.Source.parent, tableout, title, words, tree = self.Source.pathout['Rdendro']) def make_concord(self, uces, title, color = 'red') : corpus = self.Source.corpus @@ -680,27 +675,27 @@ class ProfListctrlPanel(wx.ListCtrl, listmix.ListCtrlAutoWidthMixin, listmix.Col ucef += list(set(corpus.getlemucis(word)).intersection(uces)) uci = True ucis_txt, ucestxt = doconcorde(corpus, ucef, ListWord, uci = uci) - win = message(self, title, size=(750, 600)) - win.html = ('\n

%s

' % ' '.join(ListWord)) + '
'.join(['
'.join([ucis_txt[i], ucestxt[i]]) for i in range(0,len(ucestxt))]) + '\n' - win.HtmlPage.SetPage(win.html) + items = dict([[i, '

'.join([ucis_txt[i], ucestxt[i]])] for i in range(0,len(ucestxt))]) + win = message(self, items, title, (800, 500), uceids = ucef) return win def OnPopupTwo(self, event): - corpus = self.Source.corpus - uces = corpus.lc[self.cl-1] - win = self.make_concord(uces, "Concordancier - Classe %i" % self.cl) - win.Show(True) + if 'corpus' in dir(self.Source) : + corpus = self.Source.corpus + uces = corpus.lc[self.cl-1] + win = self.make_concord(uces, "Concordancier - Classe %i" % self.cl) + win.Show(True) def OnPopupThree(self, event): corpus = self.Source.corpus uces = [classe[i] for classe in corpus.lc for i in range(0,len(classe))] - win = self.make_concord(uces, "Concordancier - UCE classées") + win = self.make_concord(uces, "Concordancier - Segments de texte classés") win.Show(True) def OnPopupFour(self, event): corpus = self.Source.corpus uces = [classe[i] for classe in corpus.lc for i in range(0,len(classe))] + corpus.lc0 - win = self.make_concord(uces, "Concordancier - Toutes les UCE") + win = self.make_concord(uces, "Concordancier - Tous les segments de texte") win.Show(True) def OnPopupFive(self, event): @@ -752,16 +747,21 @@ class ProfListctrlPanel(wx.ListCtrl, listmix.ListCtrlAutoWidthMixin, listmix.Col nb = len(ucef) rep.append([corpus.getforme(forme).forme, nb]) rep.sort(key = itemgetter(1), reverse = True) - win = message(self, u"Formes associées", wx.Size(300, 200)) - win.html = '\n' + '
'.join([' : '.join([str(val) for val in forme]) for forme in rep]) + '\n' - win.HtmlPage.SetPage(win.html) + #win = message(self, u"Formes associées", wx.Size(300, 200)) + items = dict([[i, '\t:\t'.join([str(val) for val in forme])] for i, forme in enumerate(rep)]) + win = message(self, items, u"Formes associées", (300, 200)) + #win.html = '\n' + '
'.join([' : '.join([str(val) for val in forme]) for forme in rep]) + '\n' + #win.HtmlPage.SetPage(win.html) win.Show(True) + + def OnMakeTgen(self, evt): + self.parent.tree.OnTgenEditor(self.getselectedwords()) class wliste(wx.Frame): def __init__(self, parent, id, title, d, fline, size=(600, 500)): wx.Frame.__init__(self, parent, id) - self.liste = ListForSpec(self, parent, d, fline, menu = False) + self.liste = ListForSpec(self, parent, d, fline[1:], menu = False) self.button_1 = wx.Button(self, -1, "Fermer") self.Bind(wx.EVT_BUTTON, self.OnCloseMe, self.button_1) self.Bind(wx.EVT_CLOSE, self.OnCloseWindow)