...
[iramuteq] / ttparser.py
1 #!/bin/env python
2 # -*- coding: utf-8 -*-
3 #Author: Pierre Ratinaud
4
5 #a simple treetagger parser
6 import codecs
7 import time
8 import re
9 from functions import ReadDicoAsDico
10 from itertools import izip, chain
11
12 t1 = time.time()
13 #infile = '/home/pierre/prog/treetagger/cmd/allenglish.txt'
14
15 infile = '/home/pierre/fac/cablegate/cablestagger.txt'
16 word_list = '/home/pierre/fac/cablegate/liste_de_mots.csv'
17 actives_list = '/home/pierre/fac/cablegate/actives.csv'
18 supps_list = '/home/pierre/fac/cablegate/supplementaires.csv'
19
20
21 def prepare_for_treetagger(corpus, parent) :
22     fileout = '/home/pierre/workspace/iramuteq/corpus/corpus_pour_tt.txt'
23     corpus.quick_clean1()
24     lang = corpus.parametre['lang']
25     dico_path = parent.DictPath.get(lang + '_exp', 'french_exp')
26     expressions = ReadDicoAsDico(dico_path)
27     corpus.find_expression(expressions)
28     #corpus.content = re.sub(u'[-]+', ' ', corpus.content)
29     corpus.content = re.sub(u'[ ]+', ' ', corpus.content)
30     #FIXME : remplacer . par ' . '
31     #corpus.quick_clean2()
32     with open(fileout, 'w') as f :
33         f.write(corpus.content)
34
35 def partition(alist, indices):
36     pairs = izip(chain([0], indices), chain(indices, [None]))
37     return (alist[i:j] for i, j in pairs)
38
39 def partition_uci(uci) :
40     if uci == [] :
41         pass
42     else :
43         indices = [i for i, forme in enumerate(uci) if forme[0].startswith(u'*')]
44         pairs = izip(chain([0], indices), chain(indices, [None]))
45         return (uci[i,j] for i, j in pairs)
46
47 def dodict(inlist, indict) :
48     for i, forme in enumerate(inlist) :
49         if tuple(forme) in tot :
50             tot[tuple(forme)].append(i)
51         else :
52             tot[tuple(forme)] = [i]
53
54 def treat_forme(forme, tformes) :
55     ponct =[u',', u'', u'``', u"''", u':', u'#', u')', '(', u'!', u'?', u';', u'-', u'.', u'...']
56     if forme[0] in ponct :
57         return forme[0]
58     tforme = (forme[0], forme[1].split(':')[0])
59     return tformes[tforme]
60
61 def make_formes_and_lems(inlist) :
62     formes = {}
63     tformes = {}
64     formes_lems = {}
65     lems = {}
66     for forme in inlist :
67         word = forme[0]
68         gram = forme[1].split(':')[0]
69         lem = forme[2]
70         tforme = (word,gram)
71         if tforme in tformes :
72             if formes_lems[tformes[tforme]] == u'<unknown>' and lem != u'<unknown>' :
73                 formes_lems[tformes[tforme]] = lem
74         else :
75             if word in formes :
76                 nword = u'@'.join([word,''])
77                 while nword in formes and formes[nword] != gram :
78                     nword = u'@'.join([nword,''])
79                 formes[nword] = [0, {}, gram, len(formes)]
80                 tformes[tforme] = nword
81                 formes_lems[nword] = lem
82             else :
83                 formes[word] = [0, {}, gram, len(formes)]
84                 tformes[tforme] = word
85                 formes_lems[word] = lem
86     for forme in formes :
87         if formes_lems[forme] == u'<unknown>' :
88             formes_lems[forme] = forme
89         if formes_lems[forme] in lems :
90             lems[formes_lems[forme]].append(forme)
91         else :
92             lems[formes_lems[forme]] = [forme]
93     del formes_lems
94     return formes, lems, tformes 
95
96 def make_ucis_txt_formes_from_tt(corpus, tformes) :
97     ucis_txt = [[treat_forme(forme, tformes) for forme in uci] for uci in corpus.ucis_txt]
98     del tformes
99     return [' '.join(uci) for uci in ucis_txt]
100     
101 def get_ucis_from_tt(corpus) :
102     content_split = [tuple(line.split('\t')) for line in corpus.content.splitlines()]
103     #print [i for i, line in enumerate(content_split) if line[0] == u'****']
104     ponct =[u',', u'', u'``', u"''", u':', u'#', u')', '(', u'!', u'?', u';', u'-', u'.', u'...']
105     lformes = [forme for forme in list(set(content_split)) if not forme[0].startswith(u'*') and forme[0] not in ponct] 
106     formes, lems, tformes = make_formes_and_lems(lformes)
107     ucis = partition(content_split, [i for i, line in enumerate(content_split) if line[0] == u'****'])
108     del content_split
109     ucis = [uci for uci in ucis]
110     ucis.pop(0)
111     indices_max_et = [max([i for i, forme in enumerate(uci) if forme[0].startswith(u'*')]) for uci in ucis]
112     corpus.ucis = [uci[:indices_max_et[i] + 1] for i, uci in enumerate(ucis)]
113     corpus.ucis = [[[et[0] for et in uci],''] for uci in corpus.ucis]
114     corpus.ucis_txt = [uci[indices_max_et[i] + 1:] for i, uci in enumerate(ucis)]
115     del ucis
116     corpus.formes = formes
117     corpus.lems = lems
118     return make_ucis_txt_formes_from_tt(corpus, tformes)
119
120 #with codecs.open(infile, 'r', 'latin1') as f :
121 #    #content = [line.split('\t') for line in f]
122 #    content = f.read()
123 #print time.time() - t1
124 #print(u'#1')
125 #c1 = content.splitlines()
126 #print(u'#1b')
127 #c1s = [val.split('\t') for val in c1]
128 #print('#2')
129 #sc1 = list(set(c1))
130 #print('#3')
131 #sc1 = [val.split('\t') for val in sc1]
132 #print len(sc1)
133 #print('#4')
134 #formes = [val for val in sc1 if not val[0].isdigit()]
135 #print len(formes)
136 #print('#5')
137 #sformes = [val[0] for val in formes]
138 #print len(sformes)
139 #print('#6')
140 #
141 #t4 = time.time()
142 #def make_dicts(inlist) :
143 #    tot = {}
144 #    totgram = {}
145 #    for i, forme in enumerate(inlist) :
146 #        if tuple(forme) in tot :
147 #            tot[tuple(forme)].append(i)
148 #        else :
149 #            tot[tuple(forme)] = [i]
150 #        if forme[1] in totgram :
151 #            totgram[forme[1]] += 1
152 #        else :
153 #            totgram[forme[1]] = 1
154 #    return tot, totgram
155 #tot, totgram = make_dicts(c1s)
156 #print 'dico', time.time() - t4
157 #
158 #def load_keys() :
159 #    key_file = '/home/pierre/fac/cablegate/keys_english.txt'
160 #    with open(key_file, 'r') as f :
161 #        keys = f.read()
162 #    keys = keys.splitlines()
163 #    keys = [line.split('\t') for line in keys]
164 #    return keys
165 #
166 #keys = load_keys()
167 #print keys
168 #kact = [key[0] for key in keys if key[2] == '1']
169 #ksup = [key[0] for key in keys if key[2] == '2']
170 #
171 #actives = [[len(tot[forme]), forme[0], forme[1], forme[2]] for forme in tot if forme[1] in kact and len(tot[forme]) > 3]
172 #actives.sort()
173 #supps = [[len(tot[forme]), forme[0], forme[1], forme[2]] for forme in tot if forme[1] in ksup and len(tot[forme]) > 3]
174 #supps.sort()
175 #
176 #words = [[len(tot[word]), word[0], word[1], word[2]] for word in tot]
177 #words.sort()
178 ##hapax = [word for word in words if word[3] == 1]
179 ##print len(hapax)
180 #def print_list(thelist, fileout) :
181 #    with open(fileout, 'w') as f :
182 #        f.write('\n'.join(['\t'.join(['\t'.join(list(line[1:])), `line[0]`]) for line in thelist]).encode('latin1'))
183 #print_list(words, word_list)
184 #print_list(actives, actives_list)
185 #print_list(supps, supps_list)
186 #print time.time() - t4
187 #t5 = time.time()
188 #print('#7')
189 #def make_uci(c1s) :
190 #    return [val.tolist() for val in numpy.split(numpy.array(c1s),[i for i, line in enumerate(c1s) if line[0] == u'****'])] 
191 #
192 ##def make_ucil(c1s) :
193 #from itertools import izip, chain
194 #def partition(alist, indices):
195 #    pairs = izip(chain([0], indices), chain(indices, [None]))
196 #    return (alist[i:j] for i, j in pairs)
197 #
198 #def partition_uci(uci) :
199 #    if uci == [] :
200 #        pass
201 #    else :
202 #        indices = [i for i, forme in enumerate(uci) if forme[0].startswith(u'*')]
203 #        pairs = izip(chain([0], indices), chain(indices, [None]))
204 #        return (uci[i,j] for i, j in pairs)
205 #
206 ##ucis = make_uci(c1s)
207 #t2 = time.time()
208 #ucis = partition(c1s, [i for i, line in enumerate(c1s) if line[0] == u'****'])
209 #print time.time() - t2
210 #print('#8')
211 #print ucis
212 ##for uci in ucis :
213 ##    if uci != []:
214 ##        print max([i for i, forme in enumerate(uci) if forme[0].startswith(u'*')])
215 #
216 #ucis = [uci for uci in ucis]
217 #ucis.pop(0)
218 #indices_max_et = [max([i for i, forme in enumerate(uci) if forme[0].startswith(u'*')]) for uci in ucis]
219 ##ucis2 = [partition_uci(uci) for uci in ucis]
220 ##print len(ucis2)
221 #print len(indices_max_et)
222 #print'#9'
223 ##print ucis2[0:2]
224 #etoiles = [uci[:indices_max_et[i] + 1] for i, uci in enumerate(ucis)]
225 #ucis = [uci[indices_max_et[i] + 1:] for i, uci in enumerate(ucis)]
226 #print len(etoiles)
227 #print etoiles[0]
228 #print('#10')
229 #t3 = time.time()
230 ##ucis = [[val for val in uci if val[1] != 'PUN'] for uci in ucis]
231 #ind_sent = [[i for i, forme in enumerate(uci) if forme[1] == 'SENT'] for uci in ucis]
232 #print time.time() - t3
233 #print ind_sent[0]
234 #print len(ucis), len(ind_sent)
235 ##inuformes = [i for i,forme in enumerate(sformes) if sformes.count(forme) > 1]
236 ##inuformes = [formes[i] for i, forme in enumerate(sformes) if forme in sformes[i+1:]]
237 ##nonunique = [forme for forme in formes if formes.count(forme) > 1]
238 #print('#10')
239 #split_sents = [[partition(uci, ind_sent[i])] for i, uci in enumerate(ucis)]
240 #PUNCT = [u',', u'', u'``', u"''", u':', u'#', u')', '(', u'!', u'?', u';', u'-', u'.']
241 #split_sents = [[val for sent in uci for val in sent] for uci in split_sents]
242 #split_sents = [[val for sent in uci for val in sent if val[0] not in PUNCT and not val[0].isdigit()] for uci in split_sents]
243 ##for i in range(0,1) :
244 ##    for sent in split_sents[i] :
245 ##        for val in sent :
246 ##            print val
247 ##nuformes = [formes[i] for i in inuformes]
248 ##print('#8')
249 #
250 ##print double
251 #print totgram