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