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