Commit 49730dbc3a07a60bdc7582877bc1aa972a6bae72

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

Adiciona flag para retornar taxa de qualidade de tradução

src/AplicaRegras.py
@@ -408,7 +408,8 @@ class AplicaRegras(object): @@ -408,7 +408,8 @@ class AplicaRegras(object):
408 except: 408 except:
409 pass 409 pass
410 410
411 - return " ".join([x[0] for x in lista_simplificada]) 411 + #return " ".join([x[0] for x in lista_simplificada])
  412 + return lista_simplificada
412 413
413 414
414 def analisar_plural(self, token): 415 def analisar_plural(self, token):
src/PortGlosa.py
@@ -14,43 +14,49 @@ from LerDicionarios import * @@ -14,43 +14,49 @@ from LerDicionarios import *
14 14
15 tradutor = TraduzSentencas() 15 tradutor = TraduzSentencas()
16 dicionario = LerDicionarios() 16 dicionario = LerDicionarios()
  17 +taxas = []
17 18
18 -def traduzir(texto, threads=False): 19 +def traduzir(texto, threads=False, taxa_qualidade=False):
19 if texto.isspace() or texto == "": 20 if texto.isspace() or texto == "":
20 return "ESCOLHER TEXTO CERTO" 21 return "ESCOLHER TEXTO CERTO"
21 22
22 elif threads: 23 elif threads:
23 - return iniciar_com_threads(texto) 24 + return iniciar_com_threads(texto, taxa_qualidade)
24 25
25 else: 26 else:
26 - return iniciar_sem_threads(texto) 27 + return iniciar_sem_threads(texto, taxa_qualidade)
27 28
28 -def iniciar_com_threads(texto): 29 +def iniciar_com_threads(texto, taxa_qualidade):
29 texto_quebrado = quebrar_texto(texto) 30 texto_quebrado = quebrar_texto(texto)
30 num_threads = len(texto_quebrado) 31 num_threads = len(texto_quebrado)
31 - texto_traduzido = [] 32 + saidas = []
32 threads = [] 33 threads = []
33 34
34 for i in range(num_threads): 35 for i in range(num_threads):
35 if texto_quebrado[i] > 0 and texto_quebrado[i] != " ": 36 if texto_quebrado[i] > 0 and texto_quebrado[i] != " ":
36 - threads.insert(i, ThreadTradutor(texto_quebrado[i])) 37 + threads.insert(i, ThreadTradutor(texto_quebrado[i],taxa_qualidade))
37 threads[i].start() 38 threads[i].start()
38 for i in range(num_threads): 39 for i in range(num_threads):
39 threads[i].join() 40 threads[i].join()
40 - texto_traduzido.append(threads[i].obter_glosa()) 41 + saidas.append(threads[i].obter_glosa())
  42 +
  43 + if taxa_qualidade:
  44 + return gerar_taxa_qualidade(saidas)
41 45
42 try: 46 try:
43 - return " ".join(texto_traduzido) 47 + return " ".join(saidas)
44 except: 48 except:
45 return None 49 return None
46 50
47 -def iniciar_sem_threads(texto): 51 +def iniciar_sem_threads(texto, taxa_qualidade):
48 texto_quebrado = quebrar_texto(texto) 52 texto_quebrado = quebrar_texto(texto)
49 - texto_traduzido = [] 53 + saidas = []
50 for texto in texto_quebrado: 54 for texto in texto_quebrado:
51 - glosa = tradutor.iniciar_traducao(texto)  
52 - texto_traduzido.append(glosa)  
53 - return " ".join(texto_traduzido) 55 + saida = tradutor.iniciar_traducao(texto, taxa_qualidade)
  56 + saidas.append(saida)
  57 + if taxa_qualidade:
  58 + return gerar_taxa_qualidade(saidas)
  59 + return " ".join(saidas)
54 60
55 def quebrar_texto(texto): 61 def quebrar_texto(texto):
56 if '.' not in texto: 62 if '.' not in texto:
@@ -69,9 +75,24 @@ def quebrar_texto(texto): @@ -69,9 +75,24 @@ def quebrar_texto(texto):
69 lista_texto = [] 75 lista_texto = []
70 continue 76 continue
71 if lista_texto: 77 if lista_texto:
72 - sentencas.append( " ".join(lista_texto)) 78 + sentencas.append(" ".join(lista_texto))
73 return sentencas 79 return sentencas
74 80
  81 +def gerar_taxa_qualidade(lista_saidas):
  82 + soma_taxas = 0
  83 + quant_analise_sintatica = 0
  84 + glosas = []
  85 + for saida in lista_saidas:
  86 + glosas.append(saida['glosa'])
  87 + soma_taxas += saida['taxa']
  88 + if saida['sintatica'] is True:
  89 + quant_analise_sintatica += 1
  90 +
  91 + taxa_sintatica = (float(quant_analise_sintatica)/len(lista_saidas)) * 0.20
  92 + taxa_sentenca = (float(soma_taxas)/len(lista_saidas)) * 0.80
  93 + return {'glosa':" ".join(glosas), 'taxa_qualidade': float("%.2f" % (taxa_sintatica+taxa_sentenca))}
  94 +
  95 +
75 def ajuda(): 96 def ajuda():
76 #TODO: Adicionar um pequeno tuto aqui 97 #TODO: Adicionar um pequeno tuto aqui
77 print "Help" 98 print "Help"
src/ThreadTradutor.py
@@ -12,7 +12,7 @@ from threading import Thread @@ -12,7 +12,7 @@ from threading import Thread
12 class ThreadTradutor(Thread): 12 class ThreadTradutor(Thread):
13 '''Thread que inicia uma tradução''' 13 '''Thread que inicia uma tradução'''
14 14
15 - def __init__(self, sentenca): 15 + def __init__(self, sentenca, taxa):
16 ''' Recebe o texto a ser traduzido e o atribui a uma variável. 16 ''' Recebe o texto a ser traduzido e o atribui a uma variável.
17 Além disso, instancia variável que será armazenada a glosa e a classe responsável pelo processo de tradução. 17 Além disso, instancia variável que será armazenada a glosa e a classe responsável pelo processo de tradução.
18 ''' 18 '''
@@ -20,11 +20,12 @@ class ThreadTradutor(Thread): @@ -20,11 +20,12 @@ class ThreadTradutor(Thread):
20 self.sentenca = sentenca 20 self.sentenca = sentenca
21 self.glosa = "" 21 self.glosa = ""
22 self.tradutor = TraduzSentencas() 22 self.tradutor = TraduzSentencas()
  23 + self.taxa_qualidade = taxa
23 24
24 def run(self): 25 def run(self):
25 ''' Metódo executado ao 'startar' a Thread. É responsável por iniciar a tradução passando o texto como parâmetro. 26 ''' Metódo executado ao 'startar' a Thread. É responsável por iniciar a tradução passando o texto como parâmetro.
26 ''' 27 '''
27 - self.glosa = self.tradutor.iniciar_traducao(self.sentenca) 28 + self.glosa = self.tradutor.iniciar_traducao(self.sentenca, self.taxa_qualidade)
28 29
29 def obter_glosa(self): 30 def obter_glosa(self):
30 ''' Obtém a glosa após o processo de tradução. 31 ''' Obtém a glosa após o processo de tradução.
src/TraduzSentencas.py
1 -#!/usr/bin/python 1 + #!/usr/bin/python
2 # -*- coding: utf-8 -*- 2 # -*- coding: utf-8 -*-
3 3
4 #Autor: Erickson Silva 4 #Autor: Erickson Silva
@@ -23,36 +23,52 @@ class TraduzSentencas(object): @@ -23,36 +23,52 @@ class TraduzSentencas(object):
23 # format='%(asctime)s - %(levelname)s:\n\n%(message)s\n\n\n##############################################\n\n', 23 # format='%(asctime)s - %(levelname)s:\n\n%(message)s\n\n\n##############################################\n\n',
24 # level=logging.ERROR) 24 # level=logging.ERROR)
25 25
26 - def iniciar_traducao(self, sentenca): 26 + def iniciar_traducao(self, sentenca, taxa=False):
27 '''Metódo responsável por executar todos componentes necessários para a geração da glosa. 27 '''Metódo responsável por executar todos componentes necessários para a geração da glosa.
28 ''' 28 '''
29 try: 29 try:
  30 + has_sintatica = True
30 analise_sintatica = alexp.run(sentenca) 31 analise_sintatica = alexp.run(sentenca)
31 except Exception as ex: 32 except Exception as ex:
32 #self.salvar_log(str(traceback.format_exc())) 33 #self.salvar_log(str(traceback.format_exc()))
33 analise_sintatica = None 34 analise_sintatica = None
  35 + has_sintatica = False
34 36
35 analise_morfologica = alexp.getAnaliseMorfologica() 37 analise_morfologica = alexp.getAnaliseMorfologica()
36 38
37 if (isinstance(analise_sintatica,type(None))): 39 if (isinstance(analise_sintatica,type(None))):
38 - #print "# ANÁLISE MORFOLÓGICA"  
39 regras_aplicadas = self.aplic_regras.aplicar_regras_morfo(analise_morfologica) 40 regras_aplicadas = self.aplic_regras.aplicar_regras_morfo(analise_morfologica)
40 else: 41 else:
41 - #print "# ANÁLISE SINTÁTICA"  
42 try: 42 try:
43 regras_aplicadas = self.aplic_regras.aplicar_regras_sint(analise_morfologica, analise_sintatica) 43 regras_aplicadas = self.aplic_regras.aplicar_regras_sint(analise_morfologica, analise_sintatica)
44 except: 44 except:
45 regras_aplicadas = self.aplic_regras.aplicar_regras_morfo(analise_morfologica) 45 regras_aplicadas = self.aplic_regras.aplicar_regras_morfo(analise_morfologica)
46 46
47 sentenca_corrigida = self.aplic_regras.simplificar_sentenca(regras_aplicadas) 47 sentenca_corrigida = self.aplic_regras.simplificar_sentenca(regras_aplicadas)
48 - sentenca_sem_acentos = self.aplic_regras.remover_acento(sentenca_corrigida) 48 + glosa = " ".join([x[0] for x in sentenca_corrigida])
  49 + glosa_sem_acentos = self.aplic_regras.remover_acento(glosa).upper().encode('utf-8')
49 50
50 - if sentenca_sem_acentos:  
51 - return sentenca_sem_acentos.upper().encode('utf-8') 51 + if glosa_sem_acentos:
  52 + if taxa:
  53 + taxa_qualidade = self.gerar_metrica_qualidade(sentenca_corrigida)
  54 + return {'glosa':glosa_sem_acentos, 'taxa':taxa_qualidade, 'sintatica':has_sintatica}
  55 + return glosa_sem_acentos
52 return "TEXTO ERRADO ESCOLHER OUTRO" 56 return "TEXTO ERRADO ESCOLHER OUTRO"
53 57
54 def salvar_log(self, erro): 58 def salvar_log(self, erro):
55 '''Salva traceback de uma excessão do analisador sintático 59 '''Salva traceback de uma excessão do analisador sintático
56 ''' 60 '''
57 logging.error(erro) 61 logging.error(erro)
58 - 62 +
  63 + def gerar_metrica_qualidade(self, lista):
  64 + #TODO: resolver path do arquivo
  65 + arqSinais = open("sinais.txt", "r").read().split()
  66 + quantSinaisTotal = len(lista)
  67 + quantSinaisEncontradas = 0
  68 + for x in lista:
  69 + if x[0].upper()+".anim" in arqSinais:
  70 + quantSinaisEncontradas += 1
  71 + else:
  72 + if x[1] == "NPR":
  73 + quantSinaisTotal-=1
  74 + return float(quantSinaisEncontradas)/quantSinaisTotal