...
[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
35         if self.parametres is not None :
36             self.parametres = self.make_config(parametres)
37         log.info(self.pathout.dirout)
38         if self.parametres is not None :
39             self.keys = DoConf(self.ira.ConfigPath['key']).getoptions()
40             gramact = [k for k in self.keys if self.keys[k] == 1]
41             gramsup = [k for k in self.keys if self.keys[k] == 2]
42             self.parametres['pathout'] = self.pathout.mkdirout()
43             self.pathout = PathOut(dirout=self.parametres['pathout'])
44             self.pathout.createdir(self.parametres['pathout'])
45             self.parametres['corpus'] = self.corpus.parametres['uuid']
46             self.parametres['uuid'] = str(uuid4())
47             self.parametres['name'] = os.path.split(self.parametres['pathout'])[1]
48             self.parametres['type'] = parametres['type']
49             self.parametres['encoding'] = self.ira.syscoding
50             self.t1 = time()
51             if not self.parametres.get('dictionary', False) :
52                 self.corpus.make_lems(lem=self.parametres['lem'])
53             else :
54                 dico = ReadDicoAsDico(self.parametres['dictionary'])
55                 self.corpus.make_lems_from_dict(dico, dolem=self.parametres['lem'])
56                 dictname = os.path.basename(self.parametres['dictionary'])
57                 dictpath = os.path.join(self.pathout.dirout, dictname)
58                 copy(self.parametres['dictionary'], dictpath)
59                 self.parametres['dictionary'] = dictpath
60             self.corpus.parse_active(gramact, gramsup)
61             if dlg :
62                 self.dlg = progressbar(self.ira, dlg)
63             result_analyse = self.doanalyse()
64             if result_analyse is None :
65                 self.time = time() - self.t1
66                 minutes, seconds = divmod(self.time, 60)
67                 hours, minutes = divmod(minutes, 60)            
68                 self.parametres['time'] = '%.0fh %.0fm %.0fs' % (hours, minutes, seconds)
69                 self.parametres['ira'] = self.pathout['Analyse.ira']
70                 DoConf().makeoptions([self.parametres['type']], [self.parametres], self.pathout['Analyse.ira'])
71                 self.ira.history.add(self.parametres)
72                 if dlg :
73                     self.dlg.Destroy()
74                     OpenAnalyse(self.parent, self.parametres['ira'])
75                     self.ira.tree.AddAnalyse(self.parametres)
76                     self.val = 5100
77             else :
78                 self.val = False
79                 if dlg :
80                     self.dlg.Destroy()
81         else :
82             if dlg :
83                 self.dlg.Destroy()
84             self.val = False
85
86     def doanalyse(self) :
87         pass
88
89     def lemparam(self) :
90         if self.dlg and self.lemdial:
91             dial = StatDialog(self.parent, self.keys)
92             dial.CenterOnParent()
93             val = dial.ShowModal()
94             if val == 5100 :
95                 if dial.radio_lem.GetSelection() == 0 :
96                     lem = 1
97                 else :
98                     lem = 0            
99                 self.parametres['lem'] = lem
100                 if dial.radio_dictchoice.GetSelection() == 1 :
101                     self.parametres['dictionary'] = dial.dictpath.GetValue() 
102                 dial.Destroy()
103                 return self.parametres
104             else :
105                 dial.Destroy()
106                 return None        
107         else :
108             return self.parametres
109
110     def make_config(self, config) :
111         if config is not None :
112             if not self.dlg : 
113                 return config
114             else :
115                 return self.preferences()
116         else :
117             return None
118
119     def readconfig(self, config) :
120         return config
121
122     def preferences(self) :
123         return self.parametres
124
125     def printRscript(self) :
126         pass
127
128     def doR(self, Rscript, wait=False, dlg=None, message='') :
129         log.info('R code...')
130         pid = exec_rcode(self.ira.RPath, Rscript, wait=wait)
131         while pid.poll() is None :
132             if dlg :
133                 self.dlg.Pulse(message)
134                 sleep(0.2)
135             else :
136                 sleep(0.2)
137         return check_Rresult(self.ira, pid)
138
139
140
141
142
143
144 # keys = {'art_def' : 2,
145 #        'pre' : 2,
146 #        'adj_dem' : 2,
147 #        'ono' : 2,
148 #        'pro_per' : 2,
149 #        'ver_sup' : 2,
150 #        'adv' : 1,
151 #        'ver' : 1,
152 #        'adj_ind' : 2,
153 #        'adj_pos' : 2,
154 #        'aux' : 2,
155 #        'adj_int' : 2,
156 #        'pro_ind' : 2,
157 #        'adj' : 1,
158 #        'pro_dem' : 2,
159 #        'nom' : 1,
160 #        'art_ind' : 2,
161 #        'pro_pos' : 2,
162 #        'nom_sup' : 2,
163 #        'adv_sup' : 2,
164 #        'adj_sup' : 2,
165 #        'adj_num' : 2,
166 #        'pro_rel' : 2,
167 #        'con' : 2,
168 #        'num' : 2,
169 #        'nr' : 1,
170 #        'sw' : 2,
171 # }
172 #
173 # gramact = [k for k in keys if keys[k] == 1]
174 # gramsup = [k for k in keys if keys[k] == 2]