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