multisplit
[iramuteq] / textreinert.py
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
5 #License: GNU/GPL
6
7 #------------------------------------
8 # import des modules python
9 #------------------------------------
10 import os
11 from time import time
12
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
22
23
24 class Reinert(AnalyseText) :
25
26     def doanalyse(self) :
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)
32         uci = False
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'])
41             uci = True
42         Rscript = self.printRscript()
43         result = self.doR(Rscript, dlg=self.dlg, message='CHD...')
44         if not result :
45             return 'NOK'
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()
60
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])
84             self.dial.Destroy()
85             print(parametres)
86             self.parametres.update(parametres)
87             return self.parametres
88         else :
89             self.dial.Destroy()
90             return None
91
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']
95
96     def printRscript2(self) :
97         ReinertTxtProf(self.pathout, self.parent.RscriptsPath, self.clnb, 0.9)
98         return self.pathout['RTxtProfGraph']
99
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)
115
116 class TgenProf(AnalyseText):
117     def __init__(self, ira, corpus, parametres, cluster_size):
118         self.ira = ira
119         self.corpus = corpus
120         self.parametres = parametres
121         self.pathout = PathOut(dirout = self.parametres['pathout'])
122         self.cluster_size = [len(classe) for classe in corpus.lc]
123         self.doanalyse()
124
125     def doanalyse(self):
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()
142         self.Rscript.write()
143         self.doR(self.Rscript.scriptout, dlg = False, message = 'R...')
144
145
146 class ReDoProfile(AnalyseText):
147
148     def __init__(self, ira, corpus, analyses, parametres):
149         self.ira = ira
150         self.corpus = corpus
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]
155         self.doanalyse()
156
157     def Rscript(self) :
158        script = ReDoProfScript(self)