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 dlg.Update(3, u'concordancier...')
603 ucis_txt, ucestxt = doconcorde(corpus, nuces, self.la, uci = uci)
604 items = dict([[i, '<br>'.join([ucis_txt[i], '<table bgcolor = #1BF0F7 border=0><tr><td><b>score : %.2f</b></td></tr></table><br>' % ntab2[i][0], ucestxt[i]])] for i, uce in enumerate(nuces)])
605 dlg.Update(4, u'texte...')
606 win = message(self, items, u"Segments de texte caractéristiques - Classe %i" % self.cl, (750, 600))
607 #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>'
608 #win.HtmlPage.SetPage(win.html)
612 def on_tablex(self, evt):
613 if 'corpus' in dir(self.Source):
614 corpus = self.Source.corpus
616 corpus = self.Source.tableau
617 with codecs.open(self.Source.pathout['chisqtable'], 'r', corpus.parametres['syscoding']) as f :
618 chistable = [line.replace('\n','').replace('\r','').replace('"','').replace(',','.').split(';') for line in f]
622 vchistable = [line[1:] for line in chistable]
623 fchistable = [line[0] for line in chistable]
624 words = self.getselectedwords()
625 tableout = [vchistable[fchistable.index(word)] for word in words]
626 tmpgraph = tempfile.mktemp(dir=self.Source.parent.TEMPDIR)
629 BarFrame(self.Source.parent, tableout, title, words)
630 # txt = barplot(tableout, words, title, self.Source.parent.RscriptsPath['Rgraph'], tmpgraph)
631 # #print 'ATTENTION TEST R'
633 # #sink('/Users/pierre/Desktop/qdfqsdfqsdfqsdf.txt')
637 # tmpscript = tempfile.mktemp(dir=self.Source.parent.TEMPDIR)
638 # file = open(tmpscript,'w')
641 # exec_rcode(self.Source.parent.RPath, tmpscript, wait = True)
642 # w = 100 + (20 * nbwords) + (100 * nbcl)
643 # h = 100 + (nbwords * 15)
644 # if w > 1100 : w = 1100
645 # if h > 800 : h = 800
646 # if h < 450 : h = 450
647 # win = MessageImage(self, u"Graphique", size=(w, h))
648 # win.addsaveimage(tmpgraph)
649 # txt = "<img src='%s'>" % tmpgraph
650 # win.HtmlPage.SetPage(txt)
653 def onlexdendro(self, evt):
654 if 'corpus' in dir(self.Source):
655 corpus = self.Source.corpus
657 corpus = self.Source.tableau
658 with codecs.open(self.Source.pathout['chisqtable'], 'r', corpus.parametres['syscoding']) as f :
659 chistable = [line.replace('\n','').replace('\r','').replace('"','').replace(',','.').split(';') for line in f]
663 vchistable = [line[1:] for line in chistable]
664 fchistable = [line[0] for line in chistable]
665 words = self.getselectedwords()
666 tableout = [vchistable[fchistable.index(word)] for word in words]
667 BarFrame(self.Source.parent, tableout, title, words, tree = self.Source.pathout['Rdendro'])
669 def make_concord(self, uces, title, color = 'red') :
670 corpus = self.Source.corpus
671 ListWord = [self.getColumnText(self.GetFirstSelected(), 6)]
672 last = self.GetFirstSelected()
673 while self.GetNextSelected(last) != -1:
674 last = self.GetNextSelected(last)
675 ListWord.append(self.getColumnText(last, 6))
677 if self.Source.parametres['classif_mode'] != 2 :
678 for word in ListWord :
680 ucef += list(set(corpus.getlemuces(word)).intersection(uces))
682 for word in ListWord :
683 ucef += list(set(corpus.getlemucis(word)).intersection(uces))
685 ucis_txt, ucestxt = doconcorde(corpus, ucef, ListWord, uci = uci)
686 items = dict([[i, '<br><br>'.join([ucis_txt[i], ucestxt[i]])] for i in range(0,len(ucestxt))])
687 win = message(self, items, title, (800, 500))
688 #win = message(self, title, size=(750, 600))
689 #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>'
690 #win.HtmlPage.SetPage(win.html)
693 def OnPopupTwo(self, event):
694 if 'corpus' in dir(self.Source) :
695 corpus = self.Source.corpus
696 uces = corpus.lc[self.cl-1]
697 win = self.make_concord(uces, "Concordancier - Classe %i" % self.cl)
700 def OnPopupThree(self, event):
701 corpus = self.Source.corpus
702 uces = [classe[i] for classe in corpus.lc for i in range(0,len(classe))]
703 win = self.make_concord(uces, "Concordancier - UCE classées")
706 def OnPopupFour(self, event):
707 corpus = self.Source.corpus
708 uces = [classe[i] for classe in corpus.lc for i in range(0,len(classe))] + corpus.lc0
709 win = self.make_concord(uces, "Concordancier - Toutes les UCE")
712 def OnPopupFive(self, event):
713 word = self.getColumnText(self.GetFirstSelected(), 6)
714 lk = "http://www.cnrtl.fr/definition/" + word
717 def OnPopupSix(self, event):
718 word = self.getColumnText(self.GetFirstSelected(), 6)
719 lk = "http://www.cnrtl.fr/etymologie/" + word
722 def OnPopupSeven(self, event):
723 word = self.getColumnText(self.GetFirstSelected(), 6)
724 lk = "http://www.cnrtl.fr/synonymie/" + word
727 def OnPopupHeight(self, event):
728 word = self.getColumnText(self.GetFirstSelected(), 6)
729 lk = "http://www.cnrtl.fr/antonymie/" + word
732 def OnPopupNine(self, event):
733 word = self.getColumnText(self.GetFirstSelected(), 6)
734 lk = "http://www.cnrtl.fr/morphologie/" + word
737 def onproxe(self, evt) :
738 word = self.getColumnText(self.GetFirstSelected(), 6)
739 lk = "http://www.cnrtl.fr/proxemie/" + word
742 def OnPopupOne(self, event):
743 corpus = self.Source.corpus
744 #print 'ATTENTION PRINT ET TABLE'
745 #corpus.make_et_table()
746 word = self.getColumnText(self.GetFirstSelected(), 6)
747 lems = corpus.getlems()
748 uces = corpus.lc[self.cl-1]
750 #FIXME : donner aussi eff reel a la place de nb uce
751 for forme in lems[word].formes :
752 if self.Source.parametres['classif_mode'] != 2 :
753 ucef = list(set(corpus.getworduces(forme)).intersection(uces))
755 ucef = list(set(corpus.getworducis(forme)).intersection(uces))
756 #ucef = [uce for uce in corpus.formes[forme][1] if uce in uces]
759 rep.append([corpus.getforme(forme).forme, nb])
760 rep.sort(key = itemgetter(1), reverse = True)
761 #win = message(self, u"Formes associées", wx.Size(300, 200))
762 items = dict([[i, '\t:\t'.join([str(val) for val in forme])] for i, forme in enumerate(rep)])
763 win = message(self, items, u"Formes associées", (300, 200))
764 #win.html = '<html>\n' + '<br>'.join([' : '.join([str(val) for val in forme]) for forme in rep]) + '\n</html>'
765 #win.HtmlPage.SetPage(win.html)
769 class wliste(wx.Frame):
770 def __init__(self, parent, id, title, d, fline, size=(600, 500)):
771 wx.Frame.__init__(self, parent, id)
772 self.liste = ListForSpec(self, parent, d, fline[1:], menu = False)
773 self.button_1 = wx.Button(self, -1, "Fermer")
774 self.Bind(wx.EVT_BUTTON, self.OnCloseMe, self.button_1)
775 self.Bind(wx.EVT_CLOSE, self.OnCloseWindow)
778 def __do_layout(self):
779 sizer_1 = wx.BoxSizer(wx.VERTICAL)
780 sizer_2 = wx.BoxSizer(wx.VERTICAL)
781 sizer_2.Add(self.liste, 1, wx.EXPAND | wx.ADJUST_MINSIZE, 0)
782 sizer_2.Add(self.button_1, 0, wx.ALIGN_CENTER_HORIZONTAL | wx.ADJUST_MINSIZE, 0)
783 sizer_1.Add(sizer_2, 1, wx.EXPAND, 0)
784 self.SetAutoLayout(True)
785 self.SetSizer(sizer_1)
788 def OnCloseMe(self, event):
791 def OnCloseWindow(self, event):