#!/usr/bin/python # -*- coding: utf-8 -*- #Autor: Erickson Silva #Email: #LAViD - Laboratório de Aplicações de Vídeo Digital from ClassificaSentencas import * from AplicaRegras import * from AplicaSinonimos import * import logging import logging.handlers import traceback import subprocess import re, string import getopt import sys class TraduzSentencas(object): '''Realiza a tradução do texto em português para glosa ''' def __init__(self): '''Instancia os aplicadores de regras e sinônimos. ''' self.classificador = ClassificaSentencas() self.aplic_regras = AplicaRegras() self.aplic_sin = AplicaSinonimos() self.check_level() 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 = self.classificador.iniciar_classificacao(sentenca) except Exception as ex: self.salvar_log(str(traceback.format_exc())) analise_sintatica = None has_sintatica = False analise_morfologica = self.classificador.obter_classificacao_morfologica() if (isinstance(analise_sintatica,type(None))): regras_aplicadas = self.aplic_regras.aplicar_regras_morfo(analise_morfologica) else: 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) #glosa = " ".join([x[0] for x in sentenca_corrigida]) if sentenca_corrigida: texto_com_sinonimos = self.aplic_sin.aplicar_sinonimos(sentenca_corrigida) if taxa: taxa_qualidade = self.gerar_metrica_qualidade(texto_com_sinonimos) return {'glosa':texto_com_sinonimos.upper().encode('utf-8'), 'taxa':taxa_qualidade, 'sintatica':has_sintatica} return texto_com_sinonimos.upper().encode('utf-8') return "TEXTO ERRADO ESCOLHER OUTRO" def salvar_log(self, erro): '''Salva traceback de uma excessão do analisador sintático ''' logger = logging.getLogger('error-feedback') logger.propagate = False logger.error(erro) def criar_logger_error(self): error_log = logging.getLogger('error-feedback') error_log.setLevel(logging.ERROR) ##print os.path.dirname(__file__) -- Salvar no direitorio do arquivo .py? error_handler = logging.handlers.RotatingFileHandler('/var/tmp/vlibras-translate.log', maxBytes=1024, backupCount=5) formatter = logging.Formatter('%(asctime)s - %(levelname)s:\n\n%(message)s\n\n\n##############################################\n\n') error_handler.setFormatter(formatter) error_log.addHandler(error_handler) def check_level(self): try: for opt in sys.argv[1:]: if "--log" in opt: self.set_level(opt[6:]) return except: pass self.desativar_logging() def set_level(self, level): numeric_level = getattr(logging, level.upper(), None) if not isinstance(numeric_level, int): raise ValueError('Nível de log inválido: %s' % level) logging.disable(logging.NOTSET) logging.getLogger().setLevel(numeric_level) if numeric_level == 40 or numeric_level == 10: self.criar_logger_error() def desativar_logging(self): logging.disable(logging.DEBUG) logging.disable(logging.INFO) logging.disable(logging.WARNING) logging.disable(logging.ERROR) logging.disable(logging.CRITICAL) 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