...
[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                     self.dlg.Destroy()
82         else :
83             #if isinstance(dlg, wx.ProgressDialog) :
84             #    self.dlg.Destroy()
85             self.val = False
86
87     def doanalyse(self) :
88         pass
89
90     def lemparam(self) :
91         if self.dlg and self.lemdial:
92             dial = StatDialog(self.parent, self.keys)
93             dial.CenterOnParent()
94             val = dial.ShowModal()
95             if val == 5100 :
96                 if dial.radio_lem.GetSelection() == 0 :
97                     lem = 1
98                 else :
99                     lem = 0            
100                 self.parametres['lem'] = lem
101                 if dial.radio_dictchoice.GetSelection() == 1 :
102                     self.parametres['dictionary'] = dial.dictpath.GetValue() 
103                 dial.Destroy()
104                 return self.parametres
105             else :
106                 dial.Destroy()
107                 return None        
108         else :
109             return self.parametres
110
111     def make_config(self, config) :
112         if config is not None :
113             if not self.dlg : 
114                 return config
115             else :
116                 return self.preferences()
117         else :
118             return None
119
120     def readconfig(self, config) :
121         return config
122
123     def preferences(self) :
124         return self.parametres
125
126     def printRscript(self) :
127         pass
128
129     def doR(self, Rscript, wait=False, dlg=None, message='') :
130         log.info('R code...')
131         pid = exec_rcode(self.ira.RPath, Rscript, wait=wait)
132         while pid.poll() is None :
133             if dlg :
134                 self.dlg.Pulse(message)
135                 sleep(0.2)
136             else :
137                 sleep(0.2)
138         return check_Rresult(self.ira, pid)
139
140
141
142
143
144
145 # keys = {'art_def' : 2,
146 #        'pre' : 2,
147 #        'adj_dem' : 2,
148 #        'ono' : 2,
149 #        'pro_per' : 2,
150 #        'ver_sup' : 2,
151 #        'adv' : 1,
152 #        'ver' : 1,
153 #        'adj_ind' : 2,
154 #        'adj_pos' : 2,
155 #        'aux' : 2,
156 #        'adj_int' : 2,
157 #        'pro_ind' : 2,
158 #        'adj' : 1,
159 #        'pro_dem' : 2,
160 #        'nom' : 1,
161 #        'art_ind' : 2,
162 #        'pro_pos' : 2,
163 #        'nom_sup' : 2,
164 #        'adv_sup' : 2,
165 #        'adj_sup' : 2,
166 #        'adj_num' : 2,
167 #        'pro_rel' : 2,
168 #        'con' : 2,
169 #        'num' : 2,
170 #        'nr' : 1,
171 #        'sw' : 2,
172 # }
173 #
174 # gramact = [k for k in keys if keys[k] == 1]
175 # gramsup = [k for k in keys if keys[k] == 2]