Example #1
0
    def __init__(self):
        # Commands disponiveis.
        # Regras de negócio para processar os documentos.
        # Existe uma ordem correta de processamento das regras,
        # portanto a ordem das regras nessa lista é importante.
        #
        # No momento, notações como 'emoticon_feliz' e 'simbolo_monetario'
        # também são alterados pelo stemmer.

        # Processar 'DivideCamelCaseCommand' antes de 'ProcessaNegacaoCommand',
        # evita erros como 'NAO_JKRowling'.
        self.regras_negocio = [
            CorrigeAbreviacaoContracaoCommand(),
            RemoveRTCommand(),
            CorrigeRisadaCommand(),
            RemoveNumerosCommand(),
            PadronizaSimboloMonetarioCommand(),
            PadronizaLinksCommand(),
            RemoveEmailCommand(),
            ProcessaEmoticonsCommand(),
            DivideCamelCaseCommand(),
            ConverteLowerCaseCommand(),
            # StemmerCommand(),
            # ProcessaNegacaoCommand(),
            RemovePontuacaoCommand(),
            RemoveStopwordsCommand(),
            RemoveEspacosExtraCommand()
        ]
        '''self.regras_negocio = [StemmerCommand()]'''

        self._CLASSIFICADOR_PATH = "/home/lucas/Documents/mineracao_opiniao/classificadores_treinados/" \
                                   "naive_bayes_3860_resenhas_2015-09-25.00.52.23.944959.pickle"
        '''self._CLASSIFICADOR_PATH = "/home/lucas/Documents/mineracao_opiniao/classificadores_treinados/" \
                                   "naive_bayes_3860_resenhas_negacao_2015-10-10.16.54.27.113297.pickle"'''

        self._CORPUS_RAIZ = "/home/lucas/Documents/mineracao_opiniao/corpus_resenhas_livros_processadas"

        self._PATH_PALAVRAS_FREQUENTES_CORPUS = "/home/lucas/Documents/mineracao_opiniao/palavras_frequentes_corpus/" \
                                                "palavras_frequentes_2015-09-25.15.05.22.013713.pickle"

        # self._MODO_ANALISE_PROBABILISTICO = "modo_probabilistico"
        # self._MODO_ANALISE_DICIONARIO = "modo_dicionario"

        self._CORPUS = CorpusUtil(self._CORPUS_RAIZ)
Example #2
0
    def treinar_classificador(raiz_corpus):
        """Documentar
        """
        minuto_incio = datetime.now().minute

        corpus = CorpusUtil(raiz_corpus)

        train_set = corpus.get_train_set()

        '''print " ++ len(train_set): %d" % len(train_set)
        print " ++ type(train_set): %s" % type(train_set)

        test_set = corpus.get_test_set()

        print " ++ len(test_set): %d" % len(test_set)
        print " ++ type(test_set): %s" % type(test_set)

        # test_set
        qtde_pos = 0
        qtde_neg = 0
        for features in test_set:

            if features[1] == 'pos':
                qtde_pos += 1
            elif features[1] == 'neg':
                qtde_neg += 1

            # print " ++ features[1]: ", features[1]

        print "Quantidade de documentos positivos em 'test_set': %d" % qtde_pos
        print "Quantidade de documentos negativos em 'test_set': %d" % qtde_neg'''

        classificador = NaiveBayesClassifier.train(train_set)
        print " -- Classificador treinado com sucesso."

        minuto_fim = datetime.now().minute

        tempo_decorrido = minuto_fim - minuto_incio

        print "-- Tempo decorrido: %s minutos." % str(tempo_decorrido)

        return classificador
Example #3
0
    def treinar_classificador(raiz_corpus):
        """Documentar
        """
        minuto_incio = datetime.now().minute

        corpus = CorpusUtil(raiz_corpus)

        train_set = corpus.get_train_set()
        '''print " ++ len(train_set): %d" % len(train_set)
        print " ++ type(train_set): %s" % type(train_set)

        test_set = corpus.get_test_set()

        print " ++ len(test_set): %d" % len(test_set)
        print " ++ type(test_set): %s" % type(test_set)

        # test_set
        qtde_pos = 0
        qtde_neg = 0
        for features in test_set:

            if features[1] == 'pos':
                qtde_pos += 1
            elif features[1] == 'neg':
                qtde_neg += 1

            # print " ++ features[1]: ", features[1]

        print "Quantidade de documentos positivos em 'test_set': %d" % qtde_pos
        print "Quantidade de documentos negativos em 'test_set': %d" % qtde_neg'''

        classificador = NaiveBayesClassifier.train(train_set)
        print " -- Classificador treinado com sucesso."

        minuto_fim = datetime.now().minute

        tempo_decorrido = minuto_fim - minuto_incio

        print "-- Tempo decorrido: %s minutos." % str(tempo_decorrido)

        return classificador
Example #4
0
    def __init__(self):
        # Commands disponiveis.
        # Regras de negócio para processar os documentos.
        # Existe uma ordem correta de processamento das regras,
        # portanto a ordem das regras nessa lista é importante.
        #
        # No momento, notações como 'emoticon_feliz' e 'simbolo_monetario'
        # também são alterados pelo stemmer.

        # Processar 'DivideCamelCaseCommand' antes de 'ProcessaNegacaoCommand',
        # evita erros como 'NAO_JKRowling'.
        self.regras_negocio = [CorrigeAbreviacaoContracaoCommand(),
                               RemoveRTCommand(),
                               CorrigeRisadaCommand(),
                               RemoveNumerosCommand(),
                               PadronizaSimboloMonetarioCommand(),
                               PadronizaLinksCommand(),
                               RemoveEmailCommand(),
                               ProcessaEmoticonsCommand(),
                               DivideCamelCaseCommand(),
                               ConverteLowerCaseCommand(),
                               # StemmerCommand(),
                               # ProcessaNegacaoCommand(),
                               RemovePontuacaoCommand(),
                               RemoveStopwordsCommand(),
                               RemoveEspacosExtraCommand()]

        '''self.regras_negocio = [StemmerCommand()]'''

        self._CLASSIFICADOR_PATH = "/home/lucas/Documents/mineracao_opiniao/classificadores_treinados/" \
                                   "naive_bayes_3860_resenhas_2015-09-25.00.52.23.944959.pickle"

        '''self._CLASSIFICADOR_PATH = "/home/lucas/Documents/mineracao_opiniao/classificadores_treinados/" \
                                   "naive_bayes_3860_resenhas_negacao_2015-10-10.16.54.27.113297.pickle"'''

        self._CORPUS_RAIZ = "/home/lucas/Documents/mineracao_opiniao/corpus_resenhas_livros_processadas"

        self._PATH_PALAVRAS_FREQUENTES_CORPUS = "/home/lucas/Documents/mineracao_opiniao/palavras_frequentes_corpus/" \
                                                "palavras_frequentes_2015-09-25.15.05.22.013713.pickle"

        # self._MODO_ANALISE_PROBABILISTICO = "modo_probabilistico"
        # self._MODO_ANALISE_DICIONARIO = "modo_dicionario"

        self._CORPUS = CorpusUtil(self._CORPUS_RAIZ)
Example #5
0
class Fachada(object):
    def __init__(self):
        # Commands disponiveis.
        # Regras de negócio para processar os documentos.
        # Existe uma ordem correta de processamento das regras,
        # portanto a ordem das regras nessa lista é importante.
        #
        # No momento, notações como 'emoticon_feliz' e 'simbolo_monetario'
        # também são alterados pelo stemmer.

        # Processar 'DivideCamelCaseCommand' antes de 'ProcessaNegacaoCommand',
        # evita erros como 'NAO_JKRowling'.
        self.regras_negocio = [
            CorrigeAbreviacaoContracaoCommand(),
            RemoveRTCommand(),
            CorrigeRisadaCommand(),
            RemoveNumerosCommand(),
            PadronizaSimboloMonetarioCommand(),
            PadronizaLinksCommand(),
            RemoveEmailCommand(),
            ProcessaEmoticonsCommand(),
            DivideCamelCaseCommand(),
            ConverteLowerCaseCommand(),
            # StemmerCommand(),
            # ProcessaNegacaoCommand(),
            RemovePontuacaoCommand(),
            RemoveStopwordsCommand(),
            RemoveEspacosExtraCommand()
        ]
        '''self.regras_negocio = [StemmerCommand()]'''

        self._CLASSIFICADOR_PATH = "/home/lucas/Documents/mineracao_opiniao/classificadores_treinados/" \
                                   "naive_bayes_3860_resenhas_2015-09-25.00.52.23.944959.pickle"
        '''self._CLASSIFICADOR_PATH = "/home/lucas/Documents/mineracao_opiniao/classificadores_treinados/" \
                                   "naive_bayes_3860_resenhas_negacao_2015-10-10.16.54.27.113297.pickle"'''

        self._CORPUS_RAIZ = "/home/lucas/Documents/mineracao_opiniao/corpus_resenhas_livros_processadas"

        self._PATH_PALAVRAS_FREQUENTES_CORPUS = "/home/lucas/Documents/mineracao_opiniao/palavras_frequentes_corpus/" \
                                                "palavras_frequentes_2015-09-25.15.05.22.013713.pickle"

        # self._MODO_ANALISE_PROBABILISTICO = "modo_probabilistico"
        # self._MODO_ANALISE_DICIONARIO = "modo_dicionario"

        self._CORPUS = CorpusUtil(self._CORPUS_RAIZ)

    """
    def coletar_documentos(self, palavras_chave=['dilma', 'lula'],
                           qtde_tweets=50, dir_destino=""):
        '''Coleta uma porção de tweets que mencionam
        determinada entidade, salvando cada tweet coletado
        em um arquivo de texto, no direório especificado.
        '''
        coleta_tr = ColetaTempoReal(palavras_chave=palavras_chave,
                                    qtde_tweets=qtde_tweets,
                                    dir_destino=dir_destino,
                                    idiomas=['pt'])
        coleta_tr.coletar_tweets()
        
        return True
    """

    def analisar_sentimento_documento(self, texto):
        # Instancia um documento com o texto recebido por parametro
        documento = Documento(texto, None, self._CORPUS, "nome")

        # Processa o documento, antes de analisar o sentimento deste
        documento = self.processar_documento(documento)

        # Abre classificador
        classificador = ClassificadorUtil().abrir_classificador_treinado(
            self._CLASSIFICADOR_PATH)

        # Abre o arquivo com as palavras frequentes do corpus
        palavras_frequentes = self._CORPUS.abrir_arquivo_palavras_frequentes(
            self._PATH_PALAVRAS_FREQUENTES_CORPUS)
        # palavras_frequentes = None

        # Analisa o sentimento do texto do documento e o retorna
        sentimento = classificador.classify(
            Documento.get_features(documento, palavras_frequentes))

        documento.categoria = sentimento

        return documento

    @staticmethod
    def treinar_classificador(raiz_corpus):
        """Documentar
        """
        minuto_incio = datetime.now().minute

        corpus = CorpusUtil(raiz_corpus)

        train_set = corpus.get_train_set()
        '''print " ++ len(train_set): %d" % len(train_set)
        print " ++ type(train_set): %s" % type(train_set)

        test_set = corpus.get_test_set()

        print " ++ len(test_set): %d" % len(test_set)
        print " ++ type(test_set): %s" % type(test_set)

        # test_set
        qtde_pos = 0
        qtde_neg = 0
        for features in test_set:

            if features[1] == 'pos':
                qtde_pos += 1
            elif features[1] == 'neg':
                qtde_neg += 1

            # print " ++ features[1]: ", features[1]

        print "Quantidade de documentos positivos em 'test_set': %d" % qtde_pos
        print "Quantidade de documentos negativos em 'test_set': %d" % qtde_neg'''

        classificador = NaiveBayesClassifier.train(train_set)
        print " -- Classificador treinado com sucesso."

        minuto_fim = datetime.now().minute

        tempo_decorrido = minuto_fim - minuto_incio

        print "-- Tempo decorrido: %s minutos." % str(tempo_decorrido)

        return classificador

    def processar_documentos_corpus(self, documentos, diretorio_destino):
        """Passa todos os documentos de um corpus, por
         todas as regras de negócio de processamento.
        """
        qtde_docs_processados = 0
        porcentagem_processada = 0
        for documento in documentos:
            doc_processado = documento  # Cópia do documento a ser processada

            # print "\n\n"

            # print doc_processado.nome
            # Passa por todas as regras de negócio
            for cmd in self.regras_negocio:
                # print "  -- Command: %s" % cmd.__class__.__name__

                doc_processado = cmd.execute(doc_processado)

                # print doc_processado.texto

            ArquivoUtil().gravar_documento_processado(doc_processado,
                                                      diretorio_destino)

            qtde_docs_processados += 1

            porcentagem_corrente = qtde_docs_processados * 100 / len(
                documentos)

            if porcentagem_processada != porcentagem_corrente:
                porcentagem_processada = porcentagem_corrente
                print "%s%% dos documentos foram processados." % str(
                    porcentagem_processada)
            # documentos_processados.append(doc_processado)

        return True

    def processar_documento(self, documento):
        """Documentar
        """
        doc_processado = documento

        for cmd in self.regras_negocio:
            print "  -- Command: %s" % cmd.__class__.__name__

            doc_processado = cmd.execute(doc_processado)
            print doc_processado.texto

            print "\n"

        return doc_processado
Example #6
0
class Fachada(object):
    def __init__(self):
        # Commands disponiveis.
        # Regras de negócio para processar os documentos.
        # Existe uma ordem correta de processamento das regras,
        # portanto a ordem das regras nessa lista é importante.
        #
        # No momento, notações como 'emoticon_feliz' e 'simbolo_monetario'
        # também são alterados pelo stemmer.

        # Processar 'DivideCamelCaseCommand' antes de 'ProcessaNegacaoCommand',
        # evita erros como 'NAO_JKRowling'.
        self.regras_negocio = [CorrigeAbreviacaoContracaoCommand(),
                               RemoveRTCommand(),
                               CorrigeRisadaCommand(),
                               RemoveNumerosCommand(),
                               PadronizaSimboloMonetarioCommand(),
                               PadronizaLinksCommand(),
                               RemoveEmailCommand(),
                               ProcessaEmoticonsCommand(),
                               DivideCamelCaseCommand(),
                               ConverteLowerCaseCommand(),
                               # StemmerCommand(),
                               # ProcessaNegacaoCommand(),
                               RemovePontuacaoCommand(),
                               RemoveStopwordsCommand(),
                               RemoveEspacosExtraCommand()]

        '''self.regras_negocio = [StemmerCommand()]'''

        self._CLASSIFICADOR_PATH = "/home/lucas/Documents/mineracao_opiniao/classificadores_treinados/" \
                                   "naive_bayes_3860_resenhas_2015-09-25.00.52.23.944959.pickle"

        '''self._CLASSIFICADOR_PATH = "/home/lucas/Documents/mineracao_opiniao/classificadores_treinados/" \
                                   "naive_bayes_3860_resenhas_negacao_2015-10-10.16.54.27.113297.pickle"'''

        self._CORPUS_RAIZ = "/home/lucas/Documents/mineracao_opiniao/corpus_resenhas_livros_processadas"

        self._PATH_PALAVRAS_FREQUENTES_CORPUS = "/home/lucas/Documents/mineracao_opiniao/palavras_frequentes_corpus/" \
                                                "palavras_frequentes_2015-09-25.15.05.22.013713.pickle"

        # self._MODO_ANALISE_PROBABILISTICO = "modo_probabilistico"
        # self._MODO_ANALISE_DICIONARIO = "modo_dicionario"

        self._CORPUS = CorpusUtil(self._CORPUS_RAIZ)

    """
    def coletar_documentos(self, palavras_chave=['dilma', 'lula'],
                           qtde_tweets=50, dir_destino=""):
        '''Coleta uma porção de tweets que mencionam
        determinada entidade, salvando cada tweet coletado
        em um arquivo de texto, no direório especificado.
        '''
        coleta_tr = ColetaTempoReal(palavras_chave=palavras_chave,
                                    qtde_tweets=qtde_tweets,
                                    dir_destino=dir_destino,
                                    idiomas=['pt'])
        coleta_tr.coletar_tweets()
        
        return True
    """

    def analisar_sentimento_documento(self, texto):
        # Instancia um documento com o texto recebido por parametro
        documento = Documento(texto, None, self._CORPUS, "nome")

        # Processa o documento, antes de analisar o sentimento deste
        documento = self.processar_documento(documento)

        # Abre classificador
        classificador = ClassificadorUtil().abrir_classificador_treinado(self._CLASSIFICADOR_PATH)

        # Abre o arquivo com as palavras frequentes do corpus
        palavras_frequentes = self._CORPUS.abrir_arquivo_palavras_frequentes(self._PATH_PALAVRAS_FREQUENTES_CORPUS)
        # palavras_frequentes = None

        # Analisa o sentimento do texto do documento e o retorna
        sentimento = classificador.classify(Documento.get_features(documento, palavras_frequentes))

        documento.categoria = sentimento

        return documento

    @staticmethod
    def treinar_classificador(raiz_corpus):
        """Documentar
        """
        minuto_incio = datetime.now().minute

        corpus = CorpusUtil(raiz_corpus)

        train_set = corpus.get_train_set()

        '''print " ++ len(train_set): %d" % len(train_set)
        print " ++ type(train_set): %s" % type(train_set)

        test_set = corpus.get_test_set()

        print " ++ len(test_set): %d" % len(test_set)
        print " ++ type(test_set): %s" % type(test_set)

        # test_set
        qtde_pos = 0
        qtde_neg = 0
        for features in test_set:

            if features[1] == 'pos':
                qtde_pos += 1
            elif features[1] == 'neg':
                qtde_neg += 1

            # print " ++ features[1]: ", features[1]

        print "Quantidade de documentos positivos em 'test_set': %d" % qtde_pos
        print "Quantidade de documentos negativos em 'test_set': %d" % qtde_neg'''

        classificador = NaiveBayesClassifier.train(train_set)
        print " -- Classificador treinado com sucesso."

        minuto_fim = datetime.now().minute

        tempo_decorrido = minuto_fim - minuto_incio

        print "-- Tempo decorrido: %s minutos." % str(tempo_decorrido)

        return classificador

    def processar_documentos_corpus(self, documentos, diretorio_destino):
        """Passa todos os documentos de um corpus, por
         todas as regras de negócio de processamento.
        """
        qtde_docs_processados = 0
        porcentagem_processada = 0
        for documento in documentos:
            doc_processado = documento  # Cópia do documento a ser processada

            # print "\n\n"

            # print doc_processado.nome
            # Passa por todas as regras de negócio
            for cmd in self.regras_negocio:
                # print "  -- Command: %s" % cmd.__class__.__name__

                doc_processado = cmd.execute(doc_processado)

                # print doc_processado.texto

            ArquivoUtil().gravar_documento_processado(doc_processado, diretorio_destino)

            qtde_docs_processados += 1

            porcentagem_corrente = qtde_docs_processados * 100 / len(documentos)

            if porcentagem_processada != porcentagem_corrente:
                porcentagem_processada = porcentagem_corrente
                print "%s%% dos documentos foram processados." % str(porcentagem_processada)
            # documentos_processados.append(doc_processado)

        return True

    def processar_documento(self, documento):
        """Documentar
        """
        doc_processado = documento

        for cmd in self.regras_negocio:
            print "  -- Command: %s" % cmd.__class__.__name__

            doc_processado = cmd.execute(doc_processado)
            print doc_processado.texto

            print "\n"

        return doc_processado
Example #7
0
import codecs
import os
from random import shuffle
from util.arquivo_util import ArquivoUtil

if __name__ == '__main__':
    # texto = raw_input("Resenha: ")

    raiz_corpus = "/home/lucas/Documents/mineracao_opiniao/corpus_resenhas_livros_processado_sem_stem_e_negacao"

    classificador_path = "/home/lucas/Documents/mineracao_opiniao/classificadores_treinados/" \
                         "classificadores_resenhas_livros/" \
                         "classificador_naive_bayes_resenhas_livros_3860_sem_stem_negacao_2015-09-23.16.17.32.802909.pickle"

    nova_fachada = Fachada()
    corpus = CorpusUtil(raiz_corpus)

    # texto = "Excelente livro, recomendo! Muito bom, vale a pena."
    '''texto = """Quando terminei de ler o livro fiquei admirada com o autor! Ele é simplesmente magnifico.
     Não vou negar que depois de começar a ler a segunda parte da obra fiquei entediada, mas não fui
     capaz de abandona-la, ainda bem, mas quando cheguei no final do livro entendi o motivo da segunda
     parte. O livro é muito bem bolado e vale a pena ler!"""'''

    documentos_path = raiz_corpus + "/pos"

    nomes = os.listdir(documentos_path)
    shuffle(nomes)

    documentos = []
    for nome_documento in nomes:
        if nome_documento.endswith('.txt'):
Example #8
0
__author__ = 'lucas'

from util.corpus_util import CorpusUtil
import pickle

if __name__ == "__main__":

    corpus_raiz = "/home/lucas/Documents/mineracao_opiniao/corpus_resenhas_livros_processadas"
    corpus = CorpusUtil(corpus_raiz)
    palavras_frequentes = corpus.gravar_palavras_frequentes()
Example #9
0

def calcular_media_aritmetica(lista_numeros):
    soma = 0
    for numero in lista_numeros:
        soma += numero

    media_aritmetica = soma / len(lista_numeros)

    return media_aritmetica


if __name__ == '__main__':
    raiz_corpus = "/home/lucas/Documents/mineracao_opiniao/corpus_resenhas_livros"

    corpus = CorpusUtil(raiz_corpus)
    features_set = corpus.get_featuresets()
    cv = cross_validation.KFold(len(features_set), n_folds=10)

    acuracias = []

    i = 1
    for train_range_indices, test_range_indices in cv:
        print "-- Treinando classificador."
        classificador = NaiveBayesClassifier.train(features_set[train_range_indices[0]:train_range_indices[-1]])

        print "-- Calculando acuracia."
        acuracia = accuracy(classificador, features_set[test_range_indices[0]:test_range_indices[-1]])

        print '--- acuracia fold %d: %s.' % (i, str(acuracia))
Example #10
0

def calcular_media_aritmetica(lista_numeros):
    soma = 0
    for numero in lista_numeros:
        soma += numero

    media_aritmetica = soma / len(lista_numeros)

    return media_aritmetica


if __name__ == '__main__':
    raiz_corpus = "/home/lucas/Documents/mineracao_opiniao/corpus_resenhas_livros"

    corpus = CorpusUtil(raiz_corpus)
    features_set = corpus.get_featuresets()
    cv = cross_validation.KFold(len(features_set), n_folds=10)

    acuracias = []

    i = 1
    for train_range_indices, test_range_indices in cv:
        print "-- Treinando classificador."
        classificador = NaiveBayesClassifier.train(
            features_set[train_range_indices[0]:train_range_indices[-1]])

        print "-- Calculando acuracia."
        acuracia = accuracy(
            classificador,
            features_set[test_range_indices[0]:test_range_indices[-1]])