TraduzSentencas.py 3.85 KB
	#!/usr/bin/python
# -*- coding: utf-8 -*-

#Autor: Erickson Silva 
#Email: <erickson.silva@lavid.ufpb.br> <ericksonsilva@live.com>

#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