예제 #1
0
    def consulta_base(self, keywords, query='COMPLETA'):
        if query == 'COMPLETA':
            self.c.execute(self.query(keywords, ''))
        else:
            self.c.execute(self.query(keywords, query))

        lista = []
        arq = Arquivo()

        count = 0
        while True:
            res = self.c.fetchall()
            tamanho = len(res)
            if not res:
                break
            for result in res:
                if (self.Verifica_Dados(str(result[0]),
                                        'arquivos/ids_selecionados.txt')):
                    lista.append(str(result[0]))
                    terminal.printProgressBar(count, tamanho, length=50)
                    self.Inserir_selecionados(result[0], result[1], result[2],
                                              result[3], result[4], result[5],
                                              result[6], result[7], result[8],
                                              result[9], result[10],
                                              result[11], result[12],
                                              result[13])
                    count += 1

        arq.Gravar_Arquivo(lista, 'arquivos/ids_selecionados.txt')
        self.Fechar_Conexao()
        return count
예제 #2
0
def Base_teste_treino():
    '''
    Importante código para separar teste e treinamento de bases
    '''
    conn = pymysql.connect("localhost", "root", "", "tw")
    c = conn.cursor()
    arq = Arquivo()
    al = AnaliseLexica()
    nome_arquivo = 'arquivos/treinamento.csv'
    nome_arquivo1 = 'arquivos/teste.csv'

    query = "SELECT id, id_tweet, tweet FROM selecionados_notrt_tb WHERE id=4216 OR id=7319 OR id=11542 OR id=11571 OR id=11764 OR id=14300 OR id=16303 OR id=19407 OR id=19439 OR id=21363 OR id=21577 OR id=22099"
    c.execute(query)

    lista = []
    while True:
        res = c.fetchall()
        if not res:
            break
        for result in res:
            tweet = al.Remocao_caracteres_Tweets(str(result[2]))
            lista.append(
                str(result[0]) + ';' + str(result[1]) + ';' + str(tweet))

    # treino = int(len(lista)*0.7)

    [print(i) for i in lista]

    arq.Gravar_Arquivo(lista[:treino], nome_arquivo)
    arq.Gravar_Arquivo(lista[treino:], nome_arquivo1)
예제 #3
0
def Corrigir_Base_Dicionario(palavras):
    if type(palavras) == str:
        palavras = palavras.split()
    arq = Arquivo()
    arq.Gravar_Arquivo(palavras, 'arquivos/data/lsa/limpeza_feature_names.txt')
    print(
        '>> Método: Corrigir_Base_Dicionario <<\nType: %s Tamanho: %i Primeira Palavra: %s Ultima Palavra: %s'
        % (type(palavras), len(palavras), palavras[0], palavras[-1]))
예제 #4
0
 def __init__(self):
     self.tfidf = TF_IDF()
     self.arq = Arquivo()
     self.tweets = []
     self.nome_arq_controle = 'arquivos/data/tf-idf/arq_controle.json'
     self.arq_controle = None
     self.vetor_tfidf = None
     self.feature_names = None
     self.Run()
예제 #5
0
 def __init__(self):
     self.nome_arq_controle = 'arquivos/data/bow/arq_controle.json'
     self.arq_controle = None
     self.arq = Arquivo()
     self.bow = BagOfWords()
     self.vocabulario = None
     self.freq_vocabulario = None
     self.tweets = []
     self.tweets_limpos = []
     self.wc = WCloud()
     self.Run()
예제 #6
0
 def __init__(self):
     self.arq = Arquivo()
     self.analise = AnaliseLexica()
     self.arquivo = self.arq.Carregar_Arquivo(
         'arquivos/arq_controle_mun_bra_ibge.csv')
     self.cidades = self.arq.Carregar_Arquivo(
         'arquivos/municipios_brasileiros_ibge.csv')
     self._ids_tweets_localizacao = self.arq.Carregar_Arquivo(
         'arquivos/data/lsa/_ids_tweets_localizacao.txt')
     self.arq_controle_cidades = {}
     self.cidades_validadas = []
     self.Carregar_arq_controle_cidades()
     self.Localizacoes()
예제 #7
0
파일: lsa.py 프로젝트: WANGOMES/visors
 def __init__(self):
     self.arq = Arquivo()
     self.feature_tweet = {}
     self.termos_especiais = {}
     self.arquivo_controle = {}
     self.matriz_termos = self.Carregar_Matriz('matriz_termos')
     self.matriz_topicos = self.Carregar_Matriz('matriz_topicos')
     self.ids_tweets_feature_topicos = self.arq.Carregar_Arquivo('arquivos/data/lsa/_ids_tweets_feature_topicos.txt')
     self.feature_topicos = self.Carregar_feature_topicos()
     self.last_id_tweet = 0
     self.TRUNCADO = 100
     # CARREGAR TWEETS
     self.body = self.Carregar_PKL('arquivos/data/bow/lista_tweets_limpos.pkl')[609:]
     self._LSA_()
예제 #8
0
    def Verifica_Dados(self, id_table, nome_arquivo):
        if (len(self.Arquivo_Carregado) == 0 and not self.carregado):
            arq = Arquivo()
            lista = arq.Carregar_Arquivo(nome_arquivo)
            self.Arquivo_Carregado = lista
            self.carregado = True
        else:
            lista = self.Arquivo_Carregado
        count = 0
        for item in lista:
            item = item.rstrip()
            if (item == id_table):
                count += 1

        if count == 0:
            return True
        else:
            return False
예제 #9
0
def Atualiza_Dict_Termos_especiais(inicializar=False):
    '''
    Atualiza o Dicionario de Termos Especiais.
    :parametro inicializar: inicializa o Dicionário de Termos Especiais, False como Padrão.
    '''
    arq = Arquivo()
    termos_especiais = {}

    def __Inicializa_Dict():
        aux = [
            'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm',
            'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'
        ]
        for i in aux:
            termos_especiais.update({i: None})

    if inicializar:
        __Inicializa_Dict()

    t = arq.Carregar_Arquivo_UTF8(
        'arquivos/data/lsa/termos_vulnerabilidade_risco_social.txt')
    lista, count = [], 0
    for key in termos_especiais.keys():
        for item in t:
            inicial = item[0]
            if inicial == key:
                count += 1
                lista.append(item)
        if len(lista) == 0:
            termos_especiais[key] = None
        else:
            termos_especiais[key] = lista.copy()
        lista.clear()

    with open('arquivos/data/lsa/termos_especiais.json', 'w',
              encoding='utf-8') as json_file:
        json.dump(termos_especiais, json_file, indent=4, ensure_ascii=False)
    print(
        '>> Método: Atualiza_Dict_Termos_especiais <<\nType: %s Arquivo: \'%s\' Tamanho: %i'
        % (type(termos_especiais), 'arquivos/data/lsa/termos_especiais.json',
           count))
예제 #10
0
class Selector():
    def __init__(self):
        self.arq = Arquivo()
        self.consulta = Conexao()
        self.Run()

    def Run(self):
        terminal.Mensagem('Iniciando em Seletor', 'd')
        print('Informe o tipo de Consulta: C - COMPLETA | A - ATUALIZAÇÃO: \t',
              end='')
        tipo = str(input())
        print('Informe a Data INICIAL para a Consulta [YYYY-MM-DD]: \t',
              end='')
        data_inicio = str(input())
        print('Informe a Data FINAL para a Consulta [YYYY-MM-DD]: \t', end='')
        data_final = str(input())
        self.select(tipo, data_inicio, data_final)

    # RETORNA A BASE DE TWEETS SELECIONADOS, CONFORME AS PALAVRAS ESCOLHIDAS
    def select(self, tipo, data_inicio, data_final):
        '''
        parametro tipo de consulta: informe C - COMPLETA | A - ATUALIZAÇÃO
        '''
        keywords = self.arq.Carregar_Arquivo_UTF8(
            'arquivos/stem_termos.txt'
        )  #palavras chave vulnerabilidade e risco sociais
        lista_aux = self.arq.Carregar_Arquivo('arquivos/ids_selecionados.txt')
        id_final = lista_aux[-1]
        if (len(lista_aux) == 0):
            tipo = 'C'
        if tipo.upper() == 'C':
            quant_tweet = self.consulta.consulta_base(keywords, 'COMPLETA')
        else:
            quant_tweet = self.consulta.consulta_base(
                keywords,
                query=
                " AND (id > %s) AND (datetime BETWEEN '%s 00:00:00.000000' AND '%s 23:59:59.999999')"
                % (id_final, data_inicio, data_final))
        terminal.Mensagem('%i Tweets Selecionados com Sucesso!' % quant_tweet,
                          'ok')
예제 #11
0
class Gerenciador_BagOfWords():
    def __init__(self):
        self.nome_arq_controle = 'arquivos/data/bow/arq_controle.json'
        self.arq_controle = None
        self.arq = Arquivo()
        self.bow = BagOfWords()
        self.vocabulario = None
        self.freq_vocabulario = None
        self.tweets = []
        self.tweets_limpos = []
        self.wc = WCloud()
        self.Run()

    def Inicializar_arq_controle(self):
        lista = [
            'atualizacao_data', 'atualizacao_hora', 'has_lista_vocabulario',
            'lista_vocabulario_nome', 'has_dict_freq_vocabulario',
            'dict_freq_vocabulario_nome', 'total_tweets', 'total_vocabulos',
            'has_lista_tweets_limpos', 'lista_tweets_limpos_nome'
        ]
        dicio = {}
        for i in lista:
            dicio.update({i: None})
        self.Gravar_arq_JSON(self.nome_arq_controle, dicio)

    def Gravar_arq_JSON(self, nome_arquivo, arquivo):
        with open(nome_arquivo, 'w') as json_file:
            json.dump(arquivo, json_file, indent=4, ensure_ascii=False)

    def Carregar_arq_JSON(self, nome_arquivo):
        with open(nome_arquivo, 'r', encoding='utf8') as json_file:
            dados = json.load(json_file)
        return dados

    def Atualiza_arq_JSON(self, key, value):
        self.arq_controle.update({key: value})
        self.Gravar_arq_JSON(self.nome_arq_controle, self.arq_controle)

    def Carregar_atualizacao(self):
        try:
            self.arq_controle = self.Carregar_arq_JSON(self.nome_arq_controle)
            terminal.Mensagem('arq_controle carregado com Sucesso!', 'ok')
        except Exception as identifier:
            terminal.Mensagem(str(identifier), 'e')

        try:
            self.vocabulario = self.arq.Carregar_Arquivo_UTF8(
                self.arq_controle['lista_vocabulario_nome'])
            terminal.Mensagem('vocabulario carregado com Sucesso!', 'ok')
        except Exception as identifier:
            terminal.Mensagem(str(identifier), 'e')

        try:
            self.freq_vocabulario = self.Carregar_arq_JSON(
                self.arq_controle['dict_freq_vocabulario_nome'])
            terminal.Mensagem('freq_vocabulario carregado com Sucesso!', 'ok')
        except Exception as identifier:
            terminal.Mensagem(str(identifier), 'e')

        try:
            self.tweets_limpos = self.Carregar_PKL(
                self.arq_controle['lista_tweets_limpos_nome'])
            terminal.Mensagem('lista_tweets_limpos carregado com Sucesso!',
                              'ok')
        except Exception as identifier:
            terminal.Mensagem(str(identifier), 'e')

    def __WordCloud(self):
        try:
            self.wc.Build_Nuvem_Palavras(self.tweets_limpos)
            terminal.Mensagem('WordClound Gerado com Sucesso!', 'ok')
        except Exception as identifier:
            terminal.Mensagem(str(identifier), 'e')

    def Gravar_PKL(self, arquivo, nome_arquivo):
        output = open(nome_arquivo, 'wb')
        dump(arquivo, output, -1)
        output.close()

    def Carregar_PKL(self, nome_arquivo):
        Input = open(nome_arquivo, 'rb')
        dados = load(Input)
        Input.close()
        return dados

    def __BOW(self):
        if len(self.tweets) == 0:
            conn = pymysql.connect("localhost", "root", "", "tw")
            c = conn.cursor()
            query = "SELECT tweet FROM selecionados_notrt_tb"
            c.execute(query)

            while True:
                res = c.fetchall()
                if not res:
                    break
                for result in res:
                    self.tweets.append(result[0])

        tam = 1000
        x = int(len(self.tweets) / tam) + 1
        for i in range(x):
            if i < x:
                self.tweets_limpos.append(
                    self.bow.Construtor_Vocabulario(self.tweets[tam * i:tam *
                                                                (i + 1)]))
            else:
                self.tweets_limpos.append(
                    self.bow.Construtor_Vocabulario(self.tweets[tam * i:]))

        def normalizar_lista(lista_tweets):
            i = 0
            aux = []
            for i in range(len(lista_tweets)):
                j = 0
                for t in lista_tweets[i][0][j]:
                    aux.append(t)
                    j += 1
            return aux

        self.tweets_limpos = normalizar_lista(self.tweets_limpos)

        self.Atualiza_arq_JSON('lista_tweets_limpos_nome',
                               'arquivos/data/bow/lista_tweets_limpos.pkl')
        self.Gravar_PKL(self.tweets_limpos,
                        self.arq_controle['lista_tweets_limpos_nome'])
        self.Atualiza_arq_JSON('has_lista_tweets_limpos', True)
        self.Atualiza_arq_JSON('total_tweets', len(self.tweets))
        self.Atualiza_arq_JSON('total_vocabulos', len(self.vocabulario))

        self.Atualiza_arq_JSON('has_lista_vocabulario', True)
        self.Atualiza_arq_JSON('lista_vocabulario_nome',
                               'arquivos/data/bow/vocabulario.txt')
        self.arq.Gravar_Arquivo(self.bow.vocabulario,
                                self.arq_controle['lista_vocabulario_nome'])

        for sent in self.tweets_limpos:
            vetor = self.bow.Vetor(sent)
            self.bow.Verifica_Freq_Vocabulario(vetor)

        self.Atualiza_arq_JSON('has_dict_freq_vocabulario', True)
        self.Atualiza_arq_JSON('dict_freq_vocabulario_nome',
                               'arquivos/data/bow/freq_vocabulario.json')
        self.Gravar_arq_JSON(self.arq_controle['dict_freq_vocabulario_nome'],
                             self.bow.freq_vocabulario)

        fim = time.time()
        data = time.strftime("%d-%m-%Y", time.localtime(fim))
        hora = time.strftime("%H:%M:%S", time.localtime(fim))
        self.Atualiza_arq_JSON('atualizacao_data', data)
        self.Atualiza_arq_JSON('atualizacao_hora', hora)

        self.__WordCloud()

    def Run(self):
        resposta = ''
        self.Carregar_atualizacao()
        if self.arq_controle == None:
            self.Inicializar_arq_controle()
        else:
            terminal.Mensagem(
                'Arquivos Atualizados em %s às %s:\nTotal de Tweets: %i\nTotal de Vocábulos: %i\nDeseja atualizar o Bag Of Words?[S/N]'
                % (self.arq_controle['atualizacao_data'],
                   self.arq_controle['atualizacao_hora'],
                   self.arq_controle['total_tweets'],
                   self.arq_controle['total_vocabulos']), 'w')
            resposta = str(input()).upper()

        if resposta == 'S':
            self.tweets_limpos.clear()
            self.__BOW()
        elif resposta == 'N':
            terminal.Mensagem(
                'Deseja gerar WordCloud com o arquivo existente?[S/N]', 'w')
            option = str(input()).upper()
            if option == 'S':
                self.__WordCloud()
            else:
                return False
        else:
            terminal.Mensagem('Resposta Inválida! Informe [S/N].', 'w')
            return False
예제 #12
0
 def __init__(self):
     self.data = []
     self.arq = Arquivo()
예제 #13
0
class TF_IDF():
    def __init__(self):
        self.data = []
        self.arq = Arquivo()

    def Gravar_PKL(self, arquivo, nome_arquivo):
        output = open(nome_arquivo, 'wb')
        dump(arquivo, output, -1)
        output.close()

    def Gerar_Dados(self, lista_tweets, dados=False):
        vectorizer = TfidfVectorizer()
        V = vectorizer.fit_transform(lista_tweets)

        row_label = ['Tweet %i' % i for i in range(V.shape[0])]
        col_label = vectorizer.get_feature_names()
        self.arq.Gravar_Arquivo(col_label,
                                'arquivos/data/tf-idf/feature_names.txt')

        aux = []
        aux2 = []
        [aux2.append(0.0) for i in range(len(col_label))]
        for item in range(len(row_label)):
            aux.append(aux2.copy())

        p = 0
        i = 0
        for indice in range(len(V.indices)):
            if indice < V.indptr[i + 1]:
                aux[p][V.indices[indice]] = V.data[indice]
            else:
                p += 1
                i += 1
                aux[p][V.indices[indice]] = V.data[indice]
        self.data = aux.copy()
        self.Gravar_PKL(self.data, 'arquivos/data/tf-idf/vetor_tfidf.pkl')

        print('Imprimir Tabela?[S/N] ', end='')
        opcao = str(input()).upper()

        if opcao == 'S':
            print('Informe os dados necessários:\nQuantidade de Linhas: ',
                  end='')
            row = int(input())
            print('Quantidade de Colunas: ', end='')
            col = int(input())
            self.Gerar_tabela(row, 5, col, row_label, col_label, self.data)
        else:
            return False

    def Gerar_tabela(self, tam_inicio, tam_final, col_tam, row_label,
                     col_label, lista):
        if col_tam > len(col_label):
            col_tam = len(col_label)
        if len(lista) > tam_inicio + tam_final:
            linha1 = 'Tweet\t'
            for ind in range(col_tam):
                linha1 += '{:<8} '.format(col_label[ind])
            if col_tam < len(col_label):
                linha1 += '{:<8} '.format('...')
            print(linha1)
            for i in range(tam_inicio):
                linha = '%s ' % row_label[i]
                for k in range(col_tam):
                    if lista[i][k] == 0.0:
                        linha += '{:<8} '.format('-')
                    else:
                        linha += '{:<8,.5f} '.format(lista[i][k])
                if col_tam < len(col_label):
                    linha += '{:<8} '.format('...')
                print(linha)
            linha_intervalo = '{:<8} '.format('...')

            linha_intervalo = linha_intervalo * (col_tam + 2)
            print(linha_intervalo)
            for i in range(-1, tam_final * -1, -1):
                linha = '%s ' % row_label[i]
                for k in range(col_tam):
                    if lista[i][k] == 0.0:
                        linha += '{:<8} '.format('-')
                    else:
                        linha += '{:<8,.5f} '.format(lista[i][k])
                if col_tam < len(col_label):
                    linha += '{:<8} '.format('...')
                print(linha)
        else:
            linha1 = 'Tweet\t'
            for ind in range(col_tam):
                linha1 += '{:<8} '.format(col_label[ind])
            if col_tam < len(col_label):
                linha1 += '{:<8} '.format('...')
            print(linha1)
            for i in range(len(lista)):
                linha = '%s ' % row_label[i]
                for k in range(col_tam):
                    if lista[i][k] == 0.0:
                        linha += '{:<8} '.format('-')
                    else:
                        linha += '{:<8,.5f} '.format(lista[i][k])
                if col_tam < len(col_label):
                    linha += '{:<8} '.format('...')
                print(linha)

    def Gerar_Grafico(self, data):

        plt.style.use(plt.style.available[-1])
        plt.rcParams['figure.figsize'] = (11, 7)

        fig, axs = plt.subplots(2, 2, figsize=(5, 5))
        axs[0, 0].hist(data[0])
        axs[1, 0].scatter(data[0], data[1], data[2], data[3])
        axs[0, 1].plot(data[0], data[1], data[2], data[3])
        axs[1, 1].bar(data[0], data[1], data[2], data[3])
        plt.title('SEU TÍTULO LINDO')
        plt.xlabel('NOME DO EIXO X')
        plt.ylabel('NOME DO EIXO Y')

        ax.grid(True)
        fig.tight_layout()
        plt.show()
        nome_grafico = 'grafico_teste_01'
        nome_arquivo = 'arquivos/data/tf-idf/graficos/' + nome_grafico + '.png'
예제 #14
0
파일: lsa.py 프로젝트: WANGOMES/visors
class Latent_Semantic_Analysis:
    def __init__(self):
        self.arq = Arquivo()
        self.feature_tweet = {}
        self.termos_especiais = {}
        self.arquivo_controle = {}
        self.matriz_termos = self.Carregar_Matriz('matriz_termos')
        self.matriz_topicos = self.Carregar_Matriz('matriz_topicos')
        self.ids_tweets_feature_topicos = self.arq.Carregar_Arquivo('arquivos/data/lsa/_ids_tweets_feature_topicos.txt')
        self.feature_topicos = self.Carregar_feature_topicos()
        self.last_id_tweet = 0
        self.TRUNCADO = 100
        # CARREGAR TWEETS
        self.body = self.Carregar_PKL('arquivos/data/bow/lista_tweets_limpos.pkl')[609:]
        self._LSA_()

    def Carregar_feature_topicos(self):
        try:
            with open( 'arquivos/data/lsa/feature_topicos.json', 'r', encoding='utf8') as json_file:
                dados = json.load(json_file)
                return dados
        except Exception as identifier:
            terminal.Mensagem('Erro [%s]: Não foi possível carregar o arquivo.'%identifier, 'e')
 
    def Carregar_PKL(self, nome_arquivo):
        try:
            Input = open(nome_arquivo, 'rb')
            dados = load(Input)
            Input.close()
            return dados
        except Exception as identifier:
            terminal.Mensagem('Erro [%s]: Não foi possível carregar o arquivo.'%identifier, 'e')

    def Gravar_PKL(self, arquivo, nome_arquivo):
        output = open(nome_arquivo, 'wb')
        dump(arquivo, output, -1)
        output.close()

    def carregar_arq_controle(self):
        try:
            with open('arquivos/data/lsa/arq_controle_lsa.json', 'r', encoding='utf8') as json_file:
                self.arquivo_controle = json.load(json_file)
            terminal.Mensagem('arquivo_controle_lsa carregado com sucesso!', 'ok')
        except Exception as identifier:
            terminal.Mensagem('Erro %s ao carregar o arquivo.'%(identifier), 'e')
        
    def carregar_feature_tweet(self):
        self.carregar_arq_controle()
        if self.arquivo_controle['has_feature_tweet']:
            with open( 'arquivos/data/lsa/feature_tweet.json' , 'r', encoding='utf8') as json_file:
                self.feature_tweet = json.load(json_file)
                terminal.Mensagem('feature_tweet carregado com sucesso!', 'ok')
    
    def Carregar_Matriz(self, nome_matriz='matriz_termos ou matriz_topicos'):
        nome = nome_matriz.lower()
        if nome == 'matriz_termos' or nome == None:
            nome_arquivo = 'arquivos/data/lsa/matriz_termos.pkl'
        elif nome == 'matriz_topicos':
            nome_arquivo = 'arquivos/data/lsa/matriz_topicos.pkl'
        try:
            matriz_T = self.Carregar_PKL(nome_arquivo)
            return matriz_T
        except Exception as identifier:
            terminal.Mensagem('Erro [%s]: Não foi possível carregar o arquivo \'%s\'.'%(identifier, nome_arquivo), 'e')

    def gravar_feature_tweet(self, tipo_gravacao='w'):
        with open('arquivos/data/lsa/feature_tweet.json', tipo_gravacao, encoding='utf-8') as json_file:
            json.dump(self.feature_tweet, json_file, indent=4, ensure_ascii=False)

    def Atualiza_arquivo_controle(self, key, value):
        self.arquivo_controle.update({key: value})
        with open('arquivos/data/lsa/arq_controle_lsa.json', 'w') as json_file:
            json.dump(self.arquivo_controle, json_file, indent=4, ensure_ascii=False)
        
    def _LSA_(self):
        inicio = time.time()
        terminal.Mensagem('Iniciando em Análise Semântica Latente', 'd')
        print('0 - Análise Semântica Latente Completa\n1 - Cálculo de Relevância dos tweets\n2 - Seleção de tweets com Maior Relevância\n\t> Informe o que deseja fazer: ',end='')
        _tipo_ = str(input())
        if _tipo_ == '0':
            resposta = 'S'
            self.carregar_arq_controle()
            if self.arquivo_controle['atualizacao_data'] != None:
                terminal.Mensagem('Arquivos Atualizados em %s às %s. Deseja atualizar a LSA?[S/N]' %(self.arquivo_controle['atualizacao_data'], self.arquivo_controle['atualizacao_hora']),'w')
                resposta = str(input()).upper()

            if resposta == 'S':
                # DEFINIR STOPWORDS
                stw = []
                stopword = stopwords.words('portuguese')
                outras_palavras = self.arq.Carregar_Arquivo_UTF8('arquivos/data/lsa/limpeza_feature_names.txt')
                [stw.append(s) for s in stopword]
                [stw.append(s) for s in outras_palavras]

                # CARREGAR LISTA DE TERMOS REFERENTES A VULNERABILIDADE E RISCO
                with open('arquivos/data/lsa/termos_especiais.json', 'r', encoding='utf8') as json_file:
                    self.termos_especiais = json.load(json_file)

                pa.Atualiza_Dict_Termos_especiais(True)

                # VETOR TFIDF / BOW
                vetor = TfidfVectorizer(min_df=1,stop_words=stw)
                bag_of_words = vetor.fit_transform(self.body)
                print(bag_of_words.shape)

                
                LISTA_TRUNCADO = [x for x in range(self.TRUNCADO)]

                # DEFINIR COLUNAS E TRUNCAR O VETOR TFIDF / BOW ==> LSA - ANALISE SEMANTICA LATENTE
                svd = TruncatedSVD(n_components=self.TRUNCADO) #Truncar para X colunas
                lsa = svd.fit_transform(bag_of_words)

                def __matriz_topicos__():
                    topicos = pd.DataFrame(lsa, columns = LISTA_TRUNCADO)
                    topicos['body'] = self.body
                    print(topicos[['body', 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 
                                    17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 
                                    34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 
                                    51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 
                                    68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 
                                    85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99]])
                    self.Gravar_PKL(topicos, 'arquivos/data/lsa/matriz_topicos.pkl')
                    self.Atualiza_arquivo_controle('has_matriz_topicos', True)

                # DEFINIÇÃO DOS TOPICOS
                if self.arquivo_controle['has_matriz_topicos']:
                    terminal.Mensagem('Arquivos Atualizados em %s às %s. Deseja atualizar a Matriz de Tópicos?[S/N]' %(self.arquivo_controle['atualizacao_data'], self.arquivo_controle['atualizacao_hora']),'w')
                    resp = str(input()).upper()
                    if resp == 'S':
                        __matriz_topicos__()
                    else:
                        topicos = self.matriz_topicos
                else:
                    __matriz_topicos__()
            
                # DICIONÁRIO DE PALAVRAS - PRODUTO DA LSA
                dicionario = vetor.get_feature_names()
                print('Imprimir dicionário? [S/N] ', end='') 
                if input(str()).upper() == 'S':
                    print(dicionario)
                    print()

                # MATRIZ DE TERMOS - PRODUTO DA LSA
                if not self.arquivo_controle['has_matriz_termos']:
                    matriz = pd.DataFrame(svd.components_, 
                                            index=[LISTA_TRUNCADO],
                                            columns=dicionario).T
                    self.Gravar_PKL(matriz, 'arquivos/data/lsa/matriz_termos.pkl')
                    self.Atualiza_arquivo_controle('has_matriz_termos', True)
                
                print('Imprimir matriz_termos? [S/N] ', end='') 
                if input(str()).upper() == 'S':
                    print(self.Carregar_Matriz('matriz_termos'))
                    print()
                print('Imprimir matriz_topicos? [S/N] ', end='') 
                if input(str()).upper() == 'S':
                    print(self.Carregar_Matriz('matriz_topicos'))
                    print()

                self.last_id_tweet = self.arquivo_controle['last_id_tweet']

                # VETOR AUXILIAR PARA TOPICOS DOS TERMOS
                aux_topic = []
                maior, pos, aux = -1000.0, 0, 0
                for item in self.matriz_termos.values:
                    for j in item:
                        if j > maior:
                            maior = j
                            aux = pos #aux = topico
                        pos += 1
                    aux_topic.append([aux, maior])
                    pos, aux, maior = 0, 0, -1000.0
                    
                def Identificar_Topico(termo):
                    term = termo.lower()
                    achou = False
                    pos = -1
                    for item in dicionario:
                        pos += 1
                        if term == item:
                            achou = True
                            break
                    if achou:
                        return aux_topic[pos]
                    else:
                        return -1

                def Identificar_Topico_Tweet(id_tweet):
                    maior, pos, _top = -1000.0, 0, 0
                    res = []
                    for item in self.matriz_topicos.values[id_tweet]:
                        if type(item) != str:
                            if item > maior:
                                maior = item # média das freq
                                _top = pos #aux = topico
                            pos += 1
                    res.append(_top)
                    res.append(maior)
                    return res

                def Verifica_Dicionario(tweet):
                    count = 0
                    tweet = tweet.split()
                    for tw in tweet:
                        for item in dicionario:
                            if tw == item:
                                count += 1
                    return count

                def Verifica_Termos_Especiais_(tweet):
                    import re
                    caract = [r'\b\"', r'\"\b', r'\b\-', r'\b\'', r'\'\b', r'\“', r'\”', r'\.', r'\.\.\.', 
                            r'\,', r'\?', r'\!', r'\(', r'\)', r'\{', r'\}',r'\[',r'\]', r'\+', r'\*', r'\B\%'
                            r'\b\"+', r'\B\"', r'\"\B', r'\%', r'\\', r'\/', r'\|', r'\<', r'\>', r'\=', 
                            r'\B\-', r'\b\‘', r'\B\‘', r'\b\`', r'\B\`', r'\b\ñ', r'\B\ñ', r'\b\º', r'\B\º', 
                            r'\b\ª', r'\B\ª', r'\b\_', r'\B\_', r'\b\;', r'\B\;', r'\b\^', r'\~', r'\b\è', 
                            r'\_', r'\–', r'\•', r'\#', r'\b\—', r'\B\—', r'\—', r'\°', r'\b\°', r'\B\°',
                            r'\'', r'\B\'', r'\«', r'\b\«', r'\B\«', r'\&', r'\b\&', r'\B\&', r'\¬',
                            r'\b\¬', r'\B\¬', r'\¨', r'\b\¨', r'\B\¨', r'\¢', r'\b\¢', r'\B\¢', r'\£',
                            r'\b\£', r'\B\£' , r'\³', r'\b\³', r'\B\³', r'\³\b', r'\³\B', r'\²', r'\b\²', 
                            r'\B\²', r'\²\b', r'\²\B', r'\¹', r'\b\¹', r'\B\¹', r'\¹\b', r'\¹\B', r'\§', 
                            r'\b\§', r'\B\§', r'\b\·', r'\B\·', r'\·', r'\^', r'\B\^', r'\ö', r'\b\ö', 
                            r'\B\ö', r'\»', r'\b\»', r'\B\»', r'\@', r'\b\@', r'\B\@',  r'\€', r'\b\€', 
                            r'\B\€', r'\÷', r'\b\÷', r'\B\÷',r'\å', r'\b\å', r'\B\å', r'\×', r'\b\×', 
                            r'\B\×', r'\¡', r'\b\¡', r'\B\¡',  r'\¿', r'\b\¿', r'\B\¿', r'\´', r'\b\´',
                            r'\B\´', r'\$', r'\b\$', r'\B\$', r'\¥', r'\b\¥', r'\B\¥', r'\¯', r'\b\¯', 
                            r'\B\¯']
                    
                    espaco2 = re.compile(r'\b\s+')
                    for item in caract:
                            e = re.compile(item)
                            tweet = re.sub(e, ' ', tweet)
                    tweet = re.sub(espaco2, ' ', tweet)
                    
                    count = 0
                    tweet = tweet.split()
                    for word in tweet:
                        inicial = word[0]
                        if self.termos_especiais[inicial] != None:
                            for item in self.termos_especiais[inicial]:
                                if word == item:
                                    count += 1
                    return count

                def feature_tweet_(lista, id_inicial):
                    try:
                        self.carregar_feature_tweet()
                    except Exception as identifier:
                        terminal.Mensagem('Erro %s Não foi possível acessar o arquivo.'%(identifier), 'e')
                    try:
                        contador = 0
                        pos = id_inicial -1
                        for tweet in lista:
                            contador += 1
                            pos += 1
                            _palavras = len(tweet.split())
                            _id = pos
                            _term = Verifica_Termos_Especiais_(tweet)
                            _aux = Identificar_Topico_Tweet(_id)
                            _topico = _aux[0]
                            _word_dicionary = Verifica_Dicionario(tweet)
                            _freq = _aux[1]
                            self.feature_tweet.update({_id:{'words': _palavras, 'special_terms': _term, 'words_dicionary': _word_dicionary, 'topic': _topico, 'score': _freq}})  
                            terminal.printProgressBar(contador,len(lista),length=50)
                        
                        self.Atualiza_arquivo_controle('has_lsa_tweet', True)
                        self.gravar_feature_tweet('w')
                        self.Atualiza_arquivo_controle('has_feature_tweet', True)
                    except Exception as identifier:
                        fim = time.time()
                        duracao = fim - inicio
                        terminal.Mensagem('Erro %s identificado na posição %i.'%(identifier, pos), 'e')
                        terminal.Mensagem('Programa finalizado!\tDuração: %.3f seg'%(duracao),'ok')

                def Gerar_Grafico():
                    topicos = pd.DataFrame(matriz, 
                                            index=['Tweet'],
                                            columns=dicionario).T

                    print(topicos)
                    fig, ax = plt.subplots()
                    top_1 = matriz[0].values
                    top_2 = matriz[1].values

                    ax.scatter(top_1, top_2, alpha=0.3)

                    ax.set_xlabel('Primeiro Topico')
                    ax.set_ylabel('Segundo Topico')
                    ax.axvline(linewidth=0.5)
                    ax.axhline(linewidth=0.5)
                    ax.legend()

                    plt.show()
                
                # Produz Recurso de Tweets
                tamanho = self.last_id_tweet + 15000
                if tamanho > len(self.body):
                    tamanho = len(self.body)

                feature_tweet_(self.body[self.last_id_tweet: tamanho], self.last_id_tweet)
                self.Atualiza_arquivo_controle('last_id_tweet', tamanho)

                # Calcula Relevancia dos Tweets
                if self.arquivo_controle['has_lsa_tweet']:
                    self.Calcular_Relevancia_Tweet()
                else:
                    terminal.Mensagem('lsa_tweet não executado!', 'e')
                # Seleciona Tweets com maior Relevancia
                if self.arquivo_controle['has_calculo_relevancia_tweet']:
                    self.Selecionar_Tweets_Relevancia('positive',0.5)
                else:
                    terminal.Mensagem('calculo_relevancia_tweet não executado!', 'e')
                
                fim = time.time()
                data = time.strftime("%d-%m-%Y", time.localtime(fim))
                hora = time.strftime("%H:%M:%S", time.localtime(fim))
                self.Atualiza_arquivo_controle('atualizacao_data', data)
                self.Atualiza_arquivo_controle('atualizacao_hora', hora)
                duracao = fim - inicio
                terminal.Mensagem('Programa finalizado!\tDuração: %.3f seg'%(duracao),'ok')

            else:
                terminal.Mensagem('Desconectando...','d')
                return False
        
        elif _tipo_ == '1':
            self.Calcular_Relevancia_Tweet()
        elif _tipo_ == '2':
            self.Selecionar_Tweets_Relevancia('positive',0.5)
        else:
            terminal.Mensagem('Desconectando...','d')
            return False
        
    def Calcular_Relevancia_Tweet(self):
        self.carregar_feature_tweet()
        # Atribuição de relevância POSITIVA
        for key in self.feature_tweet.keys():
            if self.feature_tweet[key]['special_terms'] > 0:
                term = (self.feature_tweet[key]['special_terms'])
                dc = (self.feature_tweet[key]['words_dicionary'])
                if dc != 0:
                    imp = (term / dc)
                else:
                    imp = -1
                if imp >= 0.50: # grau de importancia do tweet com o tema (>=50% POSITIVO, menor que 50% NEUTRO, não possui palavras que tenha a ver com o tema NEGATIVO)
                    self.feature_tweet[key].update({'relevance': 'POSITIVE'})
                else:
                    self.feature_tweet[key].update({'relevance': 'NEUTRO'})
            else:
                # Atribuição de relevância NEGATIVA
                self.feature_tweet[key].update({'relevance': 'NEGATIVE'})
        self.gravar_feature_tweet('w')
        self.Atualiza_arquivo_controle('has_calculo_relevancia_tweet', True)

    def Selecionar_Tweets_Relevancia(self, relevancia='POSITIVE', maior_score=0.0):
        self.carregar_feature_tweet()
        self.carregar_arq_controle()
        ''' PERGUNTAR SE DESEJA IMPRIMIR MATRIZ TERMOS E TOPICOS E DICIONARIO'''
        print('\tImprimir matriz_termos? [S/N] ', end='') 
        if input(str()).upper() == 'S':
            print(self.Carregar_Matriz('matriz_termos'))
            print()
        print('\tImprimir matriz_topicos? [S/N] ', end='') 
        if input(str()).upper() == 'S':
            print(self.Carregar_Matriz('matriz_topicos'))
            print()

        relevancia = relevancia.upper()
        encontrado = False
        status_relevancia = ['POSITIVE', 'NEGATIVE', 'NEUTRO']

        def __run__():
            score, posicao, termos, topico, palavras, dicio, importancia, tt = [], [], [], [], [], [], [], []
            for key in self.feature_tweet.keys():
                if self.feature_tweet[key]['relevance'] == relevancia and self.feature_tweet[key]['score'] >= maior_score:
                    term = self.feature_tweet[key]['special_terms']
                    dc = self.feature_tweet[key]['words_dicionary']
                    if dc != 0:
                        imp = (term / dc)
                    else:
                        imp = -1
                    score.append(self.feature_tweet[key]['score'])
                    posicao.append(key)
                    termos.append(term)
                    topico.append(self.feature_tweet[key]['topic'])
                    palavras.append(self.feature_tweet[key]['words'])
                    dicio.append(dc)
                    importancia.append(imp)

            print('\t> Tweets com Score maior que %.2f e com Relevancia \'%s\': %i / %i (%.2f)' %(maior_score, relevancia, len(posicao), len(self.feature_tweet), float(len(posicao)/len(self.feature_tweet)*100)) + '%')
            self.Atualiza_arquivo_controle('count_feature_topicos',len(posicao))

            print()
            for item in posicao: # Imprime os Tweets
                tt.append(self.body[int(item)])
            y = zip(posicao, topico, tt)
            
            topic_unique = [topico[0]]
            achou = False
            for t1 in topico:
                achou = False
                for t2 in topic_unique:
                    if t1 == t2:
                        achou = True
                if not achou:
                    topic_unique.append(t1)
            topic_unique.sort()

            topicos_dict, aux, p1 = {}, {}, 0
            for t0 in topic_unique:
                for t3 in topico:
                    if t3 == t0:
                        aux.update({posicao[p1]: self.feature_tweet[str(posicao[p1])]})
                        aux[posicao[p1]]['importancia'] = importancia[p1]
                        aux[posicao[p1]]['tweet'] = tt[p1]
                        topicos_dict.update({t3: aux.copy()})
                    p1 +=1
                aux.clear()
                p1=0

            if not self.arquivo_controle['has_feature_topicos']:
                with open('arquivos/data/lsa/feature_topicos.json', 'w', encoding='utf-8') as json_file:
                    json.dump(topicos_dict, json_file, indent=4, ensure_ascii=False)
                self.arq.Gravar_Arquivo(posicao,'arquivos/data/lsa/_ids_tweets_feature_topicos.txt')
            
            self.Atualiza_arquivo_controle('has_feature_topicos',True)

            print('\tImprimir feature_topicos? [S/N] ', end='')
            if input(str()).upper() == 'S':
                tam =0
                for t4 in topicos_dict.keys():
                    while tam < 10:
                        for t5 in topicos_dict[t4].keys():
                            print('id: {:<8} score: {:<8,.5f} terms: {:<2} topic: {:<2} words: {:<4} words_dicionary: {:<2} importancia: {:<2,.2f}'
                                    .format(t5, topicos_dict[t4][t5]['score'], topicos_dict[t4][t5]['special_terms'], topicos_dict[t4][t5]['topic'], 
                                    topicos_dict[t4][t5]['words'], topicos_dict[t4][t5]['words_dicionary'], topicos_dict[t4][t5]['importancia']))
                            tam +=1

                print('...\t\t...\t\t...\n')
                tam =0
                for t4 in topicos_dict.keys():
                    while tam < 10:
                        for t5 in topicos_dict[t4].keys():
                            print('id: {:<6} Topic: {:<2} Tweet: {:<80}'
                                    .format(t5, topicos_dict[t4][t5]['topic'], topicos_dict[t4][t5]['tweet']))
                            tam +=1
            print('\tImprimir relatorio_status_lsa_tweet? [S/N] ', end='')
            if input(str()).upper() == 'S':
                relt_topicos, tam_topic = [], 0
                for t_u in topic_unique:
                    tam_topic += len(topicos_dict[t_u])
                    relt_topicos.append([t_u, len(topicos_dict[t_u])])
                print('* * * RELATÓRIO DE STATUS LSA FEATURE * * * ')
                for item in range(0,len(relt_topicos),4):
                    if item <=len(relt_topicos)-4:
                        print('Topic: {:<2} Qtde: {:<4} Topic: {:<2} Qtde: {:<4} Topic: {:<2} Qtde: {:<4} Topic: {:<2} Qtde: {:<4}'
                                .format(relt_topicos[item][0], relt_topicos[item][1],
                                relt_topicos[item+1][0], relt_topicos[item+1][1],
                                relt_topicos[item+2][0], relt_topicos[item+2][1],
                                relt_topicos[item+3][0], relt_topicos[item+3][1]))
                    elif item == len(relt_topicos)-1:
                        print('Topic: {:<2} Qtde: {:<4}'.format(relt_topicos[item][0], relt_topicos[item][1]))
                    elif item == len(relt_topicos)-2:
                        print('Topic: {:<2} Qtde: {:<4} Topic: {:<2} Qtde: {:<4}'
                                .format(relt_topicos[item][0], relt_topicos[item][1],
                                relt_topicos[item+1][0], relt_topicos[item+1][1]))
                    else:
                        print('Topic: {:<2} Qtde: {:<4} Topic: {:<2} Qtde: {:<4} Topic: {:<2} Qtde: {:<4}'
                                .format(relt_topicos[item][0], relt_topicos[item][1],
                                relt_topicos[item+1][0], relt_topicos[item+1][1],
                                relt_topicos[item+2][0], relt_topicos[item+2][1]))
                print('\t > Total Tópicos: {:<2} Total Tweets: {:<4}'.format(len(topic_unique), tam_topic))
        
            print('\n\tRealizar Etiquetagem <Treinamento> da Base de Tweets? [S/N] ', end='')
            if input(str()).upper() == 'S':
                pos, fim = 1, False
                for i in topic_unique:
                    if i > self.arquivo_controle['topico_treinamento']:
                        print('\t> Treino da Base topic_num: \"%i\" [%i de %i tópicos]'%(i, pos, len(topic_unique)))
                        fim = self.Verifica_feature_topicos(i)
                        if fim:
                            return False
                    pos += 1
            print('\n\tImprimir Estimativa de Tweets com Vulnerabilidade TRUE? [S/N] ', end='')
            if input(str()).upper() == 'S':
                pa.Levantamento_Score_Vulnerabilidade()
            
            tweets_localizacao()

        def tweets_localizacao():
            dicts, _ids_tweets_localizacao, aux_ids = {}, [], []
            with open( 'arquivos/data/lsa/feature_topicos.json' , 'r', encoding='utf8') as json_file:
                dicts = json.load(json_file)

            for topico in dicts.keys():
                for _id in dicts[topico].keys():
                    if dicts[topico][_id]['vulnerabilidade'] == 1.0:
                        aux_ids.append(int(_id))
            aux_ids.sort()
            for item in aux_ids:
                _ids_tweets_localizacao.append(str(item))

            self.arq.Gravar_Arquivo(_ids_tweets_localizacao, 'arquivos/data/lsa/_ids_tweets_localizacao.txt')
            print('Arquivo _ids_tweets_localizacao.txt tamanho: %i'%len(_ids_tweets_localizacao))


        # __MAIN__
        for item in status_relevancia:
            if relevancia == item:
                encontrado = True
        if encontrado:
            __run__()
        else:
            terminal.Mensagem('Erro ao inserir o dado [RELEVANCE]: \'%s\'' % (relevancia), 'e')

    def Verifica_feature_topicos(self, _topic):
        _topic = str(_topic)
        _tweet, _id = [], []
        
        clear = lambda: os.system('cls')

        def _retorna_tweet_topico():
            for item in self.feature_topicos[_topic].keys():
                if self.feature_topicos[_topic][item]['vulnerabilidade'] == None:
                    _tweet.append(self.feature_topicos[_topic][item]['tweet'])
                    _id.append(item)
        
        def _atualiza_feature_topicos_( _id, _key, _value):
            self.feature_topicos[_topic][_id].update({_key: _value})
            with open('arquivos/data/lsa/feature_topicos.json', 'w', encoding='utf-8') as json_file:
                json.dump(self.feature_topicos, json_file, indent=4, ensure_ascii=False)
        
        def _aplica_regra_treino(identificador, tweet):
            print('\nTweet: %s'%tweet)
            print('O Tweet Apresenta Vulnerabilidade? [S/N] ', end='')
            chave = 'vulnerabilidade'
            if input(str()).upper() == 'S':
                valor = 1.0
            else:
                valor = 0.0
            _atualiza_feature_topicos_(identificador, chave, valor)
            clear()
        
        
        _retorna_tweet_topico()        
        treino = int(len(_tweet)*0.6) ## Treino 60% da Base ##
        tw = _tweet.copy()
        ident = _id.copy()
        pos = 0
        print('Deseja Continuar a Etiquetagem da Base? [S/N] ', end='')
        if input(str()).upper() == 'S':
            if len(tw) > 0:
                for item in tw:
                    print('%i de %i Tweets - tópico: \"%s\" Id: %s'%(pos+1, len(tw), _topic, ident[pos]))
                    _aplica_regra_treino(ident[pos], item)
                    pos += 1
                    self.Atualiza_arquivo_controle('topico_treinamento', int(_topic))
                pa.Atualiza_Recursos_Classificador()
            else:
                print('Etiquetagem atualizada! Não há mais tweets para etiquetar.\n')
        else:
            return True
예제 #15
0
 def __init__(self):
     self.arq = Arquivo()
     self.consulta = Conexao()
     self.Run()
예제 #16
0
class Gerenciador_TF_IDF():
    def __init__(self):
        self.tfidf = TF_IDF()
        self.arq = Arquivo()
        self.tweets = []
        self.nome_arq_controle = 'arquivos/data/tf-idf/arq_controle.json'
        self.arq_controle = None
        self.vetor_tfidf = None
        self.feature_names = None
        self.Run()

    def Inicializar_arq_controle(self):
        lista = [
            'atualizacao_data', 'atualizacao_hora', 'has_vetor_tfidf',
            'vetor_tfidf_nome', 'has_feature_names', 'feature_names_nome'
        ]
        dicio = {}
        for i in lista:
            dicio.update({i: None})
        self.Gravar_arq_JSON(self.nome_arq_controle, dicio)

    def Gravar_arq_JSON(self, nome_arquivo, arquivo):
        with open(nome_arquivo, 'w') as json_file:
            json.dump(arquivo, json_file, indent=4, ensure_ascii=False)

    def Carregar_arq_JSON(self, nome_arquivo):
        with open(nome_arquivo, 'r', encoding='utf8') as json_file:
            dados = json.load(json_file)
        return dados

    def Atualiza_arq_JSON(self, key, value):
        self.arq_controle.update({key: value})
        self.Gravar_arq_JSON(self.nome_arq_controle, self.arq_controle)

    def Carregar_PKL(self, nome_arquivo):
        Input = open(nome_arquivo, 'rb')
        dados = load(Input)
        Input.close()
        return dados

    def __agregarlistas(self, lista):
        result = []
        aux = []
        if type(lista) == list:
            for item in lista:
                if type(item) == list:
                    aux = self.__agregarlistas(item)
                    result = result + aux
                else:
                    result.append(item)
        return result

    def Carregar_atualizacao(self):
        try:
            self.arq_controle = self.Carregar_arq_JSON(self.nome_arq_controle)
            terminal.Mensagem('arq_controle carregado com Sucesso!', 'ok')
        except Exception as identifier:
            terminal.Mensagem(str(identifier), 'e')

        try:
            self.vetor_tfidf = self.Carregar_PKL(
                self.arq_controle['vetor_tfidf_nome'])
            terminal.Mensagem('vetor_tfidf carregado com Sucesso!', 'ok')
        except Exception as identifier:
            terminal.Mensagem(str(identifier), 'e')

        try:
            self.feature_names = self.arq.Carregar_Arquivo_UTF8(
                self.arq_controle['feature_names_nome'])
            terminal.Mensagem('feature_names carregado com Sucesso!', 'ok')
        except Exception as identifier:
            terminal.Mensagem(str(identifier), 'e')

    def Run(self):
        def Executar_tfidf():
            aux = []
            aux = self.Carregar_PKL(
                'arquivos/data/bow/lista_tweets_limpos.pkl')
            self.tweets = self.__agregarlistas(aux)
            self.tfidf.Gerar_Dados(self.tweets)

            self.Atualiza_arq_JSON('has_vetor_tfidf', True)
            self.Atualiza_arq_JSON('vetor_tfidf_nome',
                                   'arquivos/data/tf-idf/vetor_tfidf.pkl')
            self.Atualiza_arq_JSON('has_feature_names', True)
            self.Atualiza_arq_JSON('feature_names_nome',
                                   'arquivos/data/tf-idf/feature_names.txt')

            fim = time.time()
            data = time.strftime("%d-%m-%Y", time.localtime(fim))
            hora = time.strftime("%H:%M:%S", time.localtime(fim))
            self.Atualiza_arq_JSON('atualizacao_data', data)
            self.Atualiza_arq_JSON('atualizacao_hora', hora)

        resposta = ''
        res = ''
        self.Carregar_atualizacao()
        if self.arq_controle == None:
            self.Inicializar_arq_controle()
        elif not self.arq_controle['has_vetor_tfidf'] and not self.arq_controle[
                'has_feature_names']:
            Executar_tfidf()
        else:
            terminal.Mensagem(
                'Arquivos Atualizados em %s às %s:\nDeseja atualizar o TF-IDF?[S/N]'
                % (self.arq_controle['atualizacao_data'],
                   self.arq_controle['atualizacao_hora']), 'w')
            resposta = str(input()).upper()
        if resposta == 'S':
            Executar_tfidf()
        elif resposta == 'N':
            terminal.Mensagem('Deseja Visualizar o arquivo existente?[S/N]',
                              'w')
            res = str(input()).upper()
            if res == 'S':
                if self.arq_controle['has_vetor_tfidf'] and self.arq_controle[
                        'has_feature_names']:
                    row_label = [
                        'Tweet %i' % i for i in range(len(self.tweets))
                    ]
                    col_label = self.feature_names
                    self.tfidf.Gerar_tabela(45, 5, 8, row_label, col_label,
                                            self.vetor_tfidf)
                else:
                    Executar_tfidf()
            else:
                return False
        else:
            return False
예제 #17
0
class AnaliseLocalização():
    '''
    Retorna lista de cidades validadas para aplicação de geolocalização

    :parametro tweets_selecionados: lista de tweets selecionados
    '''
    def __init__(self):
        self.arq = Arquivo()
        self.analise = AnaliseLexica()
        self.arquivo = self.arq.Carregar_Arquivo(
            'arquivos/arq_controle_mun_bra_ibge.csv')
        self.cidades = self.arq.Carregar_Arquivo(
            'arquivos/municipios_brasileiros_ibge.csv')
        self._ids_tweets_localizacao = self.arq.Carregar_Arquivo(
            'arquivos/data/lsa/_ids_tweets_localizacao.txt')
        self.arq_controle_cidades = {}
        self.cidades_validadas = []
        self.Carregar_arq_controle_cidades()
        self.Localizacoes()

    def AgregarListas(self, lista):
        result = []
        aux = []
        if type(lista) == list:
            for item in lista:
                if type(item) == list:
                    aux = self.AgregarListas(item)
                    result = result + aux
                else:
                    result.append(item)
        else:
            result.append(lista)
        return result

    def _Selecionar_localizacao_tweets_banco_(self, lista_ids_tweets):
        aux = ''
        for item in lista_ids_tweets:
            if item != lista_ids_tweets[-1]:
                aux += 'id=%i OR ' % (int(item) + 610
                                      )  #foram desprezados 609 tweets
            else:
                aux += 'id=%i' % (int(item) + 610)

        conn = pymysql.connect("localhost", "root", "", "tw")
        c = conn.cursor()
        query = "SELECT user_local, geo, coordinates, place, tweet FROM `selecionados_notrt_tb` WHERE %s" % aux
        c.execute(query)
        lista = []
        while True:
            res = c.fetchall()
            if not res:
                break
            for result in res:
                lista.append(str(result[0]))
                lista.append(str(result[1]))
                lista.append(str(result[2]))
                lista.append(str(result[3]))
        c.close()
        return lista

    def Localizacoes(self):
        terminal.Mensagem('Iniciando em Análise Localização', 'd')
        lista = self._Selecionar_localizacao_tweets_banco_(
            self._ids_tweets_localizacao)
        point = []
        cidades_validadas = []
        # Verificação do user_local
        for i in lista:
            if i != None:
                point.append(i)

        teste = self.Validacao_cidades(point)

        for item in teste:
            self.EhCidade(item)
            # cidades_validadas.append(item)
        self.arq.Gravar_Arquivo(
            self.cidades_validadas,
            'arquivos/data/localizacao/arquivo_localizacao.txt')
        print('Arquivo \'arquivo_localizacao.txt\' tamanho: ',
              len(self.cidades_validadas))
        count, encontrou, cids = 0, False, []
        cids.append(self.cidades_validadas[0])
        for item in self.cidades_validadas:
            for cidade in cids:
                if cidade == item:
                    encontrou = True
            if not encontrou:
                cids.append(item)
            encontrou = False
        print('%i Cidades Brasileiras encontradas.' % len(cids))
        cids.sort()
        print(cids)

    def Carregar_arq_controle_cidades(self):
        for linha in self.arquivo:
            linhas = linha.split(',')
            self.arq_controle_cidades.update(
                {linhas[0]: [int(linhas[1]), int(linhas[2])]})

    def Validacao_cidades(self, lista):
        aux = []
        sinais = [
            '.', ',', '?', '!', '-', ':', ';', '...', '(', ')', '[', ']', '{',
            '}', '&', '*', '``', '“', "''", '…'
        ]
        numeros = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']
        count_num = 0
        count_pont = 0
        sinal = ''
        for local in lista:
            # contem numeros - para coordenadas
            for caract in local:
                for num in numeros:
                    if caract == num:
                        count_num += 1
                for pontuacao in sinais:
                    if caract == pontuacao:
                        sinal = pontuacao
                        count_pont += 1
            if (count_pont == 0 & count_num == 0):
                aux.append(local)
                count_num = 0
            if count_pont > 0:
                locais = local.split(sinal)
                for l in locais:
                    aux.append(l)
                count_pont = 0
        return aux

    def EhCidade(self, localidade):
        result = False
        loc = self.analise.Remocao_acentuacao(localidade)
        loc = self.analise.Remocao_caracteres_Tweets(loc)
        if type(loc) == list:
            loc = self.AgregarListas(loc)
            if loc[0] == '':
                return False
            local = loc[0]
        else:
            local = local.upper()

        space2 = re.compile(r'\B\s+')
        local = re.sub(space2, '', local)
        # local = loc[0]
        local = local.upper()
        letra = local[0]
        inicio = self.arq_controle_cidades[letra][0]
        fim = self.arq_controle_cidades[letra][1]
        i = inicio
        while i < fim:
            city = self.cidades[i - 1].split(',')
            cidade = city[0]
            if local == cidade:
                self.cidades_validadas.append(cidade)
                result = True
                break
            i += 1
        return result