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