Commit 1bf3fe850db87d5824b2bad9a676f3295c574665
1 parent
1b580bd0
Exists in
master
and in
1 other branch
Remove PortGlosa e adiciona as funcionalidades no TraduzSentencas
Showing
3 changed files
with
168 additions
and
117 deletions
Show diff stats
src/new/AplicaRegras.py
... | ... | @@ -41,11 +41,7 @@ class AplicaRegras(object): |
41 | 41 | it = Iterator() |
42 | 42 | it.load(self.lista) |
43 | 43 | |
44 | - while(it.has_next()): | |
45 | - #if self.quantidade_iter_pular > 0: | |
46 | - # self.quantidade_iter_pular-=1 | |
47 | - # continue | |
48 | - | |
44 | + while(it.has_next()): | |
49 | 45 | for morpho in self.__root.findall('morphological'): |
50 | 46 | self.has_rule = False |
51 | 47 | for rule in morpho.findall('rule'): # procura a tag rule |
... | ... | @@ -58,7 +54,6 @@ class AplicaRegras(object): |
58 | 54 | try: |
59 | 55 | self.lista_iteracoes = it.get_interval(count) |
60 | 56 | it.skip(count-1) |
61 | - #self.quantidade_iter_pular = count-1 | |
62 | 57 | except: |
63 | 58 | continue |
64 | 59 | |
... | ... | @@ -89,7 +84,14 @@ class AplicaRegras(object): |
89 | 84 | self.quantidade_iter_pular = 0 |
90 | 85 | break |
91 | 86 | |
92 | - if newprop is not None: | |
87 | + if newprop is not None and newtoken is not None: | |
88 | + if newtokenpos is not None and newtokenpos.text == "0": | |
89 | + self.lista_iteracao_regra[self.count_iteracao_regra] = (newtoken.text + "_" + self.specific, newprop.text) | |
90 | + else: | |
91 | + self.lista_iteracao_regra[self.count_iteracao_regra] = (self.specific + "_" + newtoken.text, newprop.text) | |
92 | + continue | |
93 | + | |
94 | + elif newprop is not None: | |
93 | 95 | self.lista_iteracao_regra.append([self.specific,newprop.text]) |
94 | 96 | |
95 | 97 | if newtoken is not None and newpos is not None: |
... | ... | @@ -97,10 +99,10 @@ class AplicaRegras(object): |
97 | 99 | lista_merge = count * [None] |
98 | 100 | lista_merge[int(newpos.text)] = tupla[0] |
99 | 101 | lista_merge[int(newtokenpos.text)] = newtoken.text |
100 | - merge_tokens = " ".join(lista_merge) | |
102 | + merge_tokens = "_".join(lista_merge) | |
101 | 103 | self.lista_iteracao_regra.append([merge_tokens, title.text]) |
102 | 104 | else: |
103 | - self.lista_iteracao_regra.append([tupla[0] + " " + newtoken.text, title.text]) | |
105 | + self.lista_iteracao_regra.append([tupla[0] + "_" + newtoken.text, title.text]) | |
104 | 106 | |
105 | 107 | elif newpos is not None: |
106 | 108 | if newpos.text == "-1": |
... | ... | @@ -110,17 +112,15 @@ class AplicaRegras(object): |
110 | 112 | self.lista_iteracao_regra[int(newpos.text)] = tupla |
111 | 113 | |
112 | 114 | elif newtoken is not None: |
113 | - tokenAnterior = self.lista_iteracao_regra[self.count_iteracao_regra][0] | |
114 | - ticketAnterior = self.lista_iteracao_regra[self.count_iteracao_regra][1] | |
115 | + token_anterior = self.lista_iteracao_regra[self.count_iteracao_regra][0] | |
116 | + ticket_anterior = self.lista_iteracao_regra[self.count_iteracao_regra][1] | |
115 | 117 | if newtokenpos is not None and newtokenpos.text == "0": |
116 | - self.lista_iteracao_regra[self.count_iteracao_regra] = [newtoken.text + " " + tokenAnterior, ticketAnterior] | |
118 | + self.lista_iteracao_regra[self.count_iteracao_regra] = [newtoken.text + "_" + token_anterior, ticket_anterior] | |
117 | 119 | else: |
118 | - self.lista_iteracao_regra[self.count_iteracao_regra] = [tokenAnterior + " " + newtoken.text, ticketAnterior] | |
120 | + self.lista_iteracao_regra[self.count_iteracao_regra] = [token_anterior + "_" + newtoken.text, ticket_anterior] | |
119 | 121 | |
120 | - #self.lista_corrigida.append(filter(None, self.lista_iteracao_regra)[0]) | |
121 | - #se ele acho uma regra, então quebra o laço e vai para o token seguinte | |
122 | 122 | if self.has_rule: |
123 | - self.lista_corrigida.append(self.lista_iteracao_regra) | |
123 | + self.lista_corrigida.append(filter(None, self.lista_iteracao_regra)[0]) | |
124 | 124 | break |
125 | 125 | |
126 | 126 | if (self.has_rule == False): |
... | ... | @@ -137,65 +137,92 @@ class AplicaRegras(object): |
137 | 137 | for rule in morpho.findall('rule'): # procura a tag rule |
138 | 138 | nome_regra = self.corrigir_anotacao(rule.get('name')) |
139 | 139 | regra = self.separar_regra(nome_regra) |
140 | - node = tgrep_nodes(p_arvore, regra[0], search_leaves=False) | |
141 | - if node: | |
142 | - print "REGRA SINTÁTICA: " + rule.get('name') | |
143 | - node_esq = tgrep_nodes(node[0], regra[1], search_leaves=False) | |
144 | - node_esq_pos = tgrep_positions(node[0], regra[1], search_leaves=False) | |
145 | - node_dir = tgrep_nodes(node[0], regra[2], search_leaves=False) | |
146 | - node_dir_pos = tgrep_positions(node[0], regra[2], search_leaves=False) | |
147 | - p_arvore.remove(p_arvore[node_esq_pos]) | |
148 | - if node_esq and node_dir: | |
149 | - subnodes = node_esq + node_dir | |
150 | - for subnode in subnodes: | |
151 | - self.alteracoes_nao_implementadas = [] | |
152 | - # modelo: [['node_esq', ['token', 'ticket']],['node_dir', ['token', 'ticket']]] | |
153 | - for classe in rule.iter('class'): | |
154 | - title = classe.find('title') | |
155 | - if subnode.label() == title.text: | |
156 | - newpos = classe.find('newpos') | |
157 | - newprop = classe.find('newprop') | |
158 | - newtoken = classe.find('newtoken') | |
159 | - newtokenpos = classe.find('newtokenpos') | |
140 | + node_pai = tgrep_nodes(p_arvore, regra[0], search_leaves=False) | |
141 | + if node_pai: | |
142 | + node_regra = tgrep_nodes(node_pai[0], regra[1].replace('$', '>'), search_leaves=False) | |
143 | + if node_regra: | |
144 | + node_esq = tgrep_nodes(node_pai[0], regra[1], search_leaves=False) | |
145 | + node_esq_pos = tgrep_positions(node_pai[0], regra[1], search_leaves=False) | |
146 | + node_dir = tgrep_nodes(node_pai[0], regra[2], search_leaves=False) | |
147 | + node_dir_pos = tgrep_positions(node_pai[0], regra[2], search_leaves=False) | |
148 | + if node_esq and node_dir: | |
149 | + print "REGRA SINTÁTICA: " + rule.get('name') | |
150 | + subnodes = node_esq + node_dir | |
151 | + for subnode in subnodes: | |
152 | + self.has_rule = True | |
153 | + self.alteracoes_nao_implementadas = [None,None] | |
154 | + self.count_iteracao_regra = -1 | |
155 | + self.specific = None | |
156 | + | |
157 | + for classe in rule.findall('class'): | |
160 | 158 | self.specific = classe.find('specific') |
161 | - | |
162 | - lista_alter_temp_node = [] | |
163 | - | |
164 | 159 | if self.specific is not None: |
165 | 160 | self.specific = self.__especificos[self.specific.text](subnode.leaves()[0]) |
166 | 161 | if self.specific is False: |
167 | 162 | self.has_rule = False |
168 | 163 | break |
169 | 164 | |
170 | - if newprop is not None: | |
171 | - self.lista_alter_temp_node.append([self.specific,newprop.text]) | |
172 | - ''' | |
173 | - if newtoken is not None and newpos is not None: | |
174 | - if newtokenpos is not None: | |
175 | - lista_merge = count * [None] | |
176 | - lista_merge[int(newpos.text)] = tupla[0] | |
177 | - lista_merge[int(newtokenpos.text)] = newtoken.text | |
178 | - merge_tokens = " ".join(lista_merge) | |
179 | - self.lista_iteracao_regra.append([merge_tokens, title.text]) | |
180 | - else: | |
181 | - self.lista_iteracao_regra.append([tupla[0] + " " + newtoken.text, title.text]) | |
182 | - | |
183 | - elif newpos is not None: | |
184 | - if newpos.text == "-1": | |
185 | - self.lista_corrigida.append(None) | |
165 | + # modelo: [['node_esq', ['token', 'ticket']],['node_dir', ['token', 'ticket']]] | |
166 | + for classe in rule.iter('class'): | |
167 | + title = classe.find('title') | |
168 | + if subnode.label() == title.text: | |
169 | + newpos = classe.find('newpos') | |
170 | + newprop = classe.find('newprop') | |
171 | + newtoken = classe.find('newtoken') | |
172 | + newtokenpos = classe.find('newtokenpos') | |
173 | + | |
174 | + | |
175 | + self.count_iteracao_regra += 1 | |
176 | + | |
177 | + if self.specific is not None: | |
178 | + self.specific = self.__especificos[self.specific.text](subnode.leaves()[0]) | |
179 | + if self.specific is False: | |
180 | + self.has_rule = False | |
181 | + break | |
182 | + | |
183 | + if newprop is not None and newtoken is not None: | |
184 | + if newtokenpos is not None and newtokenpos.text == "0": | |
185 | + self.alteracoes_nao_implementadas[self.count_iteracao_regra].append([newtoken.text + "_" + self.specific, newprop.text]) | |
186 | + else: | |
187 | + self.alteracoes_nao_implementadas[self.count_iteracao_regra].append([self.specific + "_" + newtoken.text, newprop.text]) | |
186 | 188 | continue |
187 | - else: | |
188 | - self.lista_iteracao_regra[int(newpos.text)] = tupla | |
189 | - | |
190 | - elif newtoken is not None: | |
191 | - tokenAnterior = self.lista_iteracao_regra[self.count_iteracao_regra][0] | |
192 | - ticketAnterior = self.lista_iteracao_regra[self.count_iteracao_regra][1] | |
193 | - if newtokenpos is not None and newtokenpos.text == "0": | |
194 | - self.lista_iteracao_regra[self.count_iteracao_regra] = [newtoken.text + " " + tokenAnterior, ticketAnterior] | |
195 | - else: | |
196 | - self.lista_iteracao_regra[self.count_iteracao_regra] = [tokenAnterior + " " + newtoken.text, ticketAnterior] | |
197 | - ''' | |
198 | - return p_arvore | |
189 | + | |
190 | + elif newprop is not None: | |
191 | + self.alteracoes_nao_implementadas[self.count_iteracao_regra].append([self.specific,newprop.text]) | |
192 | + | |
193 | + if newtoken is not None and newpos is not None: | |
194 | + if newtokenpos is not None: | |
195 | + lista_merge = count * [None] | |
196 | + lista_merge[int(newpos.text)] = subnode.leaves()[0] | |
197 | + lista_merge[int(newtokenpos.text)] = newtoken.text | |
198 | + merge_tokens = "_".join(lista_merge) | |
199 | + self.alteracoes_nao_implementadas[self.count_iteracao_regra].append([merge_tokens, title.text]) | |
200 | + else: | |
201 | + self.alteracoes_nao_implementadas[self.count_iteracao_regra].append([subnode.leaves()[0] + "_" + newtoken.text, title.text]) | |
202 | + | |
203 | + elif newpos is not None: | |
204 | + if newpos.text == "-1": | |
205 | + alteracoes_nao_implementadas[self.count_iteracao_regra].append(None) | |
206 | + continue | |
207 | + else: | |
208 | + #TODO | |
209 | + if int(newpos.text) == 0: | |
210 | + self.alteracoes_nao_implementadas[int(newpos.text)] = subnode | |
211 | + | |
212 | + elif newtoken is not None: | |
213 | + token_anterior = self.lista_iteracao_regra[self.count_iteracao_regra][0] | |
214 | + ticket_anterior = self.lista_iteracao_regra[self.count_iteracao_regra][1] | |
215 | + if newtokenpos is not None and newtokenpos.text == "0": | |
216 | + self.lista_iteracao_regra[self.count_iteracao_regra] = [newtoken.text + " " + token_anterior, ticket_anterior] | |
217 | + else: | |
218 | + self.lista_iteracao_regra[self.count_iteracao_regra] = [token_anterior + " " + newtoken.text, ticket_anterior] | |
219 | + | |
220 | + if self.has_rule: | |
221 | + print self.alteracoes_nao_implementadas[0] | |
222 | + self.lista_corrigida.append(filter(None, self.lista_iteracao_regra)[0]) | |
223 | + break | |
224 | + | |
225 | + return self.converter_arv_para_lista(p_arvore) | |
199 | 226 | |
200 | 227 | def adaptar_regras_morfo_arvore(self, lista, arvore): |
201 | 228 | lista_pos_arv = [] |
... | ... | @@ -207,20 +234,59 @@ class AplicaRegras(object): |
207 | 234 | lista_pos_arv.append(node[0]) |
208 | 235 | morfo = self.aplicar_regras_morfo(lista, sint=True) |
209 | 236 | for i in range(0, len(morfo)): |
237 | + arv_ticket = arvore[lista_pos_arv[i]].label() | |
238 | + arv_token = arvore[lista_pos_arv[i]][0] | |
210 | 239 | if morfo[i] is None: |
211 | 240 | arvore[lista_pos_arv[i][:-1]] = None |
212 | - else: | |
241 | + elif arv_token != morfo[i][0] and arv_ticket != morfo[i][1]: | |
242 | + arvore[lista_pos_arv[i]][0] = morfo[i][0] | |
213 | 243 | arvore[lista_pos_arv[i]].set_label(self.corrigir_anotacao(morfo[i][1])) |
244 | + elif arv_token != morfo[i][0]: | |
214 | 245 | arvore[lista_pos_arv[i]][0] = morfo[i][0] |
246 | + elif arv_ticket != morfo[i][1]: | |
247 | + arvore[lista_pos_arv[i]].set_label(self.corrigir_anotacao(morfo[i][1])) | |
248 | + else: | |
249 | + continue | |
250 | + | |
215 | 251 | nodes_none = tgrep_positions(arvore, 'None') |
216 | 252 | for node in nodes_none: |
217 | 253 | arvore[node[:-1]].remove(None) |
218 | 254 | |
255 | + def converter_arv_para_lista(self, arvore): | |
256 | + folhas = arvore.leaves() | |
257 | + lista_nodes = [] | |
258 | + for folha in folhas: | |
259 | + pos = tgrep_positions(arvore, folha) | |
260 | + node = arvore[pos[0][:-1]] | |
261 | + #decode node[0] | |
262 | + lista_nodes.append([node[0], self.corrigir_anotacao(node.label())]) | |
263 | + return lista_nodes | |
264 | + | |
265 | + | |
266 | + def criar_ptree(self, s): | |
267 | + all_ptrees = [] | |
268 | + ptree = ParentedTree.convert(Tree.fromstring(s)) | |
269 | + all_ptrees.extend(t for t in ptree.subtrees() | |
270 | + if isinstance(t, Tree)) | |
271 | + return ptree | |
272 | + | |
273 | + def separar_new_tokens(self, lista): | |
274 | + for index, tupla in enumerate(lista): | |
275 | + if '_' in tupla[0]: | |
276 | + if 'VB' in tupla[1]: | |
277 | + token_split = tupla[0].split('_') | |
278 | + tupla[0] = token_split[0] | |
279 | + lista.append([token_split[1],'NTK']) | |
280 | + else: | |
281 | + token_split = tupla[0].split('_') | |
282 | + tupla[0] = token_split[0] | |
283 | + lista.insert(index+1, [token_split[1],'NTK']) | |
284 | + | |
219 | 285 | def corrigir_anotacao(self, anotacao): |
220 | 286 | split = anotacao.split('_') |
221 | 287 | for i in range(0, len(split)): |
222 | 288 | split[i] = split[i].replace('-','_') |
223 | - return "-".join(split) | |
289 | + return "-".join(split).encode('utf-8') | |
224 | 290 | |
225 | 291 | def separar_regra(self, regra): |
226 | 292 | split = regra.split("(") |
... | ... | @@ -283,9 +349,7 @@ class AplicaRegras(object): |
283 | 349 | |
284 | 350 | if tag[-2:] == "-P": |
285 | 351 | singular = self.analisar_plural(token) |
286 | - nova_lista.append([singular,tag]) | |
287 | - else: | |
288 | - nova_lista.append(it.get_token()) | |
352 | + lista[it.get_count()][0] = singular | |
289 | 353 | |
290 | 354 | if num: return self.converter_extenso(nova_lista) |
291 | 355 | return nova_lista |
... | ... | @@ -340,4 +404,4 @@ class AplicaRegras(object): |
340 | 404 | lista[i[0]] = [ext, "NUM"] |
341 | 405 | |
342 | 406 | deque((list.pop(lista, i) for i in sorted(index_deleted, reverse=True)), maxlen=0) |
343 | 407 | - return lista |
408 | + return lista | |
344 | 409 | \ No newline at end of file | ... | ... |
src/new/PortGlosa.py
... | ... | @@ -1,28 +0,0 @@ |
1 | -#!/usr/bin/python | |
2 | -# -*- coding: utf-8 -*- | |
3 | - | |
4 | -#Autor: Erickson Silva | |
5 | -#Email: <erickson.silva@lavid.ufpb.br> <ericksonsilva@live.com> | |
6 | - | |
7 | -#LAViD - Laboratório de Aplicações de Vídeo Digital | |
8 | - | |
9 | - | |
10 | - | |
11 | -from TraduzSentencas import * | |
12 | - | |
13 | - | |
14 | -def traduz(texto): | |
15 | - try: | |
16 | - texto_codificado = texto.decode("UTF-8") | |
17 | - except: | |
18 | - texto_codificado = texto.decode("ISO-8859-1") | |
19 | - | |
20 | - glosa = iniciar_traducao(texto_codificado) | |
21 | - if glosa == "": | |
22 | - return "selecione um texto" | |
23 | - return glosa.encode("utf-8") | |
24 | - | |
25 | - | |
26 | -def help(): | |
27 | - #TODO: Adicionar um pequeno tuto aqui | |
28 | - print "Help" |
src/new/TraduzSentencas.py
... | ... | @@ -10,32 +10,47 @@ import alexp |
10 | 10 | from AplicaSinonimos import * |
11 | 11 | from AplicaRegras import * |
12 | 12 | |
13 | +aplic_sinonimos = AplicaSinonimos() | |
14 | +aplic_regras = AplicaRegras() | |
13 | 15 | |
16 | + | |
17 | +def traduz(texto): | |
18 | + try: | |
19 | + texto_codificado = texto.decode("utf-8") | |
20 | + except: | |
21 | + texto_codificado = texto.decode("iso-8859-1") | |
22 | + glosa = iniciar_traducao(texto_codificado) | |
23 | + if glosa: return glosa | |
24 | + return "selecione um texto" | |
25 | + | |
14 | 26 | def iniciar_traducao(texto): |
15 | - texto_quebrado = texto.split(".") | |
27 | + texto_quebrado = texto.lower().split(".") | |
16 | 28 | texto_traduzido = [] |
17 | 29 | for sentenca in texto_quebrado: |
18 | 30 | if len(sentenca) > 0 and sentenca != " ": |
19 | - texto_traduzido.append(gerar_analise(sentenca)) | |
31 | + analise = gerar_analise(sentenca) | |
32 | + texto_traduzido.append(analise) | |
20 | 33 | try: |
21 | 34 | return " ".join(texto_traduzido) |
22 | 35 | except: |
23 | 36 | return "" |
24 | 37 | |
25 | 38 | def gerar_analise(sentenca): |
26 | - aplic_sinonimos = AplicaSinonimos() | |
27 | - aplic_regras = AplicaRegras() | |
28 | - | |
29 | - analise = None | |
30 | 39 | try: |
31 | - analise = alexp.run(sentenca) | |
32 | - except ValueError: | |
33 | - # TODO: Permitir acentos na sentença | |
34 | - analise = None | |
35 | - | |
36 | - morfologica = alexp.getAnaliseMorfologica() | |
37 | - if (isinstance(analise,type(None))): | |
38 | - analise = aplic_regras.aplicar_regras_morfo(morfologica) | |
40 | + analise_sintatica = alexp.run(sentenca) | |
41 | + except: | |
42 | + analise_sintatica = None | |
43 | + | |
44 | + analise_morfologica = alexp.getAnaliseMorfologica() | |
45 | + if (isinstance(analise_sintatica,type(None))): | |
46 | + regras_aplicadas = aplic_regras.aplicar_regras_morfo(analise_morfologica) | |
39 | 47 | else: |
40 | - analise = aplic_regras.aplicar_regras_sint(morfologica, analise) | |
41 | - return aplic_sinonimos.aplicar_sinonimos(analise) | |
42 | 48 | \ No newline at end of file |
49 | + regras_aplicadas = aplic_regras.aplicar_regras_sint(analise_morfologica, analise_sintatica) | |
50 | + | |
51 | + aplic_regras.separar_new_tokens(regras_aplicadas) | |
52 | + sinonimos_aplicados = aplic_sinonimos.aplicar_sinonimos(regras_aplicadas) | |
53 | + return sinonimos_aplicados.encode('utf-8') | |
54 | + | |
55 | +def help(): | |
56 | + #TODO: Adicionar um pequeno tuto aqui | |
57 | + print "Help" | |
43 | 58 | \ No newline at end of file | ... | ... |