diff --git a/src/AplicaRegras.py b/src/AplicaRegras.py index 26e1888..4a78a65 100644 --- a/src/AplicaRegras.py +++ b/src/AplicaRegras.py @@ -408,7 +408,8 @@ class AplicaRegras(object): except: pass - return " ".join([x[0] for x in lista_simplificada]) + #return " ".join([x[0] for x in lista_simplificada]) + return lista_simplificada def analisar_plural(self, token): diff --git a/src/PortGlosa.py b/src/PortGlosa.py index 4f09626..463f525 100644 --- a/src/PortGlosa.py +++ b/src/PortGlosa.py @@ -14,43 +14,49 @@ from LerDicionarios import * tradutor = TraduzSentencas() dicionario = LerDicionarios() +taxas = [] -def traduzir(texto, threads=False): +def traduzir(texto, threads=False, taxa_qualidade=False): if texto.isspace() or texto == "": return "ESCOLHER TEXTO CERTO" elif threads: - return iniciar_com_threads(texto) + return iniciar_com_threads(texto, taxa_qualidade) else: - return iniciar_sem_threads(texto) + return iniciar_sem_threads(texto, taxa_qualidade) -def iniciar_com_threads(texto): +def iniciar_com_threads(texto, taxa_qualidade): texto_quebrado = quebrar_texto(texto) num_threads = len(texto_quebrado) - texto_traduzido = [] + saidas = [] threads = [] for i in range(num_threads): if texto_quebrado[i] > 0 and texto_quebrado[i] != " ": - threads.insert(i, ThreadTradutor(texto_quebrado[i])) + threads.insert(i, ThreadTradutor(texto_quebrado[i],taxa_qualidade)) threads[i].start() for i in range(num_threads): threads[i].join() - texto_traduzido.append(threads[i].obter_glosa()) + saidas.append(threads[i].obter_glosa()) + + if taxa_qualidade: + return gerar_taxa_qualidade(saidas) try: - return " ".join(texto_traduzido) + return " ".join(saidas) except: return None -def iniciar_sem_threads(texto): +def iniciar_sem_threads(texto, taxa_qualidade): texto_quebrado = quebrar_texto(texto) - texto_traduzido = [] + saidas = [] for texto in texto_quebrado: - glosa = tradutor.iniciar_traducao(texto) - texto_traduzido.append(glosa) - return " ".join(texto_traduzido) + saida = tradutor.iniciar_traducao(texto, taxa_qualidade) + saidas.append(saida) + if taxa_qualidade: + return gerar_taxa_qualidade(saidas) + return " ".join(saidas) def quebrar_texto(texto): if '.' not in texto: @@ -69,9 +75,24 @@ def quebrar_texto(texto): lista_texto = [] continue if lista_texto: - sentencas.append( " ".join(lista_texto)) + sentencas.append(" ".join(lista_texto)) return sentencas +def gerar_taxa_qualidade(lista_saidas): + soma_taxas = 0 + quant_analise_sintatica = 0 + glosas = [] + for saida in lista_saidas: + glosas.append(saida['glosa']) + soma_taxas += saida['taxa'] + if saida['sintatica'] is True: + quant_analise_sintatica += 1 + + taxa_sintatica = (float(quant_analise_sintatica)/len(lista_saidas)) * 0.20 + taxa_sentenca = (float(soma_taxas)/len(lista_saidas)) * 0.80 + return {'glosa':" ".join(glosas), 'taxa_qualidade': float("%.2f" % (taxa_sintatica+taxa_sentenca))} + + def ajuda(): #TODO: Adicionar um pequeno tuto aqui print "Help" diff --git a/src/ThreadTradutor.py b/src/ThreadTradutor.py index 7b4dbd8..1ec7a9c 100644 --- a/src/ThreadTradutor.py +++ b/src/ThreadTradutor.py @@ -12,7 +12,7 @@ from threading import Thread class ThreadTradutor(Thread): '''Thread que inicia uma tradução''' - def __init__(self, sentenca): + def __init__(self, sentenca, taxa): ''' Recebe o texto a ser traduzido e o atribui a uma variável. Além disso, instancia variável que será armazenada a glosa e a classe responsável pelo processo de tradução. ''' @@ -20,11 +20,12 @@ class ThreadTradutor(Thread): self.sentenca = sentenca self.glosa = "" self.tradutor = TraduzSentencas() + self.taxa_qualidade = taxa def run(self): ''' Metódo executado ao 'startar' a Thread. É responsável por iniciar a tradução passando o texto como parâmetro. ''' - self.glosa = self.tradutor.iniciar_traducao(self.sentenca) + self.glosa = self.tradutor.iniciar_traducao(self.sentenca, self.taxa_qualidade) def obter_glosa(self): ''' Obtém a glosa após o processo de tradução. diff --git a/src/TraduzSentencas.py b/src/TraduzSentencas.py index 7938891..1b7da1e 100644 --- a/src/TraduzSentencas.py +++ b/src/TraduzSentencas.py @@ -1,4 +1,4 @@ -#!/usr/bin/python + #!/usr/bin/python # -*- coding: utf-8 -*- #Autor: Erickson Silva @@ -23,36 +23,52 @@ class TraduzSentencas(object): # format='%(asctime)s - %(levelname)s:\n\n%(message)s\n\n\n##############################################\n\n', # level=logging.ERROR) - def iniciar_traducao(self, sentenca): + def iniciar_traducao(self, sentenca, taxa=False): '''Metódo responsável por executar todos componentes necessários para a geração da glosa. ''' try: + has_sintatica = True analise_sintatica = alexp.run(sentenca) except Exception as ex: #self.salvar_log(str(traceback.format_exc())) analise_sintatica = None + has_sintatica = False analise_morfologica = alexp.getAnaliseMorfologica() if (isinstance(analise_sintatica,type(None))): - #print "# ANÁLISE MORFOLÓGICA" regras_aplicadas = self.aplic_regras.aplicar_regras_morfo(analise_morfologica) else: - #print "# ANÁLISE SINTÁTICA" try: regras_aplicadas = self.aplic_regras.aplicar_regras_sint(analise_morfologica, analise_sintatica) except: regras_aplicadas = self.aplic_regras.aplicar_regras_morfo(analise_morfologica) sentenca_corrigida = self.aplic_regras.simplificar_sentenca(regras_aplicadas) - sentenca_sem_acentos = self.aplic_regras.remover_acento(sentenca_corrigida) + glosa = " ".join([x[0] for x in sentenca_corrigida]) + glosa_sem_acentos = self.aplic_regras.remover_acento(glosa).upper().encode('utf-8') - if sentenca_sem_acentos: - return sentenca_sem_acentos.upper().encode('utf-8') + if glosa_sem_acentos: + if taxa: + taxa_qualidade = self.gerar_metrica_qualidade(sentenca_corrigida) + return {'glosa':glosa_sem_acentos, 'taxa':taxa_qualidade, 'sintatica':has_sintatica} + return glosa_sem_acentos return "TEXTO ERRADO ESCOLHER OUTRO" def salvar_log(self, erro): '''Salva traceback de uma excessão do analisador sintático ''' logging.error(erro) - + + def gerar_metrica_qualidade(self, lista): + #TODO: resolver path do arquivo + arqSinais = open("sinais.txt", "r").read().split() + quantSinaisTotal = len(lista) + quantSinaisEncontradas = 0 + for x in lista: + if x[0].upper()+".anim" in arqSinais: + quantSinaisEncontradas += 1 + else: + if x[1] == "NPR": + quantSinaisTotal-=1 + return float(quantSinaisEncontradas)/quantSinaisTotal -- libgit2 0.21.2