diff --git a/src/new/AplicaRegras.py b/src/new/AplicaRegras.py index 19d33ae..6e3c5be 100644 --- a/src/new/AplicaRegras.py +++ b/src/new/AplicaRegras.py @@ -6,18 +6,143 @@ #LAViD - Laboratório de Aplicações de Vídeo Digital +from collections import deque +import xml.etree.ElementTree as ET +from os.path import expanduser +import platform from LeitorDicionarios import * from Iterator import * from StringAux import * from ConversorExtenso import * -from collections import deque class AplicaRegras(object): # inicializa todos as variaveis def __init__(self): + + self.__root = self.getRoot() self.__dicionarios = LeitorDicionarios() + def getRoot(self): + + so = platform.system() + if so == 'Windows': + return ET.parse(expanduser("~")+'\\vlibras-translate\data\\regras.xml').getroot() + else: + return ET.parse(expanduser("~")+'/vlibras-translate/data/regras.xml').getroot() + + def aplicarRegrasMorpho(self, lista): + + self.__especificos = {"advt" : self.verificarAdvTempo, "v" : self.verificarVbInfinitivo, "x" : self.verificarPrepos, "c" : self.verificarSubs2Generos, "a" : self.verificarArtigo, "l" : self.verificarVbLigacao, "i": self.verificarAdvIntensidade, "vbi":"zero", "n":"zero", "abmn":"zero", "adji":"zero", "adjn":"zero", "advi":"zero"} + self.pularIteracoes = 0 + self.__tAux = [] + it = Iterator() + it.load(lista) + + while(it.hasNext()): + if self.pularIteracoes > 0: + self.pularIteracoes-=1 + continue + + for morpho in self.__root.findall('morphological'): + self.hasRule = False + for rule in morpho.findall('rule'): # procura a tag rule + if rule.find('active').text == "true" and rule.get('name').split("_")[0] == it.getAtualT(): + count = int(rule.find('count').text) + self.listaIter = [] + if count == 1: + self.listaIter = [it.getToken()] + else: + try: + self.listaIter = it.getInterval(count) + self.pularIteracoes = count-1 + except: + continue + + + self.nomeRegra = self.gerarNomeDaRegra(self.listaIter) + if rule.get('name') == self.nomeRegra: # verifica se a regra é aplicavel e a mesma esta ativa + print "Achou regra: " + self.nomeRegra + #subIter = Iterator() + #subIter.load(self.listaIter) + #while(subIter.hasNext()): + self.hasRule = True + self.listaTmp = count * [None] + self.countListaIter = -1 + for classe in rule.iter('class'): # for nas tags class + title = classe.find('title') + newpos = classe.find('newpos') + newprop = classe.find('newprop') + newtoken = classe.find('newtoken') + newtokenpos = classe.find('newtokenpos') + self.specific = classe.find('specific') + + self.countListaIter += 1 + token = self.listaIter[self.countListaIter] + + if self.specific is not None: + self.specific = self.__especificos[self.specific.text](token[0]) + if newprop is not None and type(self.specific) != bool: + self.__tAux.append([self.specific,newprop.text]) + + if newpos is not None: + if newpos.text != "-1": + if type(self.specific) == bool: + self.listaTmp[int(newpos.text)] = token + else: + self.__tAux.append([self.specific, title.text]) + + if newtoken is not None: + self.listaTmp[int(newtokenpos.text)] = [newtoken.text, "NEWTOKEN"] + + self.listaTmp = filter(None, self.listaTmp) + for i in self.listaTmp: + self.__tAux.append(i) + + break + + if (self.hasRule == False): self.__tAux.append(it.getToken()) + if self.__tAux: return self.__tAux + return lista # retorna a lista sem alteracoes (nao existe regra) + + + def gerarNomeDaRegra(self, lista): + self.__nomeRegra = [] + for t in lista: + self.__nomeRegra.append(t[1]) + return "_".join(self.__nomeRegra) + + def verificarAdvTempo(self, lista): + for i in lista: + if i[1][:3] == "ADV": + if (self.__dicionarios.hasTempoVerbal(i[0])): + return True + return False + + def verificarVbInfinitivo(self, token): + if self.__dicionarios.hasVerboInfinitivo(token): # verifica se ha um verbo infinitivo desse token + return self.__dicionarios.getVerboInfinitivo(token) + return False + + #TODO + def verificarPrepos(self, token): + return None + + def verificarSubs2Generos(self, token): + return self.__dicionarios.hasSubst2Genero(token) + + #TODO + def verificarArtigo(self, token): + return None + + #TODO + def verificarVbLigacao(self, token): + return None + + #TODO + def verificarAdvIntensidade(self, token): + return None + # retira artigos e preposicoes; passa verbos para infinitivo e verificar se há sinonimos def inicializar(self, texto): it = Iterator() -- libgit2 0.21.2