LerDicionarios.py 10.1 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 os.path import expanduser
from os import environ
import csv
import platform

class Singleton(object):
   ''' Permite a criação de apenas uma instância da classe
   '''

   def __new__(cls, *args, **kwargs):
      if '_inst' not in vars(cls):
         cls._inst = object.__new__(cls, *args, **kwargs)
      return cls._inst

class LerDicionarios(Singleton):
   '''Carrega todos os arquivos (dicionários) necessários para auxiliar durante o processo de tradução.
   '''

   def __init__(self):
      self.path = self.get_path()
      self.set_exc_plural = []
      self.dic_adv_intensidade = {}
      self.set_adv_tempo = []
      self.set_art = []
      self.set_prep = []
      self.dic_sin = {}
      self.set_sb_2_gen = []
      self.set_pron_trat = []     
      self.dic_vb_infinitivo = {}
      self.set_vb_ligacao = []
      self.dic_vb_muda_negacao = []
      self.file = '' 
      self.carregar_dicionarios()

   def get_path(self):
      '''Verifica qual o SO e gera o path de onde se encontra o diretório data.
      '''
      if platform.system() == 'Windows':
         return environ.get("HOMEDRIVE") + "\\vlibras-libs\\vlibras-translate\data\\"
      elif "TRANSLATE_DATA" in environ:
         return environ("TRANSLATE_DATA")
      return expanduser("~") + "/vlibras-translate/data"

   def carregar_dicionarios(self):
      '''Realiza a leitura dos arquivos e atribui à estruturas de dicionários e sets.
      '''
      self.carregar_excecoes_plural()
      self.carregar_adverbios_intensidade()
      self.carregar_adverbios_tempo()
      self.carregar_artigos()
      self.carregar_preposicoes()
      self.carregar_sinonimos() 
      self.carregar_subs_2_generos()
      self.carregar_pronomes_tratamento()
      self.carregar_verbos_infinitivo()
      self.carregar_verbos_ligacao()     
      self.carregar_verbos_muda_negacao  

   def montar_diretorio(self, arquivo):
      return os.path.join(self.path, arquivo)

   def carregar_excecoes_plural(self):
      '''Carrega arquivo de exceções de plural.
      '''
      try:
         self.file = csv.reader(open(montar_diretorio("excecoesPlural.csv")))
      except IOError, (errno, strerror):
         print "I/O error(%s): %s" % (errno, strerror)
         print "carregar_excecoes_plural"
   
      rows = []
      for row in self.file:
         rows.append(row[0].decode("utf-8"))
      self.set_exc_plural = set(rows)

   def carregar_adverbios_intensidade(self):
      '''Carrega arquivo de adverbios de intensidade.
      '''
      try:
         self.file = csv.reader(open(montar_diretorio("adverbiosIntensidade.csv"), delimiter=";"))
      except IOError, (errno, strerror):
         print "I/O error(%s): %s" % (errno, strerror)
         print "carregar_adverbios_intensidade"
   
      for row in self.file:
         if row[1] != "":
            self.dic_adv_intensidade[row[0].decode("utf-8")] = row[1].decode("utf-8")

   def carregar_adverbios_tempo(self):
      '''Carrega arquivo de advérbios de tempo.
      '''
      try:
         self.file = csv.reader(open(montar_diretorio("adverbiosTempo.csv")))
      except IOError, (errno, strerror):
         print "I/O error(%s): %s" % (errno, strerror)
         print "carregar_adverbios_tempo"
         
      rows = []
      for row in self.file:
         rows.append(row[0].decode("utf-8"))
      self.set_adv_tempo = set(rows)

   def carregar_artigos(self):
      '''Carrega arquivo de artigos a serem removidos.
      '''
      try:
         self.file = csv.reader(open(montar_diretorio("artigos.csv")))
      except IOError, (errno, strerror):
         print "I/O error(%s): %s" % (errno, strerror)
         print "carregar_artigos"

      rows = []
      for row in self.file:
         rows.append(row[0].decode("utf-8"))
      self.set_art = set(rows)

   def carregar_preposicoes(self):
      '''Carrega arquivo de preposições a serem removidas.
      '''
      try:
         self.file = csv.reader(open(montar_diretorio("preposicoes.csv")))
      except IOError, (errno, strerror):
         print "I/O error(%s): %s" % (errno, strerror)
         print "carregar_preposicoes"

      rows = []
      for row in self.file:
         rows.append(row[0].decode("utf-8"))
      self.set_prep = set(rows)        

   def carregar_sinonimos(self):
      '''Carrega arquivo de sinônimos.
      '''
      try:
         self.file = csv.reader(open(montar_diretorio("sinonimos.csv"), delimiter=";"))
      except IOError, (errno, strerror):
         print "I/O error(%s): %s" % (errno, strerror)
         print "carregar_sinonimos"
   
      for row in self.file:
         if row[1] != "":
            try:
               self.dic_sin[row[0].decode("utf-8")] = row[1].decode("utf-8")
            except UnicodeDecodeError:
               self.dic_sin[row[0].decode('iso8859-1').encode('utf-8').decode('utf-8')] = row[1].decode('iso8859-1').encode('utf-8').decode('utf-8')

   def carregar_subs_2_generos(self):
      '''Carrega arquivo dos substantivos comuns de 2 generos.
      '''
      try:
         self.file = csv.reader(open(montar_diretorio("subs2Generos.csv")))
      except IOError, (errno, strerror):
         print "I/O error(%s): %s" % (errno, strerror)
         print "carregar_subs_2_generos" 

      rows = []
      for row in self.file:
         rows.append(row[0].decode('iso8859-1').encode('utf-8').decode('utf-8'))
      self.set_sb_2_gen = set(rows)    

   def carregar_verbos_infinitivo(self):
      '''Carrega arquivo de verbos no infinitivo.
      '''
      try:
         self.file = csv.reader(open(montar_diretorio("verbosInfinitivo.csv"), delimiter=";"))
      except IOError, (errno, strerror): 
         print "I/O error(%s): %s" % (errno, strerror)
         print "carregar_verbos_infinitivo"

      for row in self.file:
         if row[1] != "": 
            try:
               self.dic_vb_infinitivo[row[0].decode("utf-8")] = row[1].decode("utf-8") 
            except UnicodeDecodeError:
               self.dic_vb_infinitivo[row[0].decode('iso8859-1').encode('utf-8').decode('utf-8')] = row[1].decode('iso8859-1').encode('utf-8').decode('utf-8')

   def carregar_verbos_ligacao(self):
      '''Carrega arquivo de verbos de ligação.
      '''
      try:
         self.file = csv.reader(open(montar_diretorio("verbosLigacao.csv")))
      except IOError, (errno, strerror):
         print "I/O error(%s): %s" % (errno, strerror)
         print "carregar_verbos_ligacao"
  
      rows = []
      for row in self.file:
         rows.append(row[0].decode("utf-8"))
      self.set_vb_ligacao = set(rows) 

   def carregar_pronomes_tratamento(self):
      '''Carrega arquivo de pronomes de tratamento.
      '''
      try:
         self.file = csv.reader(open(montar_diretorio("pronomesTratamento.csv")))
      except IOError, (errno, strerror):
         print "I/O error(%s): %s" % (errno, strerror)
         print "carregar_pronomes_tratamento"
  
      rows = []
      for row in self.file:
         rows.append(row[0].decode("utf-8"))
      self.set_pron_trat = set(rows) 

   def carregar_verbos_muda_negacao(self):
      '''Carrega arquivo de verbos que mudam a negação.
      '''
      try:
         self.file = csv.reader(open(montar_diretorio("verbosMudaNegacao.csv"), delimiter=";"))
      except IOError, (errno, strerror): 
         print "I/O error(%s): %s" % (errno, strerror)
         print "carregar_verbos_muda_negacao"

      for row in self.file:
         if row[1] != "": 
            self.dic_vb_muda_negacao[row[0].decode("utf-8")] = row[1].decode("utf-8")  

   def has_excecao_plural(self, token):
      '''Verifica se o token recebido consta no arquivo de exceções de plural.
      '''
      return token not in self.set_exc_plural

   def has_adverbio_intensidade(self, token):
      '''Verifica se o token recebido consta no arquivo de advérbios de intensidade.
      '''
      return self.dic_adv_intensidade.has_key(token)

   def has_adverbio_tempo(self, token):
      '''Verifica se o token recebido consta no arquivo de advérbios de tempo.
      '''
      return token in self.set_adv_tempo

   def has_artigo(self, token):
      '''Verifica se o token recebido consta no arquivo de artigos a serem removidos.
      '''
      return token in self.set_art

   def has_preposicao(self, token):
      '''Verifica se o token recebido consta no arquivo de preposições a serem removidas.
      '''
      return token in self.set_prep
      
   def has_sinonimo(self, token):
      '''Verifica se o token recebido consta no arquivo de sinonimos.
      '''
      return self.dic_sin.has_key(token)

   def has_pron_tratam(self, token):
      '''Verifica se o token recebido consta no arquivo de pronomes de tratamento.
      '''
      return token in self.set_pron_trat

   def has_subst_2_generos (self, token):
      '''Verifica se o token recebido consta no arquivo de substantivos comuns de 2 generos.
      '''
      return token in self.set_sb_2_gen

   def has_verbo_infinitivo(self, token):
      '''Verifica se o token recebido consta no arquivo de verbos no infinitivo.
      '''
      return self.dic_vb_infinitivo.has_key(token)

   def has_verbo_ligacao(self, token):
      '''Verifica se o token recebido consta no arquivo de verbos de ligação.
      '''
      return token in self.set_vb_ligacao

   def has_verbo_muda_negacao(self, token):
      '''Verifica se o token recebido consta no arquivo de verbos que mudam de negação.
      '''
      return self.dic_vb_muda_negacao.has_key(token)

   def get_adverbio_intensidade(self, token):
      '''Verifica se o token recebido consta no arquivo de advérbios de intensidade.
      '''
      return self.dic_adv_intensidade[token]

   def get_sinonimo(self, token):
      '''Obtém o sinônimo do token.
      '''
      return self.dic_sin[token]

   def get_verbo_infinitivo(self, token):
      '''Obtém o verbo no infinitivo do token.
      '''
      return self.dic_vb_infinitivo[token]

   def get_verbo_muda_negacao(self, token):
      '''Obtém o verbo que muda a negação do token.
      '''
      return self.dic_vb_muda_negacao[token]