1 # -*- coding: utf-8 -*-
3 #----------------------------------------------------------------------------
5 # Author: Pierre Ratinaud
8 #comes from ListCtrl.py from the demo tool of wxPython:
9 # Author: Robin Dunn & Gary Dumer
12 # Copyright: (c) 1998 by Total Control Software
13 # Licence: wxWindows license
14 #----------------------------------------------------------------------------
19 import wx.lib.mixins.listctrl as listmix
20 #from tabsimi import DoSimi
21 from listlex import ListForSpec
22 from chemins import ConstructPathOut, ffr
23 from dialog import PrefExport, PrefUCECarac, SearchDial, message, MessageImage, BarFrame
24 from tableau import Tableau
25 from search_tools import SearchFrame
30 from functions import exec_rcode, progressbar, treat_var_mod, doconcorde
31 from PrintRScript import barplot
32 from textclassechd import ClasseCHD
33 from shutil import copyfile
34 from operator import itemgetter
36 #---------------------------------------------------------------------------
37 class ProfListctrlPanel(wx.ListCtrl, listmix.ListCtrlAutoWidthMixin, listmix.ColumnSorterMixin):
38 def __init__(self, parent, gparent, profclasse, Alceste=False, cl=0):
39 wx.ListCtrl.__init__( self, parent, -1, style=wx.LC_REPORT|wx.LC_VIRTUAL|wx.LC_HRULES|wx.LC_VRULES)
42 self.Alceste = Alceste
47 line1 = profclasse.pop(0)
48 classen = [line for line in profclasse if line[0] != '*' and line[0] != '*****']
50 self.lenact = profclasse.index([u'*****', u'*', u'*', u'*', u'*', u'*', '', ''])
51 profclasse.pop(self.lenact)
54 self.lenact = profclasse.index([u'*', u'*', u'*', u'*', u'*', u'*', '', ''])
55 profclasse.pop(self.lenact)
57 self.lenact = len(profclasse)
59 self.lensup = profclasse.index([u'*', u'*', u'*', u'*', u'*', u'*', '', ''])
60 self.lensup = self.lensup - self.lenact
61 profclasse.pop(self.lensup)
63 self.lensup = len(profclasse) - self.lenact
64 self.lenet = len(profclasse) - (self.lenact + self.lensup)
65 # print self.lenact, self.lensup, self.lenet
66 for i, line in enumerate(classen) :
68 dictdata = dict(zip([i for i in range(0,len(classen))], classen))
71 self.la = [dictdata[i][6] for i in range(0, self.lenact)]
72 self.lchi = [dictdata[i][4] for i in range(0, self.lenact)]
73 self.lfreq = [dictdata[i][1] for i in range(0, self.lenact)]
81 self.il = wx.ImageList(16, 16)
82 a={"sm_up":"GO_UP","sm_dn":"GO_DOWN","w_idx":"WARNING","e_idx":"ERROR","i_idx":"QUESTION"}
84 s="self.%s= self.il.Add(wx.ArtProvider_GetBitmap(wx.ART_%s,wx.ART_TOOLBAR,(16,16)))" % (k,v)
86 self.SetImageList(self.il, wx.IMAGE_LIST_SMALL)
88 #adding some attributes (colourful background for each item rows)
89 self.attr1 = wx.ListItemAttr()
90 self.attr1.SetBackgroundColour((220, 220, 220))
91 self.attrsg = wx.ListItemAttr()
92 self.attrsg.SetBackgroundColour((230, 230, 230))
93 self.attr2 = wx.ListItemAttr()
94 self.attr2.SetBackgroundColour((190, 249, 236))
95 self.attr2s = wx.ListItemAttr()
96 self.attr2s.SetBackgroundColour((211, 252, 244))
97 self.attr3 = wx.ListItemAttr()
98 self.attr3.SetBackgroundColour((245, 180, 180))
99 self.attr3s = wx.ListItemAttr()
100 self.attr3s.SetBackgroundColour((245, 190, 190))
103 self.InsertColumn(0, "num", wx.LIST_FORMAT_RIGHT)
104 self.InsertColumn(1, "eff. s.t.", wx.LIST_FORMAT_RIGHT)
105 self.InsertColumn(2, "eff. total", wx.LIST_FORMAT_RIGHT)
106 self.InsertColumn(3, "pourcentage", wx.LIST_FORMAT_RIGHT)
107 self.InsertColumn(4, "chi2", wx.LIST_FORMAT_RIGHT)
108 self.InsertColumn(5, "Type", wx.LIST_FORMAT_RIGHT)
109 self.InsertColumn(6, "forme", wx.LIST_FORMAT_RIGHT)
110 self.InsertColumn(7, "p", wx.LIST_FORMAT_RIGHT)
113 self.SetColumnWidth(0, 60)
114 self.SetColumnWidth(1, 70)
115 self.SetColumnWidth(2, 80)
116 self.SetColumnWidth(3, 100)
117 self.SetColumnWidth(4, 70)
118 self.SetColumnWidth(5, 60)
119 self.SetColumnWidth(6, 140)
120 self.SetColumnWidth(7, wx.LIST_AUTOSIZE)
122 #These two should probably be passed to init more cleanly
123 #setting the numbers of items = number of elements in the dictionary
124 self.itemDataMap = dictdata
125 self.itemIndexMap = dictdata.keys()
126 self.SetItemCount(len(dictdata))
129 listmix.ListCtrlAutoWidthMixin.__init__(self)
130 listmix.ColumnSorterMixin.__init__(self, len(classen[0]))
132 #sort by genre (column 2), A->Z ascending order (1)
133 self.SortListItems(0, 1)
136 #self.Bind(wx.EVT_LIST_ITEM_SELECTED, self.OnItemSelected)
137 self.Bind(wx.EVT_LIST_ITEM_ACTIVATED, self.OnPopupTwo, self)
138 #self.Bind(wx.EVT_LIST_ITEM_DESELECTED, self.OnItemDeselected)
139 self.Bind(wx.EVT_LIST_COL_CLICK, self.OnColClick)
142 self.Bind(wx.EVT_COMMAND_RIGHT_CLICK, self.OnRightClick)
145 self.Bind(wx.EVT_RIGHT_UP, self.OnRightClick)
148 search_id = wx.NewId()
149 searchall_id = wx.NewId()
150 concord_id = wx.NewId()
151 self.parent.Bind(wx.EVT_MENU, self.onsearch, id = search_id)
152 self.parent.Bind(wx.EVT_MENU, self.onsearchall, id = searchall_id)
153 self.accel_tbl = wx.AcceleratorTable([(wx.ACCEL_CTRL, ord('F'), search_id),
154 (wx.ACCEL_CTRL|wx.ACCEL_SHIFT, ord('F'), searchall_id)])
155 self.SetAcceleratorTable(self.accel_tbl)
159 def OnColClick(self,event):
162 def OnItemSelected(self, event):
163 self.currentItem = event.m_itemIndex
165 def OnItemActivated(self, event):
166 self.currentItem = event.m_itemIndex
168 def getColumnText(self, index, col):
169 item = self.GetItem(index, col)
170 return item.GetText()
172 def OnItemDeselected(self, evt):
174 #---------------------------------------------------
175 # These methods are callbacks for implementing the
176 # "virtualness" of the list...
178 def OnGetItemText(self, item, col):
179 index=self.itemIndexMap[item]
180 s = self.itemDataMap[index][col]
183 def OnGetItemImage(self, item):
184 index=self.itemIndexMap[item]
185 genre=self.itemDataMap[index][2]
191 elif genre=="New Age":
196 def OnGetItemAttr(self, item):
197 index=self.itemIndexMap[item]
198 if index < self.lenact :
203 elif index >= self.lenact and index < (self.lenact + self.lensup) :
208 elif index >= (self.lenact + self.lensup) :
216 #---------------------------------------------------
218 # Here's a better SortItems() method --
219 # the ColumnSorterMixin.__ColumnSorter() method already handles the ascending/descending,
220 # and it knows to sort on another column if the chosen columns have the same value.
222 def SortItems(self,sorter=cmp):
223 items = list(self.itemDataMap.keys())
225 self.itemIndexMap = items
230 # Used by the ColumnSorterMixin, see wx/lib/mixins/listctrl.py
231 def GetListCtrl(self):
234 # Used by the ColumnSorterMixin, see wx/lib/mixins/listctrl.py
235 def GetSortImages(self):
236 return (self.sm_dn, self.sm_up)
238 def onsearch(self, evt) :
239 self.dial = SearchDial(self, self, 6, True)
240 self.dial.CenterOnParent()
244 def onsearchall(self, evt) :
245 if 'FrameSearch' not in dir(self.Source) :
246 self.Source.FrameSearch = SearchFrame(self.parent, -1, u"Rechercher...", self.Source.corpus)
247 self.dial = SearchDial(self, self.Source.FrameSearch.liste, 1, False)
248 self.dial.CenterOnParent()
252 def OnRightClick(self, event):
254 # only do this part the first time so the events are only bound once
256 if not hasattr(self, "popupID1"):
257 self.popupID1 = wx.NewId()
258 self.popupID2 = wx.NewId()
259 self.popupID3 = wx.NewId()
260 self.popupID4 = wx.NewId()
261 self.popupID5 = wx.NewId()
262 self.popupID6 = wx.NewId()
263 self.popupID7 = wx.NewId()
264 self.popupID8 = wx.NewId()
265 self.popupID9 = wx.NewId()
266 #self.popupID10 = wx.NewId()
267 self.popupIDgraph = wx.NewId()
268 self.idseg = wx.NewId()
269 self.iducecarac = wx.NewId()
270 self.idtablex = wx.NewId()
271 self.idchimod = wx.NewId()
272 self.idwordgraph = wx.NewId()
273 self.popup_proxe = wx.NewId()
274 self.idlexdendro = wx.NewId()
275 self.idcloud = wx.NewId()
276 self.idexport = wx.NewId()
277 self.idexporttropes = wx.NewId()
278 self.idexportowledge = wx.NewId()
279 # self.export_classes = wx.NewId()
281 self.Bind(wx.EVT_MENU, self.OnPopupOne, id=self.popupID1)
282 self.Bind(wx.EVT_MENU, self.OnPopupTwo, id=self.popupID2)
283 self.Bind(wx.EVT_MENU, self.OnPopupThree, id=self.popupID3)
284 self.Bind(wx.EVT_MENU, self.OnPopupFour, id=self.popupID4)
285 self.Bind(wx.EVT_MENU, self.OnPopupFive, id=self.popupID5)
286 self.Bind(wx.EVT_MENU, self.OnPopupSix, id=self.popupID6)
287 self.Bind(wx.EVT_MENU, self.OnPopupSeven, id=self.popupID7)
288 self.Bind(wx.EVT_MENU, self.OnPopupHeight, id=self.popupID8)
289 self.Bind(wx.EVT_MENU, self.OnPopupNine, id=self.popupID9)
290 #self.Bind(wx.EVT_MENU, self.OnPopupSpec, id=self.popupID10)
291 self.Bind(wx.EVT_MENU, self.on_graph, id=self.popupIDgraph)
292 self.Bind(wx.EVT_MENU, self.on_segments, id=self.idseg)
293 self.Bind(wx.EVT_MENU, self.on_uce_carac, id = self.iducecarac)
294 self.Bind(wx.EVT_MENU, self.on_tablex, id = self.idtablex)
295 self.Bind(wx.EVT_MENU, self.quest_var_mod, id = self.idchimod)
296 self.Bind(wx.EVT_MENU, self.onwordgraph, id = self.idwordgraph)
297 self.Bind(wx.EVT_MENU, self.onproxe, id = self.popup_proxe)
298 self.Bind(wx.EVT_MENU, self.onlexdendro, id = self.idlexdendro)
299 self.Bind(wx.EVT_MENU, self.oncloud, id = self.idcloud)
300 self.Bind(wx.EVT_MENU, self.onexport, id = self.idexport)
301 self.Bind(wx.EVT_MENU, self.onexporttropes, id = self.idexporttropes)
302 self.Bind(wx.EVT_MENU, self.onexportowledge, id = self.idexportowledge)
303 # self.Bind(wx.EVT_MENU, self.on_export_classes, id = self.export_classes)
304 # self.Bind(wx.EVT_MENU, self.OnPopupThree, id=self.popupID3)
308 menu.Append(self.popupID1, u"Formes associées")
309 menu.Append(self.idtablex, u"Chi2 par classe")
310 menu.Append(self.idlexdendro, u"Chi2 par classe + dendro")
311 menu.Append(self.idchimod, u"Chi2 modalités de la variable")
312 menu.Append(self.idwordgraph, u"Graphe du mot")
313 #menu.Append(self.export_classes, u"Exporter le corpus...")
315 #menu.Append(self.popupID10, u"Spécificités")
317 menu_conc = wx.Menu()
318 menu_conc.Append(self.popupID2, u"dans les segments de texte de la classe")
319 menu_conc.Append(self.popupID3, u"dans les segments de texte classés")
320 menu_conc.Append(self.popupID4, u"dans tous les segments de texte")
321 menu.AppendMenu(-1, u"Concordancier", menu_conc)
322 menu_cnrtl = wx.Menu()
323 menu_cnrtl.Append(self.popupID5, u"Définition")
324 menu_cnrtl.Append(self.popupID6, u"Etymologie")
325 menu_cnrtl.Append(self.popupID7, u"Synonymie")
326 menu_cnrtl.Append(self.popupID8, u"Antonymie")
327 menu_cnrtl.Append(self.popupID9, u"Morphologie")
328 menu_cnrtl.Append(self.popup_proxe, u"Proxémie")
329 menu.AppendMenu(-1, u"Outils du CNRTL", menu_cnrtl)
330 menu.AppendSeparator()
331 menu.Append(self.popupIDgraph, u"Graphe de la classe")
332 menu.Append(self.idseg, u"Segments répétés")
333 menu.Append(self.iducecarac, u"Segments de texte caractéristiques")
334 menu.Append(self.idcloud, u"Nuage de la classe")
335 menu.Append(self.idexport, u'Exporter...')
336 menu.Append(self.idexporttropes, 'Exporter pour Tropes')
337 menu.Append(self.idexportowledge, 'Exporter pour Owledge')
338 #menu.Append(self.popupID2, u"Concordancier")
339 # menu.Append(self.popupID3, "recharger")
343 elif 'tableau' in dir(self.Source) :
344 if not hasattr(self, "pop1"):
345 self.pop1 = wx.NewId()
346 self.pop2 = wx.NewId()
347 self.pop3 = wx.NewId()
348 self.Bind(wx.EVT_MENU, self.quest_simi, id=self.pop1)
349 self.Bind(wx.EVT_MENU, self.on_tablex, id=self.pop2)
350 self.Bind(wx.EVT_MENU, self.quest_var_mod, id=self.pop3)
353 menu.Append(self.pop2, u"Chi2 par classe")
354 menu.Append(self.pop3, u"Chi2 modalités de la variable")
355 menu.AppendSeparator()
356 menu.Append(self.pop1, u"Graph de la classe")
360 def oncloud(self, evt) :
361 if 'corpus' in dir(self.Source):
362 corpus = self.Source.corpus
363 prof = [[self.la[i], self.lchi[i], self.lfreq[i]] for i, val in enumerate(self.la)]
364 parametres = self.Source.parametres
365 parametres['clusterprof'] = prof
366 parametres['type'] = 'clustercloud'
367 parametres['prof'] = self.Source.pathout['actprof_classe_%i.csv' % self.cl]
368 del parametres['uuid']
369 #if not os.path.exists(self.Source.pathout['actprof_classe_%i.csv' % self.lc]) :
370 # with open(self.Source.pathout['actprof_classe_%i.csv' % self.lc], 'w') as f :
371 # f.write('\n'.join(prof).encode(self.parent.syscoding))
372 self.parent.OnClusterCloud(self.Source.corpus, parametres = parametres)
374 def onexport(self, evt) :
375 if 'corpus' in dir(self.Source):
376 corpus = self.Source.corpus
377 if self.Source.parametres['classif_mode'] != 2 :
381 corpus.export_classe(self.Source.pathout['classe_%i_export.txt' % self.cl], self.cl, uci = uci)
382 dial = wx.MessageDialog(self, self.Source.pathout['classe_%i_export.txt' % self.cl], u"Export", wx.OK|wx.ICON_INFORMATION)
385 #if 'corpus' in dir(self.Source):
386 # corpus = self.Source.corpus
387 #ClasseCHD(self.parent, corpus, self.cl)
389 def onexporttropes(self, evt) :
390 if 'corpus' in dir(self.Source):
391 corpus = self.Source.corpus
392 if self.Source.parametres['classif_mode'] != 2 :
396 fileout = self.Source.pathout['export_tropes_classe_%i.txt' % self.cl]
397 corpus.export_tropes(fileout, self.cl, uci = uci)
399 def onexportowledge(self, evt):
400 if 'corpus' in dir(self.Source):
401 corpus = self.Source.corpus
402 if self.Source.parametres['classif_mode'] != 2 :
406 repout = self.Source.pathout['export_owledge_classe_%i' % self.cl]
407 if not os.path.exists(repout) :
409 corpus.export_owledge(repout, self.cl, uci = uci)
411 def getselectedwords(self) :
412 words = [self.getColumnText(self.GetFirstSelected(), 6)]
413 last = self.GetFirstSelected()
414 while self.GetNextSelected(last) != -1:
415 last = self.GetNextSelected(last)
416 words.append(self.getColumnText(last, 6))
419 def quest_var_mod(self, evt) :
420 if 'corpus' in dir(self.Source):
421 corpus = self.Source.corpus
422 if self.var_mod == {} :
423 self.var_mod = self.Source.corpus.make_etoiles_dict()
425 corpus = self.Source.tableau
426 if self.var_mod == {} :
427 self.var_mod = treat_var_mod([val for val in corpus.actives] + [val for val in corpus.sups])
428 with codecs.open(self.Source.pathout['chisqtable'], 'r', corpus.parametres['syscoding']) as f :
429 chistable = [line.replace('\n','').replace('\r','').replace('"','').replace(',','.').split(';') for line in f]
433 vchistable = [line[1:] for line in chistable]
434 fchistable = [line[0] for line in chistable]
435 word = self.getselectedwords()[0]
436 if len(word.split('_')) > 1 :
437 var = word.split('_')
438 #words = ['_'.join([var[0],word]) for word in self.var_mod[var[0]]]
439 words = [word for word in self.var_mod[var[0]]]
444 if word in fchistable :
445 tableout.append(vchistable[fchistable.index(word)])
447 BarFrame(self.Source.parent, tableout, title, kwords)
448 # tmpgraph = tempfile.mktemp(dir=self.Source.parent.TEMPDIR)
449 # txt = barplot(tableout, kwords, title, self.Source.parent.RscriptsPath['Rgraph'], tmpgraph)
450 # tmpscript = tempfile.mktemp(dir=self.Source.parent.TEMPDIR)
451 # file = open(tmpscript,'w')
454 # exec_rcode(self.Source.parent.RPath, tmpscript, wait = True)
455 # win = MessageImage(self,u"Graphique", size=(700, 500))
456 # win.addsaveimage(tmpgraph)
457 # txt = "<img src='%s'>" % tmpgraph
458 # win.HtmlPage.SetPage(txt)
461 dial = wx.MessageDialog(self, u"Ce n'est pas une forme du type variable_modalité", u"Problème", wx.OK | wx.ICON_WARNING)
462 dial.CenterOnParent()
466 def quest_simi(self, evt) :
467 tableau = self.Source.tableau
468 tab = tableau.make_table_from_classe(self.cl, self.la)
469 pathout = ConstructPathOut(self.Source.pathout.dirout, 'simi_classe_%i' %self.cl)
470 if self.tmpchi is None :
471 self.tmpchi = os.path.join(pathout,'chi.csv')
472 with open(self.tmpchi, 'w') as f:
473 f.write('\n'.join([str(val) for val in self.lchi]))
474 self.filename = os.path.join(pathout,'mat01.csv')
475 tableau.printtable(self.filename, tab)
477 paramsimi = {'coeff' : 0,
500 'cola' : (200,200,200),
510 'tmpchi': self.tmpchi
514 tableau.lchi = self.lchi
515 tableau.parametres['fromprof'] = True
516 for i, val in enumerate(self.la) :
517 act[val] = [self.lfreq[i]]
518 tableau.chi[val] = [self.lchi[i]]
519 self.parent.SimiCluster(parametres = paramsimi, fromprof = ffr(self.filename), pathout = pathout, listactives = self.la, actives = act, tableau = tableau)
521 def onwordgraph(self, evt):
522 word = self.getColumnText(self.GetFirstSelected(), 6)
523 if self.tmpchi is None :
524 self.tmpchi = os.path.join(self.Source.parametres['pathout'],'chi_%i.csv' % self.cl)
525 with open(self.tmpchi, 'w') as f:
526 f.write('\n'.join([str(val) for val in self.lchi]))
527 index = self.la.index(word)
528 parametres = {'type' : 'clustersimitxt',
529 'pathout' : self.Source.parametres['pathout'],
531 'lem' : self.Source.parametres['lem'],
532 'tmpchi' : self.tmpchi}
534 self.parent.SimiFromCluster(self.parent, self.Source.corpus, self.la, self.lfreq, self.lchi, self.cl - 1, parametres = parametres, dlg = progressbar(self, 4))
538 def on_graph(self, evt):
539 if self.tmpchi is None :
540 self.tmpchi = os.path.join(self.Source.parametres['pathout'],'chi_%i.csv' % self.cl)
541 with open(self.tmpchi, 'w') as f:
542 f.write('\n'.join([str(val) for val in self.lchi]))
543 parametres = {'type' : 'clustersimitxt',
544 'pathout' : self.Source.parametres['pathout'],
545 'lem' : self.Source.parametres['lem'],
546 'tmpchi' : self.tmpchi}
548 self.parent.SimiFromCluster(self.parent, self.Source.corpus, self.la, self.lfreq, self.lchi, self.cl - 1, parametres = parametres, dlg = progressbar(self, 4))
550 def on_segments(self,evt) :
551 dlg = progressbar(self, 2)
552 corpus = self.Source.corpus
553 uces = corpus.lc[self.cl-1]
554 if self.Source.parametres['classif_mode'] != 2 :
559 dlg.Update(1, u'Segments...')
560 for i in range(2,10) :
561 li = corpus.find_segments_in_classe(uces, i, 1000, uci = uci)
566 l.sort(reverse = True)
568 dlg.Update(2, 'Tri...')
569 for i, line in enumerate(l) :
570 d[i] = [line[1],line[0], line[2]]
572 para={'dico': d,'fline':first}
574 win = wliste(self, -1, u"Segments répétés - Classe %i" % self.cl, d, first, size=(600, 500))
577 def on_uce_carac(self,evt) :
578 dial = PrefUCECarac(self, self.parent)
579 dial.CenterOnParent()
580 if dial.ShowModal() == wx.ID_OK :
581 limite = dial.spin_eff.GetValue()
582 atype = dial.radio_type.GetSelection()
583 dlg = progressbar(self,maxi = 4)
584 corpus = self.Source.corpus
585 uces = corpus.lc[self.cl-1]
586 if self.Source.parametres['classif_mode'] != 2 :
590 tab = corpus.make_table_with_classe(uces, self.la, uci = uci)
592 dlg.Update(2, u'score...')
594 ntab = [round(sum([self.lchi[i] for i, word in enumerate(line) if word == 1]),2) for line in tab]
596 ntab = [round(sum([self.lchi[i] for i, word in enumerate(line) if word == 1])/float(sum(line)),2) if sum(line)!=0 else 0 for line in tab]
597 ntab2 = [[ntab[i], uces[i]] for i, val in enumerate(ntab)]
599 ntab2.sort(reverse = True)
600 ntab2 = ntab2[:limite]
601 nuces = [val[1] for val in ntab2]
602 orderuce = [[uce, i] for i, uce in enumerate(nuces)]
603 dlg.Update(3, u'concordancier...')
604 ucis_txt, ucestxt = doconcorde(corpus, nuces, self.la, uci = uci)
605 items = dict([[uce[1], '<br>'.join([ucis_txt[uce[1]], '<table bgcolor = #1BF0F7 border=0><tr><td><b>score : %.2f</b></td></tr></table><br>' % ntab2[uce[1]][0], ucestxt[uce[1]]])] for uce in orderuce])
606 dlg.Update(4, u'texte...')
607 win = message(self, items, u"Segments de texte caractéristiques - Classe %i" % self.cl, (750, 600))
608 #win.html = '<html>\n' + '<br>'.join(['<br>'.join([ucis_txt[i], '<table bgcolor = #1BF0F7 border=0><tr><td><b>score : %.2f</b></td></tr></table>' % ntab2[i][0], ucestxt[i]]) for i in range(0,len(ucestxt))]) + '\n</html>'
609 #win.HtmlPage.SetPage(win.html)
613 def on_tablex(self, evt):
614 if 'corpus' in dir(self.Source):
615 corpus = self.Source.corpus
617 corpus = self.Source.tableau
618 with codecs.open(self.Source.pathout['chisqtable'], 'r', corpus.parametres['syscoding']) as f :
619 chistable = [line.replace('\n','').replace('\r','').replace('"','').replace(',','.').split(';') for line in f]
623 vchistable = [line[1:] for line in chistable]
624 fchistable = [line[0] for line in chistable]
625 words = self.getselectedwords()
626 tableout = [vchistable[fchistable.index(word)] for word in words]
627 tmpgraph = tempfile.mktemp(dir=self.Source.parent.TEMPDIR)
630 BarFrame(self.Source.parent, tableout, title, words)
631 # txt = barplot(tableout, words, title, self.Source.parent.RscriptsPath['Rgraph'], tmpgraph)
632 # #print 'ATTENTION TEST R'
634 # #sink('/Users/pierre/Desktop/qdfqsdfqsdfqsdf.txt')
638 # tmpscript = tempfile.mktemp(dir=self.Source.parent.TEMPDIR)
639 # file = open(tmpscript,'w')
642 # exec_rcode(self.Source.parent.RPath, tmpscript, wait = True)
643 # w = 100 + (20 * nbwords) + (100 * nbcl)
644 # h = 100 + (nbwords * 15)
645 # if w > 1100 : w = 1100
646 # if h > 800 : h = 800
647 # if h < 450 : h = 450
648 # win = MessageImage(self, u"Graphique", size=(w, h))
649 # win.addsaveimage(tmpgraph)
650 # txt = "<img src='%s'>" % tmpgraph
651 # win.HtmlPage.SetPage(txt)
654 def onlexdendro(self, evt):
655 if 'corpus' in dir(self.Source):
656 corpus = self.Source.corpus
658 corpus = self.Source.tableau
659 with codecs.open(self.Source.pathout['chisqtable'], 'r', corpus.parametres['syscoding']) as f :
660 chistable = [line.replace('\n','').replace('\r','').replace('"','').replace(',','.').split(';') for line in f]
664 vchistable = [line[1:] for line in chistable]
665 fchistable = [line[0] for line in chistable]
666 words = self.getselectedwords()
667 tableout = [vchistable[fchistable.index(word)] for word in words]
668 BarFrame(self.Source.parent, tableout, title, words, tree = self.Source.pathout['Rdendro'])
670 def make_concord(self, uces, title, color = 'red') :
671 corpus = self.Source.corpus
672 ListWord = [self.getColumnText(self.GetFirstSelected(), 6)]
673 last = self.GetFirstSelected()
674 while self.GetNextSelected(last) != -1:
675 last = self.GetNextSelected(last)
676 ListWord.append(self.getColumnText(last, 6))
678 if self.Source.parametres['classif_mode'] != 2 :
679 for word in ListWord :
681 ucef += list(set(corpus.getlemuces(word)).intersection(uces))
683 for word in ListWord :
684 ucef += list(set(corpus.getlemucis(word)).intersection(uces))
686 ucis_txt, ucestxt = doconcorde(corpus, ucef, ListWord, uci = uci)
687 items = dict([[i, '<br><br>'.join([ucis_txt[i], ucestxt[i]])] for i in range(0,len(ucestxt))])
688 win = message(self, items, title, (800, 500))
689 #win = message(self, title, size=(750, 600))
690 #win.html = ('<html>\n<h1>%s</h1>' % ' '.join(ListWord)) + '<br>'.join(['<br>'.join([ucis_txt[i], ucestxt[i]]) for i in range(0,len(ucestxt))]) + '\n</html>'
691 #win.HtmlPage.SetPage(win.html)
694 def OnPopupTwo(self, event):
695 if 'corpus' in dir(self.Source) :
696 corpus = self.Source.corpus
697 uces = corpus.lc[self.cl-1]
698 win = self.make_concord(uces, "Concordancier - Classe %i" % self.cl)
701 def OnPopupThree(self, event):
702 corpus = self.Source.corpus
703 uces = [classe[i] for classe in corpus.lc for i in range(0,len(classe))]
704 win = self.make_concord(uces, "Concordancier - UCE classées")
707 def OnPopupFour(self, event):
708 corpus = self.Source.corpus
709 uces = [classe[i] for classe in corpus.lc for i in range(0,len(classe))] + corpus.lc0
710 win = self.make_concord(uces, "Concordancier - Toutes les UCE")
713 def OnPopupFive(self, event):
714 word = self.getColumnText(self.GetFirstSelected(), 6)
715 lk = "http://www.cnrtl.fr/definition/" + word
718 def OnPopupSix(self, event):
719 word = self.getColumnText(self.GetFirstSelected(), 6)
720 lk = "http://www.cnrtl.fr/etymologie/" + word
723 def OnPopupSeven(self, event):
724 word = self.getColumnText(self.GetFirstSelected(), 6)
725 lk = "http://www.cnrtl.fr/synonymie/" + word
728 def OnPopupHeight(self, event):
729 word = self.getColumnText(self.GetFirstSelected(), 6)
730 lk = "http://www.cnrtl.fr/antonymie/" + word
733 def OnPopupNine(self, event):
734 word = self.getColumnText(self.GetFirstSelected(), 6)
735 lk = "http://www.cnrtl.fr/morphologie/" + word
738 def onproxe(self, evt) :
739 word = self.getColumnText(self.GetFirstSelected(), 6)
740 lk = "http://www.cnrtl.fr/proxemie/" + word
743 def OnPopupOne(self, event):
744 corpus = self.Source.corpus
745 #print 'ATTENTION PRINT ET TABLE'
746 #corpus.make_et_table()
747 word = self.getColumnText(self.GetFirstSelected(), 6)
748 lems = corpus.getlems()
749 uces = corpus.lc[self.cl-1]
751 #FIXME : donner aussi eff reel a la place de nb uce
752 for forme in lems[word].formes :
753 if self.Source.parametres['classif_mode'] != 2 :
754 ucef = list(set(corpus.getworduces(forme)).intersection(uces))
756 ucef = list(set(corpus.getworducis(forme)).intersection(uces))
757 #ucef = [uce for uce in corpus.formes[forme][1] if uce in uces]
760 rep.append([corpus.getforme(forme).forme, nb])
761 rep.sort(key = itemgetter(1), reverse = True)
762 #win = message(self, u"Formes associées", wx.Size(300, 200))
763 items = dict([[i, '\t:\t'.join([str(val) for val in forme])] for i, forme in enumerate(rep)])
764 win = message(self, items, u"Formes associées", (300, 200))
765 #win.html = '<html>\n' + '<br>'.join([' : '.join([str(val) for val in forme]) for forme in rep]) + '\n</html>'
766 #win.HtmlPage.SetPage(win.html)
770 class wliste(wx.Frame):
771 def __init__(self, parent, id, title, d, fline, size=(600, 500)):
772 wx.Frame.__init__(self, parent, id)
773 self.liste = ListForSpec(self, parent, d, fline[1:], menu = False)
774 self.button_1 = wx.Button(self, -1, "Fermer")
775 self.Bind(wx.EVT_BUTTON, self.OnCloseMe, self.button_1)
776 self.Bind(wx.EVT_CLOSE, self.OnCloseWindow)
779 def __do_layout(self):
780 sizer_1 = wx.BoxSizer(wx.VERTICAL)
781 sizer_2 = wx.BoxSizer(wx.VERTICAL)
782 sizer_2.Add(self.liste, 1, wx.EXPAND | wx.ADJUST_MINSIZE, 0)
783 sizer_2.Add(self.button_1, 0, wx.ALIGN_CENTER_HORIZONTAL | wx.ADJUST_MINSIZE, 0)
784 sizer_1.Add(sizer_2, 1, wx.EXPAND, 0)
785 self.SetAutoLayout(True)
786 self.SetSizer(sizer_1)
789 def OnCloseMe(self, event):
792 def OnCloseWindow(self, event):