Commit 49730dbc3a07a60bdc7582877bc1aa972a6bae72
1 parent
6b0d3ff9
Exists in
master
and in
1 other branch
Adiciona flag para retornar taxa de qualidade de tradução
Showing
4 changed files
with
64 additions
and
25 deletions
Show diff stats
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 | ... | ... |