images
[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 testvar(line, variable) :
26     line = line.split()
27     varmod = [val.split('_') for val in line[1:]]
28     vars = [var[0] for var in varmod]
29     if variable in vars :
30         return '_'.join([variable, varmod[vars.index(variable)][1]]).replace(u'*','')
31     else :
32         return False
33
34 def testmod(line, mods) :
35     line = line.split()
36     for mod in mods :
37         if mod in line[1:] :
38             return mod.replace(u'*','')
39     return False
40
41
42 class Extract :
43     def __init__(self, parent, option) :
44         dial = ExtractDialog(parent, option)
45         dial.CenterOnParent()
46         res = dial.ShowModal()
47         if res == wx.ID_OK :
48             parametres = dial.make_param()
49             if option == 'splitvar' :
50                 SplitFromVar(parametres)
51             else :
52                 ExtractMods(parametres)
53         dial.Destroy()
54         dial = wx.MessageDialog(parent, 'Done !', style = wx.OK)
55         dial.ShowModal()
56         dial.Destroy()
57
58 class SplitFromVar :
59     def __init__(self, parametres) :
60         self.filein = parametres['filein']
61         self.var = parametres['var']
62         self.encodein = parametres['encodein']
63         self.encodeout = parametres['encodeout']
64         self.basepath = os.path.dirname(self.filein)
65         self.doparse()
66
67     def doparse(self) :
68         keepline = False
69         filedict = {}
70         with codecs.open(self.filein, 'r', self.encodein) as fin :
71             for line in fin :
72                 if istext(line) :
73                     varmod = testvar(line, self.var)
74                     if varmod :
75                         keepline = True
76                         if varmod not in filedict :
77                             filename = os.path.join(self.basepath, varmod + '.txt')
78                             filedict[varmod] = open(filename, 'w')
79                         fileout = filedict[varmod]
80                     else : 
81                         keepline = False
82                 if keepline :
83                     fileout.write(line.encode(self.encodeout))
84         for f in filedict :
85             filedict[f].close()
86
87 class ExtractMods :
88     def __init__(self, parametres) :
89         self.onefile = parametres.get('onefile', False)
90         self.filein = parametres['filein']
91         self.mods = parametres['mods']
92         self.encodein = parametres['encodein']
93         self.encodeout = parametres['encodeout']
94         self.basepath = os.path.dirname(self.filein)
95         if self.onefile :
96             filename = os.path.join(self.basepath, '_'.join([mod.replace(u'*','') for mod in self.mods])+'.txt')
97             self.fileout = open(filename, 'w')
98         self.doparse()
99
100     def doparse(self) :
101         keepline = False
102         filedict = {}
103         with codecs.open(self.filein, 'r', self.encodein) as fin :
104             for line in fin :
105                 if istext(line) :
106                     modinline = testmod(line, self.mods)
107                     if modinline :
108                         keepline = True
109                         if not self.onefile :
110                             if modinline not in filedict :
111                                 filename = os.path.join(self.basepath, modinline + '.txt')
112                                 filedict[modinline] = open(filename, 'w')
113                             fileout = filedict[modinline]
114                         else :
115                             fileout = self.fileout
116                     else : 
117                         keepline = False
118                 if keepline :
119                     fileout.write(line.encode(self.encodeout))
120         if not self.onefile :
121             for f in filedict :
122                 filedict[f].close()
123         else :
124             self.fileout.close()
125
126
127 class SubCorpus(Corpus) :
128     def __init__(self, parent, corpus, sgts) :
129         Corpus.__init__(self, parent, corpus.parametres)
130         self.sgts = sgts
131         self.corpus = copycorpus(corpus)
132         self.corpus.make_lems(self.parametres['lem'])
133         textes = list(set([corpus.getucefromid(sgt).uci for sgt in sgts]))
134         self.ucis = [corpus.ucis[i] for i in textes]
135         for texte in self.ucis :
136             texte.uces = [uce for uce in texte.uces if uce.ident in self.sgts] 
137         self.make_formes(corpus)
138         self.pathout = corpus.pathout 
139         self.parametres['sub'] = self.sgts
140
141     def make_formes(self, corpus) :
142         self.formes = {}
143         for forme in self.corpus.formes :
144             sgtseff = self.corpus.getformeuceseff(forme)
145             sgts = set(self.sgts).intersection(sgtseff.keys())
146             if len(sgts) :
147                 self.formes[forme] = self.corpus.formes[forme]
148                 self.formes[forme].freq = sum([sgtseff[sgt] for sgt in sgts])
149
150     def getlemuces(self, lem) :
151         return list(set(self.sgts).intersection(self.corpus.getlemuces(lem)))
152
153 def converttabletocorpus(table, fileout, enc='UTF8') :
154     var = table.pop(0)
155     var = var[0:len(var)-1]
156     print var
157     et = [zip(var, line[0:len(line)-1]) for line in table]
158     et = ['**** ' + ' '.join(['*' + '_'.join(val) for val in line]) for line in et] 
159     txt = ['\n'.join([et[i], line[-1]]) for i, line in enumerate(table)]
160     print '\n'.join(txt)
161     #with open(fileout, 'w') as f :
162         
163
164
165
166
167 if __name__ == '__main__' :
168     #SplitFromVar(parametres)
169     ExtractMods(parametres, True)