...
[iramuteq] / analysetxt.py
1 # -*- coding: utf-8 -*-
2 # Author: Pierre Ratinaud
3 # lisence : GNU GPL
4 # copyright : 2012-2013 (c) Pierre Ratinaud
5
6 import logging
7 from chemins import PathOut
8 from functions import exec_rcode, check_Rresult, DoConf, ReadDicoAsDico, progressbar
9 from shutil import copy
10 from time import time, sleep
11 from uuid import uuid4
12 import os
13 from openanalyse import OpenAnalyse
14 from dialog import StatDialog
15
16 log = logging.getLogger('iramuteq.analyse')
17
18 class AnalyseText :
19     def __init__(self, ira, corpus, parametres=None, dlg=False, lemdial=True) :
20         self.corpus = corpus
21         self.ira = ira
22         self.parent = ira
23         self.dlg = dlg
24         self.dialok = True
25         self.parametres = parametres
26         self.lemdial = lemdial
27         self.val = False
28         self.keys = DoConf(self.ira.ConfigPath['key']).getoptions()
29         if not 'pathout' in self.parametres :
30             self.pathout = PathOut(corpus.parametres['originalpath'], analyse_type=parametres['type'], dirout=corpus.parametres['pathout'])
31         else :
32             self.pathout = PathOut(filename=corpus.parametres['originalpath'], dirout=self.parametres['pathout'], analyse_type=self.parametres['type'])
33         self.parametres = self.lemparam()
34         if self.parametres is not None :
35             self.parametres = self.make_config(parametres)
36         log.info(self.pathout.dirout)
37         if self.parametres is not None :
38             self.keys = DoConf(self.ira.ConfigPath['key']).getoptions()
39             gramact = [k for k in self.keys if self.keys[k] == 1]
40             gramsup = [k for k in self.keys if self.keys[k] == 2]
41             self.parametres['pathout'] = self.pathout.mkdirout()
42             self.pathout = PathOut(dirout=self.parametres['pathout'])
43             self.pathout.createdir(self.parametres['pathout'])
44             self.parametres['corpus'] = self.corpus.parametres['uuid']
45             self.parametres['uuid'] = str(uuid4())
46             self.parametres['name'] = os.path.split(self.parametres['pathout'])[1]
47             self.parametres['type'] = parametres['type']
48             self.parametres['encoding'] = self.ira.syscoding
49             self.t1 = time()
50             if not self.parametres.get('dictionary', False) :
51                 self.corpus.make_lems(lem=self.parametres['lem'])
52             else :
53                 dico = ReadDicoAsDico(self.parametres['dictionary'])
54                 self.corpus.make_lems_from_dict(dico, dolem=self.parametres['lem'])
55                 dictname = os.path.basename(self.parametres['dictionary'])
56                 dictpath = os.path.join(self.pathout.dirout, dictname)
57                 copy(self.parametres['dictionary'], dictpath)
58                 self.parametres['dictionary'] = dictpath
59             self.corpus.parse_active(gramact, gramsup)
60             if dlg :
61                 self.dlg = progressbar(self.ira, dlg)
62             result_analyse = self.doanalyse()
63             if result_analyse is None :
64                 self.time = time() - self.t1
65                 minutes, seconds = divmod(self.time, 60)
66                 hours, minutes = divmod(minutes, 60)            
67                 self.parametres['time'] = '%.0fh %.0fm %.0fs' % (hours, minutes, seconds)
68                 self.parametres['ira'] = self.pathout['Analyse.ira']
69                 DoConf().makeoptions([self.parametres['type']], [self.parametres], self.pathout['Analyse.ira'])
70                 self.ira.history.add(self.parametres)
71                 if dlg :
72                     if not isinstance(dlg, int) :
73                         dlg.Destroy()
74                     self.dlg.Destroy()
75                     OpenAnalyse(self.parent, self.parametres['ira'])
76                     self.ira.tree.AddAnalyse(self.parametres)
77                     self.val = 5100
78             else :
79                 self.val = False
80                 if dlg :
81                     try :
82                         self.dlg.Destroy()
83                     except :
84                         pass
85         else :
86             #if isinstance(dlg, wx.ProgressDialog) :
87             #    self.dlg.Destroy()
88             self.val = False
89
90     def doanalyse(self) :
91         pass
92
93     def lemparam(self) :
94         if self.dlg and self.lemdial:
95             dial = StatDialog(self.parent, self.keys)
96             dial.CenterOnParent()
97             val = dial.ShowModal()
98             if val == 5100 :
99                 if dial.radio_lem.GetSelection() == 0 :
100                     lem = 1
101                 else :
102                     lem = 0            
103                 self.parametres['lem'] = lem
104                 if dial.radio_dictchoice.GetSelection() == 1 :
105                     self.parametres['dictionary'] = dial.dictpath.GetValue() 
106                 dial.Destroy()
107                 return self.parametres
108             else :
109                 dial.Destroy()
110                 return None        
111         else :
112             return self.parametres
113
114     def make_config(self, config) :
115         if config is not None :
116             if not self.dlg : 
117                 return config
118             else :
119                 return self.preferences()
120         else :
121             return None
122
123     def readconfig(self, config) :
124         return config
125
126     def preferences(self) :
127         return self.parametres
128
129     def printRscript(self) :
130         pass
131
132     def doR(self, Rscript, wait=False, dlg=None, message='') :
133         log.info('R code...')
134         pid = exec_rcode(self.ira.RPath, Rscript, wait=wait)
135         while pid.poll() is None :
136             if dlg :
137                 self.dlg.Pulse(message)
138                 sleep(0.2)
139             else :
140                 sleep(0.2)
141         return check_Rresult(self.ira, pid)
142
143
144
145
146
147
148 # keys = {'art_def' : 2,
149 #        'pre' : 2,
150 #        'adj_dem' : 2,
151 #        'ono' : 2,
152 #        'pro_per' : 2,
153 #        'ver_sup' : 2,
154 #        'adv' : 1,
155 #        'ver' : 1,
156 #        'adj_ind' : 2,
157 #        'adj_pos' : 2,
158 #        'aux' : 2,
159 #        'adj_int' : 2,
160 #        'pro_ind' : 2,
161 #        'adj' : 1,
162 #        'pro_dem' : 2,
163 #        'nom' : 1,
164 #        'art_ind' : 2,
165 #        'pro_pos' : 2,
166 #        'nom_sup' : 2,
167 #        'adv_sup' : 2,
168 #        'adj_sup' : 2,
169 #        'adj_num' : 2,
170 #        'pro_rel' : 2,
171 #        'con' : 2,
172 #        'num' : 2,
173 #        'nr' : 1,
174 #        'sw' : 2,
175 # }
176 #
177 # gramact = [k for k in keys if keys[k] == 1]
178 # gramsup = [k for k in keys if keys[k] == 2]