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 408 except:
409 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 415 def analisar_plural(self, token):
... ...
src/PortGlosa.py
... ... @@ -14,43 +14,49 @@ from LerDicionarios import *
14 14  
15 15 tradutor = TraduzSentencas()
16 16 dicionario = LerDicionarios()
  17 +taxas = []
17 18  
18   -def traduzir(texto, threads=False):
  19 +def traduzir(texto, threads=False, taxa_qualidade=False):
19 20 if texto.isspace() or texto == "":
20 21 return "ESCOLHER TEXTO CERTO"
21 22  
22 23 elif threads:
23   - return iniciar_com_threads(texto)
  24 + return iniciar_com_threads(texto, taxa_qualidade)
24 25  
25 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 30 texto_quebrado = quebrar_texto(texto)
30 31 num_threads = len(texto_quebrado)
31   - texto_traduzido = []
  32 + saidas = []
32 33 threads = []
33 34  
34 35 for i in range(num_threads):
35 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 38 threads[i].start()
38 39 for i in range(num_threads):
39 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 46 try:
43   - return " ".join(texto_traduzido)
  47 + return " ".join(saidas)
44 48 except:
45 49 return None
46 50  
47   -def iniciar_sem_threads(texto):
  51 +def iniciar_sem_threads(texto, taxa_qualidade):
48 52 texto_quebrado = quebrar_texto(texto)
49   - texto_traduzido = []
  53 + saidas = []
50 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 61 def quebrar_texto(texto):
56 62 if '.' not in texto:
... ... @@ -69,9 +75,24 @@ def quebrar_texto(texto):
69 75 lista_texto = []
70 76 continue
71 77 if lista_texto:
72   - sentencas.append( " ".join(lista_texto))
  78 + sentencas.append(" ".join(lista_texto))
73 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 96 def ajuda():
76 97 #TODO: Adicionar um pequeno tuto aqui
77 98 print "Help"
... ...
src/ThreadTradutor.py
... ... @@ -12,7 +12,7 @@ from threading import Thread
12 12 class ThreadTradutor(Thread):
13 13 '''Thread que inicia uma tradução'''
14 14  
15   - def __init__(self, sentenca):
  15 + def __init__(self, sentenca, taxa):
16 16 ''' Recebe o texto a ser traduzido e o atribui a uma variável.
17 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 20 self.sentenca = sentenca
21 21 self.glosa = ""
22 22 self.tradutor = TraduzSentencas()
  23 + self.taxa_qualidade = taxa
23 24  
24 25 def run(self):
25 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 30 def obter_glosa(self):
30 31 ''' Obtém a glosa após o processo de tradução.
... ...
src/TraduzSentencas.py
1   -#!/usr/bin/python
  1 + #!/usr/bin/python
2 2 # -*- coding: utf-8 -*-
3 3  
4 4 #Autor: Erickson Silva
... ... @@ -23,36 +23,52 @@ class TraduzSentencas(object):
23 23 # format='%(asctime)s - %(levelname)s:\n\n%(message)s\n\n\n##############################################\n\n',
24 24 # level=logging.ERROR)
25 25  
26   - def iniciar_traducao(self, sentenca):
  26 + def iniciar_traducao(self, sentenca, taxa=False):
27 27 '''Metódo responsável por executar todos componentes necessários para a geração da glosa.
28 28 '''
29 29 try:
  30 + has_sintatica = True
30 31 analise_sintatica = alexp.run(sentenca)
31 32 except Exception as ex:
32 33 #self.salvar_log(str(traceback.format_exc()))
33 34 analise_sintatica = None
  35 + has_sintatica = False
34 36  
35 37 analise_morfologica = alexp.getAnaliseMorfologica()
36 38  
37 39 if (isinstance(analise_sintatica,type(None))):
38   - #print "# ANÁLISE MORFOLÓGICA"
39 40 regras_aplicadas = self.aplic_regras.aplicar_regras_morfo(analise_morfologica)
40 41 else:
41   - #print "# ANÁLISE SINTÁTICA"
42 42 try:
43 43 regras_aplicadas = self.aplic_regras.aplicar_regras_sint(analise_morfologica, analise_sintatica)
44 44 except:
45 45 regras_aplicadas = self.aplic_regras.aplicar_regras_morfo(analise_morfologica)
46 46  
47 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 56 return "TEXTO ERRADO ESCOLHER OUTRO"
53 57  
54 58 def salvar_log(self, erro):
55 59 '''Salva traceback de uma excessão do analisador sintático
56 60 '''
57 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
... ...