Commit 1bf3fe850db87d5824b2bad9a676f3295c574665

Authored by Erickson Silva
1 parent 1b580bd0
Exists in master and in 1 other branch devel

Remove PortGlosa e adiciona as funcionalidades no TraduzSentencas

src/new/AplicaRegras.py
@@ -41,11 +41,7 @@ class AplicaRegras(object): @@ -41,11 +41,7 @@ class AplicaRegras(object):
41 it = Iterator() 41 it = Iterator()
42 it.load(self.lista) 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 for morpho in self.__root.findall('morphological'): 45 for morpho in self.__root.findall('morphological'):
50 self.has_rule = False 46 self.has_rule = False
51 for rule in morpho.findall('rule'): # procura a tag rule 47 for rule in morpho.findall('rule'): # procura a tag rule
@@ -58,7 +54,6 @@ class AplicaRegras(object): @@ -58,7 +54,6 @@ class AplicaRegras(object):
58 try: 54 try:
59 self.lista_iteracoes = it.get_interval(count) 55 self.lista_iteracoes = it.get_interval(count)
60 it.skip(count-1) 56 it.skip(count-1)
61 - #self.quantidade_iter_pular = count-1  
62 except: 57 except:
63 continue 58 continue
64 59
@@ -89,7 +84,14 @@ class AplicaRegras(object): @@ -89,7 +84,14 @@ class AplicaRegras(object):
89 self.quantidade_iter_pular = 0 84 self.quantidade_iter_pular = 0
90 break 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 self.lista_iteracao_regra.append([self.specific,newprop.text]) 95 self.lista_iteracao_regra.append([self.specific,newprop.text])
94 96
95 if newtoken is not None and newpos is not None: 97 if newtoken is not None and newpos is not None:
@@ -97,10 +99,10 @@ class AplicaRegras(object): @@ -97,10 +99,10 @@ class AplicaRegras(object):
97 lista_merge = count * [None] 99 lista_merge = count * [None]
98 lista_merge[int(newpos.text)] = tupla[0] 100 lista_merge[int(newpos.text)] = tupla[0]
99 lista_merge[int(newtokenpos.text)] = newtoken.text 101 lista_merge[int(newtokenpos.text)] = newtoken.text
100 - merge_tokens = " ".join(lista_merge) 102 + merge_tokens = "_".join(lista_merge)
101 self.lista_iteracao_regra.append([merge_tokens, title.text]) 103 self.lista_iteracao_regra.append([merge_tokens, title.text])
102 else: 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 elif newpos is not None: 107 elif newpos is not None:
106 if newpos.text == "-1": 108 if newpos.text == "-1":
@@ -110,17 +112,15 @@ class AplicaRegras(object): @@ -110,17 +112,15 @@ class AplicaRegras(object):
110 self.lista_iteracao_regra[int(newpos.text)] = tupla 112 self.lista_iteracao_regra[int(newpos.text)] = tupla
111 113
112 elif newtoken is not None: 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 if newtokenpos is not None and newtokenpos.text == "0": 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 else: 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 if self.has_rule: 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 break 124 break
125 125
126 if (self.has_rule == False): 126 if (self.has_rule == False):
@@ -137,65 +137,92 @@ class AplicaRegras(object): @@ -137,65 +137,92 @@ class AplicaRegras(object):
137 for rule in morpho.findall('rule'): # procura a tag rule 137 for rule in morpho.findall('rule'): # procura a tag rule
138 nome_regra = self.corrigir_anotacao(rule.get('name')) 138 nome_regra = self.corrigir_anotacao(rule.get('name'))
139 regra = self.separar_regra(nome_regra) 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 self.specific = classe.find('specific') 158 self.specific = classe.find('specific')
161 -  
162 - lista_alter_temp_node = []  
163 -  
164 if self.specific is not None: 159 if self.specific is not None:
165 self.specific = self.__especificos[self.specific.text](subnode.leaves()[0]) 160 self.specific = self.__especificos[self.specific.text](subnode.leaves()[0])
166 if self.specific is False: 161 if self.specific is False:
167 self.has_rule = False 162 self.has_rule = False
168 break 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 continue 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 def adaptar_regras_morfo_arvore(self, lista, arvore): 227 def adaptar_regras_morfo_arvore(self, lista, arvore):
201 lista_pos_arv = [] 228 lista_pos_arv = []
@@ -207,20 +234,59 @@ class AplicaRegras(object): @@ -207,20 +234,59 @@ class AplicaRegras(object):
207 lista_pos_arv.append(node[0]) 234 lista_pos_arv.append(node[0])
208 morfo = self.aplicar_regras_morfo(lista, sint=True) 235 morfo = self.aplicar_regras_morfo(lista, sint=True)
209 for i in range(0, len(morfo)): 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 if morfo[i] is None: 239 if morfo[i] is None:
211 arvore[lista_pos_arv[i][:-1]] = None 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 arvore[lista_pos_arv[i]].set_label(self.corrigir_anotacao(morfo[i][1])) 243 arvore[lista_pos_arv[i]].set_label(self.corrigir_anotacao(morfo[i][1]))
  244 + elif arv_token != morfo[i][0]:
214 arvore[lista_pos_arv[i]][0] = morfo[i][0] 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 nodes_none = tgrep_positions(arvore, 'None') 251 nodes_none = tgrep_positions(arvore, 'None')
216 for node in nodes_none: 252 for node in nodes_none:
217 arvore[node[:-1]].remove(None) 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 def corrigir_anotacao(self, anotacao): 285 def corrigir_anotacao(self, anotacao):
220 split = anotacao.split('_') 286 split = anotacao.split('_')
221 for i in range(0, len(split)): 287 for i in range(0, len(split)):
222 split[i] = split[i].replace('-','_') 288 split[i] = split[i].replace('-','_')
223 - return "-".join(split) 289 + return "-".join(split).encode('utf-8')
224 290
225 def separar_regra(self, regra): 291 def separar_regra(self, regra):
226 split = regra.split("(") 292 split = regra.split("(")
@@ -283,9 +349,7 @@ class AplicaRegras(object): @@ -283,9 +349,7 @@ class AplicaRegras(object):
283 349
284 if tag[-2:] == "-P": 350 if tag[-2:] == "-P":
285 singular = self.analisar_plural(token) 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 if num: return self.converter_extenso(nova_lista) 354 if num: return self.converter_extenso(nova_lista)
291 return nova_lista 355 return nova_lista
@@ -340,4 +404,4 @@ class AplicaRegras(object): @@ -340,4 +404,4 @@ class AplicaRegras(object):
340 lista[i[0]] = [ext, "NUM"] 404 lista[i[0]] = [ext, "NUM"]
341 405
342 deque((list.pop(lista, i) for i in sorted(index_deleted, reverse=True)), maxlen=0) 406 deque((list.pop(lista, i) for i in sorted(index_deleted, reverse=True)), maxlen=0)
343 - return lista 407 - return lista
  408 + return lista
344 \ No newline at end of file 409 \ No newline at end of file
src/new/PortGlosa.py
@@ -1,28 +0,0 @@ @@ -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,32 +10,47 @@ import alexp
10 from AplicaSinonimos import * 10 from AplicaSinonimos import *
11 from AplicaRegras import * 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 def iniciar_traducao(texto): 26 def iniciar_traducao(texto):
15 - texto_quebrado = texto.split(".") 27 + texto_quebrado = texto.lower().split(".")
16 texto_traduzido = [] 28 texto_traduzido = []
17 for sentenca in texto_quebrado: 29 for sentenca in texto_quebrado:
18 if len(sentenca) > 0 and sentenca != " ": 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 try: 33 try:
21 return " ".join(texto_traduzido) 34 return " ".join(texto_traduzido)
22 except: 35 except:
23 return "" 36 return ""
24 37
25 def gerar_analise(sentenca): 38 def gerar_analise(sentenca):
26 - aplic_sinonimos = AplicaSinonimos()  
27 - aplic_regras = AplicaRegras()  
28 -  
29 - analise = None  
30 try: 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 else: 47 else:
40 - analise = aplic_regras.aplicar_regras_sint(morfologica, analise)  
41 - return aplic_sinonimos.aplicar_sinonimos(analise)  
42 \ No newline at end of file 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 \ No newline at end of file 58 \ No newline at end of file