Simplificador.py 4.13 KB
#!/usr/bin/python
# -*- coding: utf-8 -*-

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

from WorkCSV import *
from Iterator import *
from StringAux import *

class Simplificador(object):

	# inicializa todos as variaveis
	def __init__(self):	
		self.it = Iterator()
		self.__csv = WorkCSV()
		self.__dicInf = {}
		self.__dicSin = {}
		self.__dicWords = {}
		self.__dic2Gen = {}
		self.__dicTemVerbs = {}
		self.executeWorkCSV()	

	# retira artigos e preposicoes; passa verbos para infinitivo e verificar se há sinonimos
	def simplificar(self, texto):
		self.__ts = []
		self.it.load(texto)
		self.__verb = False
		self.__adv = False;
		self.__countVerb = 0
		self.__countAdv = 0
		countWords = 0
		while(self.it.hasNext()):
			w = self.auxConvert(self.it.getAtualW())
			t = self.it.getAtualT()
			self.__b = False
			if self.__dicWords.has_key(t) == False: # verifica se nao eh artigo/preposicao
				wu = w.upper() 						# deixa o token maiusculo
				#if t[:2] == "VB":
				if t == "VB-P" or t == "VB-D" or t == "VB-R":
					self.__verb = True
					self.__countVerb += 1
				if t[:3] == "ADV":
					self.__adv = True
					self.__countAdv += 1
				if self.__dicInf.has_key(wu):		# verifica se ha um verbo infinitivo desse token
					sAux = self.__dicInf[wu]		# se sim, adiciona numa string aux
					if self.__dicSin.has_key(sAux):	# verifica se ha um sinonimo para esse verbo infinitivo
						self.__ts.append([self.__dicSin[sAux],t]) # se sim, entao adiciona na lista
						self.__b = True          
					else:					
						self.__ts.append([sAux,t])  # caso contrario, adiciona so o verbo infinitivo msm
						self.__b = True
				if self.__b == False and self.__dicSin.has_key(wu):	# verifica se nao foi encontrado verbo infinitivo e se ha sinonimo
					self.__ts.append([self.__dicSin[wu],t]) # adiciona na o sinonimo lista
					self.__b = True   		

				if self.__dic2Gen.has_key(wu):
					del self.__ts[-1]
					lenTicket = len(self.it.getAntT())
					if ((self.__dicWords.has_key(self.it.getAntT())) and (self.it.getAntT()[lenTicket-1:] == "F") or (self.it.getAntT()[lenTicket-3:] == "F-P")):
						self.__ts.append(["MULHER " + wu,t])
					else:
						self.__ts.append(["HOMEM " + wu,t])
					self.__b = True          
				if self.__b == False:             	# verifica se nao encontrou nem verbo infinito ou sinonimo
					self.__ts.append([wu,t])
			countWords += 1
		self.it.reset()
		if self.__verb == True:
			return self.verbalAnalysis(self.__ts)
		return self.__ts

	# cria e recupera todos os dicionarios (verbos inf., sinonimos e artigos/preposicoes)
	def executeWorkCSV(self):
		self.__dicInf = self.__csv.getDicInf()
		self.__dicSin = self.__csv.getDicSin()
		self.__dicWords = self.__csv.getDicWords()
		self.__dic2Gen = self.__csv.getDic2Gen()
		self.__dicTemVerbs = self.__csv.getDicTemVerbs()

	# converte romano para numero/numero para palavra
	def auxConvert(self, t):
		try:
			txt = roman_to_int(t)
			return extenso(txt).decode("utf-8")		
		except:
			if t.isdigit():
				return extenso(t).decode("utf-8")
			return t


	def verbalAnalysis(self, lista):
		lv = []
		self.it.load(lista)
		hasFut = False
		hasPas = False
		count = 0
		while(self.it.hasNext()):
			w = self.it.getAtualW().upper()
			t = self.it.getAtualT()

			if(t[:3] == "ADV"):
				if (self.__dicTemVerbs.has_key(w)):
					self.it.reset()
					#print "ADV: retornou lista original"
					return lista
			
			if(t == "VB-P"):
				if (self.__countVerb > 1):
					count += 1
					#print "VB-P: Incrementou"
					if(count == self.__countVerb):
						#print "VB-P Adicionou " + w
						lv.append([w,t])
				else:
					#print "VB-P: retornou lista original"
					self.it.reset()
					return lista
			elif(t == "VB-D"):
				count += 1
				hasPas = True
				#print "VB-D: Incrementou"
				if(count == self.__countVerb):
					#print "VB-D Adicionou " + w
					lv.append([w,t])
			elif(t == "VB-R"):
				count += 1
				hasFut = True
				#print "VB-R: Incrementou"
				if(count == self.__countVerb):
					#print "VB-R Adicionou " + w
					lv.append([w,t])
			else:
				lv.append([w,t])	
		if (hasFut):
			lv.append(["FUTURO", "TVB"])
		elif (hasPas):
			lv.append(["PASSADO", "TVB"])
		self.it.reset()
		return lv