1 # -*- coding: utf-8 -*-
2 # Author: Pierre Ratinaud
4 # copyright : 2012-2013 (c) Pierre Ratinaud
7 from chemins import PathOut, ChdTxtPathOut
8 from functions import exec_rcode, check_Rresult, DoConf, print_liste
9 from time import time, sleep
10 from uuid import uuid4
12 from PrintRScript import RchdTxt, AlcesteTxtProf
13 from OptionAlceste import OptionAlc
14 from layout import PrintRapport
15 from openanalyse import OpenAnalyse
16 from dialog import StatDialog
18 log = logging.getLogger('iramuteq.analyse')
21 def __init__(self, ira, corpus, parametres=None, dlg=False, lemdial=True) :
27 self.parametres = parametres
28 self.lemdial = lemdial
30 self.keys = DoConf(self.ira.ConfigPath['key']).getoptions()
31 if not 'pathout' in self.parametres :
32 self.pathout = PathOut(corpus.parametres['originalpath'], analyse_type=parametres['type'], dirout=corpus.parametres['pathout'])
34 self.pathout = PathOut(filename=corpus.parametres['originalpath'], dirout=self.parametres['pathout'], analyse_type=self.parametres['type'])
35 self.parametres = self.lemparam()
36 if self.parametres is not None :
37 self.parametres = self.make_config(parametres)
38 log.info(self.pathout.dirout)
39 if self.parametres is not None :
40 self.keys = DoConf(self.ira.ConfigPath['key']).getoptions()
41 gramact = [k for k in self.keys if self.keys[k] == 1]
42 gramsup = [k for k in self.keys if self.keys[k] == 2]
43 self.parametres['pathout'] = self.pathout.mkdirout()
44 self.pathout = PathOut(dirout=self.parametres['pathout'])
45 self.pathout.createdir(self.parametres['pathout'])
46 self.parametres['corpus'] = self.corpus.parametres['uuid']
47 self.parametres['uuid'] = str(uuid4())
48 self.parametres['name'] = os.path.split(self.parametres['pathout'])[1]
49 self.parametres['type'] = parametres['type']
50 self.parametres['encoding'] = self.ira.syscoding
52 self.corpus.make_lems(lem=self.parametres['lem'])
53 self.corpus.parse_active(gramact, gramsup)
54 result_analyse = self.doanalyse()
55 if result_analyse is None :
56 self.time = time() - self.t1
57 minutes, seconds = divmod(self.time, 60)
58 hours, minutes = divmod(minutes, 60)
59 self.parametres['time'] = '%.0fh %.0fm %.0fs' % (hours, minutes, seconds)
60 self.parametres['ira'] = self.pathout['Analyse.ira']
61 DoConf().makeoptions([self.parametres['type']], [self.parametres], self.pathout['Analyse.ira'])
62 self.ira.history.add(self.parametres)
65 OpenAnalyse(self.parent, self.parametres['ira'])
66 self.ira.tree.AddAnalyse(self.parametres)
81 if self.dlg and self.lemdial:
82 dial = StatDialog(self, self.parent)
84 val = dial.ShowModal()
86 if dial.radio_lem.GetSelection() == 0 :
90 self.parametres['lem'] = lem
92 return self.parametres
97 return self.parametres
99 def make_config(self, config) :
100 if config is not None :
104 return self.preferences()
108 def readconfig(self, config) :
111 def preferences(self) :
112 return self.parametres
114 def printRscript(self) :
117 def doR(self, Rscript, wait=False, dlg=None, message='') :
118 log.info('R code...')
119 pid = exec_rcode(self.ira.RPath, Rscript, wait=wait)
120 while pid.poll() is None :
122 self.dlg.Pulse(message)
126 return check_Rresult(self.ira, pid)
130 class Alceste(AnalyseText) :
131 def doanalyse(self) :
132 self.parametres['type'] = 'alceste'
133 self.pathout.basefiles(ChdTxtPathOut)
134 self.actives, lim = self.corpus.make_actives_nb(self.parametres['max_actives'], 1)
135 self.parametres['eff_min_forme'] = lim
136 self.parametres['nbactives'] = len(self.actives)
138 if self.parametres['classif_mode'] == 0 :
139 lenuc1, lenuc2 = self.corpus.make_and_write_sparse_matrix_from_uc(self.actives, self.parametres['tailleuc1'], self.parametres['tailleuc2'], self.pathout['TableUc1'], self.pathout['TableUc2'], self.pathout['listeuce1'], self.pathout['listeuce2'])
140 self.parametres['lenuc1'] = lenuc1
141 self.parametres['lenuc2'] = lenuc2
142 elif self.parametres['classif_mode'] == 1 :
143 self.corpus.make_and_write_sparse_matrix_from_uces(self.actives, self.pathout['TableUc1'], self.pathout['listeuce1'])
144 elif self.parametres['classif_mode'] == 2 :
145 self.corpus.make_and_write_sparse_matrix_from_uci(self.actives, self.pathout['TableUc1'], self.pathout['listeuce1'])
147 Rscript = self.printRscript()
148 self.doR(Rscript, dlg=self.dlg, message='CHD...')
150 self.corpus.make_ucecl_from_R(self.pathout['uce'])
151 self.corpus.make_and_write_profile(self.actives, self.corpus.lc, self.pathout['Contout'], uci = uci)
152 self.sup, lim = self.corpus.make_actives_nb(self.parametres['max_actives'], 2)
153 self.corpus.make_and_write_profile(self.sup, self.corpus.lc, self.pathout['ContSupOut'], uci = uci)
154 self.corpus.make_and_write_profile_et(self.corpus.lc, self.pathout['ContEtOut'], uci = uci)
155 self.clnb = len(self.corpus.lc)
156 self.parametres['clnb'] = self.clnb
157 Rscript = self.printRscript2()
158 self.doR(Rscript, dlg=self.dlg, message='profils et A.F.C. ...')
159 self.time = time() - self.t1
160 minutes, seconds = divmod(self.time, 60)
161 hours, minutes = divmod(minutes, 60)
162 self.parametres['time'] = '%.0fh %.0fm %.0fs' % (hours, minutes, seconds)
163 self.print_graph_files()
165 def preferences(self) :
166 parametres = DoConf(self.parent.ConfigPath['alceste']).getoptions('ALCESTE')
167 parametres['corpus'] = self.corpus
168 parametres['pathout'] = self.pathout
169 self.dial = OptionAlc(self.parent, parametres)
170 self.dial.CenterOnParent()
171 self.dialok = self.dial.ShowModal()
172 if self.dialok == 5100 :
173 parametres['classif_mode'] = self.dial.radio_box_2.GetSelection()
174 parametres['tailleuc1'] = self.dial.spin_ctrl_1.GetValue()
175 parametres['tailleuc2'] = self.dial.spin_ctrl_2.GetValue()
176 parametres['mincl'] = self.dial.spin_ctrl_4.GetValue()
177 parametres['minforme'] = self.dial.spin_ctrl_5.GetValue()
178 parametres['nbcl_p1'] = self.dial.spin_nbcl.GetValue()
179 parametres['max_actives'] = self.dial.spin_max_actives.GetValue()
180 parametres['corpus'] = ''
181 parametres['svdmethod'] = self.dial.svdmethod[self.dial.choicesvd.GetSelection()]
182 parametres['pathout'] = self.pathout.dirout
183 parametres['mode.patate'] = self.dial.check_patate.GetValue()
184 DoConf(self.parent.ConfigPath['alceste']).makeoptions(['ALCESTE'], [parametres])
192 def printRscript(self) :
193 RchdTxt(self.pathout, self.parent.RscriptsPath, self.parametres['mincl'], self.parametres['classif_mode'], nbt=self.parametres['nbcl_p1'] - 1, svdmethod=self.parametres['svdmethod'], libsvdc=self.parent.pref.getboolean('iramuteq', 'libsvdc'), libsvdc_path=self.parent.pref.get('iramuteq', 'libsvdc_path'), R_max_mem=False, mode_patate=self.parametres['mode.patate'])
194 return self.pathout['Rchdtxt']
196 def printRscript2(self) :
197 AlcesteTxtProf(self.pathout, self.parent.RscriptsPath, self.clnb, 0.9)
198 return self.pathout['RTxtProfGraph']
200 def print_graph_files(self) :
201 mess_afc = u"La position des points n'est peut être pas exacte"
202 afc_graph_list = [[os.path.basename(self.pathout['AFC2DL_OUT']), u'Variables actives - coordonnées - 30 points par classes - facteurs 1 / 2 - %s' % mess_afc],
203 [os.path.basename(self.pathout['AFC2DSL_OUT']), u'variables supplémentaires - coordonnées - 30 points par classes - facteurs 1 / 2 - %s' % mess_afc],
204 [os.path.basename(self.pathout['AFC2DEL_OUT']), u'Variables illustratives - Coordonnées - 30 points par classes - facteur 1 / 2 - %s' % mess_afc],
205 [os.path.basename(self.pathout['AFC2DCL_OUT']), u'Classes - Coordonnées - facteur 1 / 2']]
206 chd_graph_list = [[os.path.basename(self.pathout['dendro1']), u'dendrogramme à partir de chd1']]
207 if self.parametres['classif_mode'] == 0 :
208 chd_graph_list.append([os.path.basename(self.pathout['dendro2']), u'dendrogramme à partir de chd2'])
209 chd_graph_list.append([os.path.basename(self.pathout['arbre1']), u'chd1'])
210 if self.parametres['classif_mode'] == 0 :
211 chd_graph_list.append([os.path.basename(self.pathout['arbre2']), u'chd2'])
212 print_liste(self.pathout['liste_graph_afc'], afc_graph_list)
213 print_liste(self.pathout['liste_graph_chd'], chd_graph_list)
214 PrintRapport(self, self.corpus, self.parametres)
217 # keys = {'art_def' : 2,
246 # gramact = [k for k in keys if keys[k] == 1]
247 # gramsup = [k for k in keys if keys[k] == 2]