multisplit
[iramuteq] / tools.py
1 # -*- coding: utf-8 -*-
2 #Author: Pierre Ratinaud
3 #Copyright (c) 2008-2020 Pierre Ratinaud
4 #modification pour python 3 : Laurent Mérat, 6x7 - mai 2020
5 #License: GNU/GPL
6
7 #------------------------------------
8 # import des modules python
9 #------------------------------------
10 import codecs
11 import os
12
13 #------------------------------------
14 # import des modules wx
15 #------------------------------------
16 import wx
17
18 #------------------------------------
19 # import des fichiers du projet
20 #------------------------------------
21 from dialog import ExtractDialog
22 from corpus import Corpus, copycorpus
23
24
25 parametres = {'filein' : 'corpus/lru2.txt',
26               'encodein' : 'utf8',
27               'encodeout' : 'utf8',
28               'mods' : ['*annee_2010', '*annee_2011']}
29
30
31 def istext(line) :
32     if line.startswith('**** ') :
33         return True
34     else :
35         return False
36
37 def isthem(line):
38     if line.startswith('-*') :
39         return True
40     else :
41         return False
42
43 def testvar(line, variable) :
44     line = line.split()
45     varmod = [val.split('_') for val in line[1:]]
46     vars = [var[0] for var in varmod]
47     if variable in vars :
48         return '_'.join([variable, varmod[vars.index(variable)][1]]).replace('*','')
49     else :
50         return False
51
52 def testmod(line, mods) :
53     line = line.split()
54     for mod in mods :
55         if mod in line[1:] :
56             return mod.replace('*','')
57     return False
58
59
60 class Extract :
61
62     def __init__(self, parent, option) :
63         dial = ExtractDialog(parent, option)
64         dial.CenterOnParent()
65         res = dial.ShowModal()
66         if res == wx.ID_OK :
67             parametres = dial.make_param()
68             if option == 'splitvar' :
69                 SplitFromVar(parametres)
70             elif option == 'mods' :
71                 ExtractMods(parametres)
72             elif option == 'them' :
73                 SplitFromThem(parametres)
74             dial.Destroy()
75             dial = wx.MessageDialog(parent, 'Done !', style = wx.OK)
76             dial.ShowModal()
77             dial.Destroy()
78         else :
79             dial.Destroy()
80
81
82 class SplitFromVar :
83
84     def __init__(self, parametres) :
85         self.filein = parametres['filein']
86         self.var = parametres['var']
87         self.encodein = parametres['encodein']
88         self.encodeout = parametres['encodeout']
89         self.basepath = os.path.dirname(self.filein)
90         self.doparse()
91
92     def doparse(self) :
93         keepline = False
94         filedict = {}
95         with codecs.open(self.filein, 'r', self.encodein) as fin :
96             for line in fin :
97                 if istext(line) :
98                     varmod = testvar(line, self.var)
99                     if varmod :
100                         keepline = True
101                         if varmod not in filedict :
102                             filename = os.path.join(self.basepath, varmod + '.txt')
103                             filedict[varmod] = open(filename, 'w')
104                         fileout = filedict[varmod]
105                     else : 
106                         keepline = False
107                 if keepline :
108                     fileout.write(line)
109         for f in filedict :
110             filedict[f].close()
111
112
113 class SplitFromThem :
114
115     def __init__(self, parametres) :
116         self.filein = parametres['filein']
117         self.them = parametres['them']
118         self.encodein = parametres['encodein']
119         self.encodeout = parametres['encodeout']
120         self.basepath = os.path.dirname(self.filein)
121         self.pathout = os.path.join(self.basepath, '_'.join([them.replace('-*','') for them in self.them]))
122         self.fileout = open(self.pathout, 'w')
123         self.doparse()
124         self.fileout.close()
125
126     def doparse(self):
127         text = ''
128         keepline = False
129         lastet = ''
130         with codecs.open(self.filein, 'r', self.encodein) as fin :
131             for line in fin :
132                 if istext(line) :
133                     self.writetext(self.fileout, lastet, text)
134                     text = ''
135                     lastet = line
136                 if isthem(line) :
137                     l = line.strip().rstrip('\n\r')
138                     if l in self.them :
139                         keepline = True
140                     else :
141                         keepline = False
142                 if keepline :
143                     text += line
144             self.writetext(self.fileout, lastet, text)
145
146     def writetext(self, fileout, lastet, text):
147         if text != '' :
148             self.fileout.write(lastet + text)
149
150
151 class ExtractMods :
152
153     def __init__(self, parametres) :
154         self.onefile = parametres.get('onefile', False)
155         self.filein = parametres['filein']
156         self.mods = parametres['mods']
157         self.encodein = parametres['encodein']
158         self.encodeout = parametres['encodeout']
159         self.basepath = os.path.dirname(self.filein)
160         if self.onefile :
161             filename = os.path.join(self.basepath, '_'.join([mod.replace('*','') for mod in self.mods])+'.txt')
162             self.fileout = open(filename, 'w')
163         self.doparse()
164
165     def doparse(self) :
166         keepline = False
167         filedict = {}
168         with codecs.open(self.filein, 'r', self.encodein) as fin :
169             for line in fin :
170                 if istext(line) :
171                     modinline = testmod(line, self.mods)
172                     if modinline :
173                         keepline = True
174                         if not self.onefile :
175                             if modinline not in filedict :
176                                 filename = os.path.join(self.basepath, modinline + '.txt')
177                                 filedict[modinline] = open(filename, 'w')
178                             fileout = filedict[modinline]
179                         else :
180                             fileout = self.fileout
181                     else : 
182                         keepline = False
183                 if keepline :
184                     fileout.write(line)
185         if not self.onefile :
186             for f in filedict :
187                 filedict[f].close()
188         else :
189             self.fileout.close()
190
191
192 class SubCorpus(Corpus) :
193
194     def __init__(self, parent, corpus, sgts) :
195         Corpus.__init__(self, parent, corpus.parametres)
196         self.sgts = sgts
197         self.corpus = copycorpus(corpus)
198         self.corpus.make_lems(self.parametres['lem'])
199         textes = list(set([corpus.getucefromid(sgt).uci for sgt in sgts]))
200         self.ucis = [corpus.ucis[i] for i in textes]
201         for texte in self.ucis :
202             texte.uces = [uce for uce in texte.uces if uce.ident in self.sgts] 
203         self.make_formes(corpus)
204         self.pathout = corpus.pathout 
205         self.parametres['sub'] = self.sgts
206
207     def make_formes(self, corpus) :
208         self.formes = {}
209         for forme in self.corpus.formes :
210             sgtseff = self.corpus.getformeuceseff(forme)
211             sgts = set(self.sgts).intersection(list(sgtseff.keys()))
212             if len(sgts) :
213                 self.formes[forme] = self.corpus.formes[forme]
214                 self.formes[forme].freq = sum([sgtseff[sgt] for sgt in sgts])
215
216     def getlemuces(self, lem) :
217         return list(set(self.sgts).intersection(self.corpus.getlemuces(lem)))
218
219
220 def converttabletocorpus(table, fileout, enc='UTF8') :
221     var = table.pop(0)
222     var = var[0:len(var)-1]
223     print(var)
224     et = [list(zip(var, line[0:len(line)-1])) for line in table]
225     et = ['**** ' + ' '.join(['*' + '_'.join(val) for val in line]) for line in et] 
226     txt = ['\n'.join([et[i], line[-1]]) for i, line in enumerate(table)]
227     print('\n'.join(txt))
228     #with open(fileout, 'w') as f :
229
230
231 # execution directe ???
232 if __name__ == '__main__' :
233     #SplitFromVar(parametres)
234     ExtractMods(parametres, True)