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 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
... ...