1 # -*- coding: utf-8 -*-
2 #Author: Pierre Ratinaud
3 #Copyright (c) 2008-2020 Pierre Ratinaud
4 #modification pour python 3 : Laurent Mérat, 6x7 - mai 2020
7 #------------------------------------
8 # import des modules python
9 #------------------------------------
13 #------------------------------------
14 # import des fichiers du projet
15 #------------------------------------
16 from analysetxt import AnalyseText
17 from OptionAlceste import OptionAlc
18 from PrintRScript import RchdTxt, ReinertTxtProf, TgenProfScript, ReDoProfScript
19 from layout import PrintRapport
20 from chemins import ChdTxtPathOut, PathOut
21 from functions import DoConf, print_liste, TGen
24 class Reinert(AnalyseText) :
27 self.parametres['type'] = 'alceste'
28 self.pathout.basefiles(ChdTxtPathOut)
29 self.actives, lim = self.corpus.make_actives_nb(self.parametres['max_actives'], 1)
30 self.parametres['eff_min_forme'] = lim
31 self.parametres['nbactives'] = len(self.actives)
33 if self.parametres['classif_mode'] == 0 :
34 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'])
35 self.parametres['lenuc1'] = lenuc1
36 self.parametres['lenuc2'] = lenuc2
37 elif self.parametres['classif_mode'] == 1 :
38 self.corpus.make_and_write_sparse_matrix_from_uces(self.actives, self.pathout['TableUc1'], self.pathout['listeuce1'])
39 elif self.parametres['classif_mode'] == 2 :
40 self.corpus.make_and_write_sparse_matrix_from_uci(self.actives, self.pathout['TableUc1'], self.pathout['listeuce1'])
42 Rscript = self.printRscript()
43 result = self.doR(Rscript, dlg=self.dlg, message='CHD...')
46 self.corpus.make_ucecl_from_R(self.pathout['uce'])
47 self.corpus.make_and_write_profile(self.actives, self.corpus.lc, self.pathout['Contout'], uci = uci)
48 self.sup, lim = self.corpus.make_actives_nb(self.parametres['max_actives'], 2)
49 self.corpus.make_and_write_profile(self.sup, self.corpus.lc, self.pathout['ContSupOut'], uci = uci)
50 self.corpus.make_and_write_profile_et(self.corpus.lc, self.pathout['ContEtOut'], uci = uci)
51 self.clnb = len(self.corpus.lc)
52 self.parametres['clnb'] = self.clnb
53 Rscript = self.printRscript2()
54 self.doR(Rscript, dlg=self.dlg, message='profils et A.F.C. ...')
55 self.time = time() - self.t1
56 minutes, seconds = divmod(self.time, 60)
57 hours, minutes = divmod(minutes, 60)
58 self.parametres['time'] = '%.0fh %.0fm %.0fs' % (hours, minutes, seconds)
59 self.print_graph_files()
61 def preferences(self) :
62 print('parametres en entree config alceste', self.parametres)
63 parametres = DoConf(self.parent.ConfigPath['reinert']).getoptions('ALCESTE')
64 print('parametres apres doconf', parametres)
65 parametres['corpus'] = self.corpus
66 parametres['pathout'] = self.pathout
67 parametres['lem'] = self.parametres['lem']
68 self.dial = OptionAlc(self.parent, parametres)
69 self.dial.CenterOnParent()
70 self.dialok = self.dial.ShowModal()
71 if self.dialok == 5100 :
72 parametres['classif_mode'] = self.dial.radio_box_2.GetSelection()
73 parametres['tailleuc1'] = self.dial.spin_ctrl_1.GetValue()
74 parametres['tailleuc2'] = self.dial.spin_ctrl_2.GetValue()
75 parametres['mincl'] = self.dial.spin_ctrl_4.GetValue()
76 parametres['minforme'] = self.dial.spin_ctrl_5.GetValue()
77 parametres['nbcl_p1'] = self.dial.spin_nbcl.GetValue()
78 parametres['max_actives'] = self.dial.spin_max_actives.GetValue()
79 parametres['corpus'] = ''
80 parametres['svdmethod'] = self.dial.svdmethod[self.dial.choicesvd.GetSelection()]
81 parametres['pathout'] = self.pathout.dirout
82 parametres['mode.patate'] = self.dial.check_patate.GetValue()
83 DoConf(self.parent.ConfigPath['reinert']).makeoptions(['ALCESTE'], [parametres])
86 self.parametres.update(parametres)
87 return self.parametres
92 def printRscript(self) :
93 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'])
94 return self.pathout['Rchdtxt']
96 def printRscript2(self) :
97 ReinertTxtProf(self.pathout, self.parent.RscriptsPath, self.clnb, 0.9)
98 return self.pathout['RTxtProfGraph']
100 def print_graph_files(self) :
101 mess_afc = "La position des points n'est peut être pas exacte"
102 afc_graph_list = [[os.path.basename(self.pathout['AFC2DL_OUT']), 'Variables actives - coordonnées - 30 points par classes - facteurs 1 / 2 - %s' % mess_afc],
103 [os.path.basename(self.pathout['AFC2DSL_OUT']), 'variables supplémentaires - coordonnées - 30 points par classes - facteurs 1 / 2 - %s' % mess_afc],
104 [os.path.basename(self.pathout['AFC2DEL_OUT']), 'Variables illustratives - Coordonnées - 30 points par classes - facteur 1 / 2 - %s' % mess_afc],
105 [os.path.basename(self.pathout['AFC2DCL_OUT']), 'Classes - Coordonnées - facteur 1 / 2']]
106 chd_graph_list = [[os.path.basename(self.pathout['dendro1']), 'dendrogramme à partir de chd1']]
107 if self.parametres['classif_mode'] == 0 :
108 chd_graph_list.append([os.path.basename(self.pathout['dendro2']), 'dendrogramme à partir de chd2'])
109 chd_graph_list.append([os.path.basename(self.pathout['arbre1']), 'chd1'])
110 if self.parametres['classif_mode'] == 0 :
111 chd_graph_list.append([os.path.basename(self.pathout['arbre2']), 'chd2'])
112 print_liste(self.pathout['liste_graph_afc'], afc_graph_list)
113 print_liste(self.pathout['liste_graph_chd'], chd_graph_list)
114 PrintRapport(self, self.corpus, self.parametres)
116 class TgenProf(AnalyseText):
117 def __init__(self, ira, corpus, parametres, cluster_size):
120 self.parametres = parametres
121 self.pathout = PathOut(dirout = self.parametres['pathout'])
122 self.cluster_size = [len(classe) for classe in corpus.lc]
126 self.tgen = TGen(path = self.parametres['tgenpath'], encoding = self.ira.syscoding)
127 self.tgen.read(self.tgen.path)
128 #self.parametres['etoiles'].sort()
129 self.parametres['tgeneff'] = os.path.join(self.parametres['pathout'], 'tgeneff.csv')
130 tgenst = self.corpus.make_tgen_profile(self.tgen.tgen, self.corpus.lc)
131 clnames = ['cluster_%03d' % i for i in range(1, len(self.cluster_size) + 1)]
132 et = dict(list(zip(clnames, self.cluster_size)))
133 tgenst = dict([[line[0], dict(list(zip(clnames, line[1:])))] for line in tgenst])
134 self.tgen.writetable(self.parametres['tgeneff'], tgenst, et)
135 self.parametres['tgenspec'] = os.path.join(self.parametres['pathout'], 'tgenchi2.csv')
136 self.parametres['tgenlemeff'] = os.path.join(self.parametres['pathout'], 'tgenlemeff.csv')
137 self.parametres['tgenlemspec'] = os.path.join(self.parametres['pathout'], 'tgenlemchi2.csv')
138 tgenlemeff = dict([[lem, dict(list(zip(clnames, self.corpus.tgenlem[lem])))] for lem in self.corpus.tgenlem])
139 self.tgen.writetable(self.parametres['tgenlemeff'], tgenlemeff, et)
140 self.Rscript = TgenProfScript(self)
141 self.Rscript.make_script()
143 self.doR(self.Rscript.scriptout, dlg = False, message = 'R...')
146 class ReDoProfile(AnalyseText):
148 def __init__(self, ira, corpus, analyses, parametres):
151 self.parametres = parametres
152 self.analyse = analyse
153 self.pathout = PathOut(dirout = self.parametres['pathout'])
154 #self.cluster_size = [len(classe) for classe in corpus.lc]
158 script = ReDoProfScript(self)