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