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