Skip to content

MPMG-DCC-UFMG/2020-M04

Repository files navigation

M04: Análise de Sentimentos

Descrição

Ferramenta para determinar se textos livres em Português possuem conotação positiva, neutra ou negativa. Módulo adaptado para receber texto livre e textos/comentários de redes sociais.

Instalação e Execução

Padrão (Python3)

1 - O código foi desenvolvido utilizando Python3 e sua execução pode ser realizada a partir da sequência de passos descrita a seguir. Primeiramente, para utilizá-lo, basta clonar o repositório para uma pasta local.

git clone https://github.com/MPMG-DCC-UFMG/M04

2 - Em seguida, realize a instalação das bibliotecas necessárias. Para acessar lista completa de requisitos a instalar, ver requirements.txt.

pip3 install -r enelvo/requirements.txt
pip3 install nltk
pip3 install pandas
pip3 install kafka-python

É importante verificar se o Punkt Tokenizer Model já está presente. Caso contrário, inicie o python3 e instale-o da seguinte forma:

import nltk
nltk.download("punkt")

3 - Existem três formas de executar o programa, descritas a seguir. O script sentimento.py e os outros arquivos necessrios para a execução do programa estão localizados no diretório /dados01/workspace/ufmg.m04dcc/M04 .

A primeira maneira recebe o argumento -t (--text) para verificar a polaridade de sentenças passadas por parâmetro. O texto deve estar entre aspas. É um exemplo de execução.

python3 sentimento.py -t "Estou muito feliz :)"

A segunda maneira recebe o argumento -f (--file). Neste segundo caso, o programa recebe um texto corrido, sem a separação de sentenças por quebra de linha. Pode receber ainda múltiplos arquivos por parâmetro. São exemplos de execução.

python3 sentimento.py -f [fonte]/examplo.txt

python3 sentimento.py -f [fonte]/examplo.txt [fonte]/examplo_2.txt [fonte]/examplo_3.txt [...]

Finalmente, a terceira maneira recebe o argumento -c (--crawler). Este argumento foi criado especificamente para atender às necessidades de integração do módulo de sentimentos com os coletores de redes sociais. Esta chamada recebe ainda como parâmetro o tópico consumidor, produtor, um (ou uma lista) broker e o identificador do grupo (opcional). O padrão genérico de execução é apresentado a seguir.

python3 sentimento.py -c consumerTopic producerTopic host1:port1,host2:port2,....,hostN:portN groupId

Os três primeiros parâmetros são mandatórios. Se o identificador do grupo (quarto parâmetro) não for informado, um identificador de grupo aleatório será utilizado. Um exemplo de execução é mostrado a seguir. A partir desta execução, M04 irá consumir do tópico crawler_telegram_mensagem e produzir no tópico model_analise_sentimento_telegram_mensagem, utilizando como brokers os endereços hadoopdn-gsi-prod04.mpmg.mp.br:6667 e hadoopdn-gsi-prod05.mpmg.mp.br:6667. Um identificador de grupo aleatório é utilizado neste exemplo.

python3 sentimento.py -c crawler_telegram_mensagem model_analise_sentimento_telegram_mensagem hadoopdn-gsi-prod04.mpmg.mp.br:6667,hadoopdn-gsi-prod05.mpmg.mp.br:6667

Docker

É possível encapsular todo o processo de execução em containers do Docker. A instalação e ativação ocorreu a partir da execução dos seguintes comandos.

sudo yum-config-manager --setopt="docker-ce-stable.baseurl=https://download.docker.com/linux/centos/7/x86_64/stable" --save
sudo yum install docker-ce docker-ce-cli containerd.io
sudo yum install -y http://mirror.centos.org/centos/7/extras/x86_64/Packages/container-selinux-2.107-3.el7.noarch.rpm
sudo yum install -y https://download.docker.com/linux/centos/7/x86_64/stable/Packages/containerd.io-1.2.6-3.3.el7.x86_64.rpm
sudo yum install -y docker-ce docker-ce-cli
sudo systemctl enable docker.service
sudo systemctl start docker.service

Com o Docker ativo e o usuário dentro da pasta M04/, onde estão localizados os arquivos Dockerfile e docker-compose.yml, para instalar os recursos necessários para a execução do módulo e as suas dependências, execute o seguinte comando (caso já não o tenha feito). Com isso, o módulo de sentimentos estará pronto para utilização.

sudo docker-compose build

Com a instalação finalizada, os scripts do módulo de sentimentos estarão localizados em um container que se chama "m04_sentimento_python". A utilização do coletor com o Docker se diferencia um pouco da utilização normal de scripts Python supracitados. Dessa forma, o módulo pode ser executado das seguintes formas, por exemplo, a partir do uso dos três parâmetros distintos supracitados. O parâmetro -u após python3 em um dos exemplos é apenas para não armazenar saídas do teclado em buffer e sim imprimir os resultados direto na tela.

sudo docker run --rm m04_sentimento_python python3 sentimento.py -t "Estou feliz :)"

sudo docker run -v /datalake/ufmg/:/datalake/ufmg/ --rm m04_sentimento_python python3 sentimento.py -f /datalake/ufmg/m04/input/exemplo_input.txt

sudo docker run --rm m04_sentimento_python python3 -u sentimento.py -c crawler_telegram_mensagem model_analise_sentimento_telegram_mensagem hadoopdn-gsi-prod04.mpmg.mp.br:6667,hadoopdn-gsi-prod05.mpmg.mp.br:6667

Saídas

O módulo executado com o argumento -t retorna diretamente no console a conotação encontrada (ranking) e a polaridade (polarity) baseada na conotação (Muito Negativo, Negativo, Neutro, Positivo, Muito Positivo) para a sentença requerida. O resultado do processametno dos outros argumentos são armazenados dentro no diretório /datalake/ufmg/m04/ .

A execuço do módulo com o argumento -f para um determinado [fonte]/fileName.txt de entrada gera um arquivo JSON de mesmo nome no diretório /datalake/ufmg/m04/files/[fonte]/. O JSON possui a seguinte estrutura:

{
  "sentences": [
    {
      "text": "Café da manhã incrível, com opções  quentes saborosas, frutas diversas e bolos gostosos!",
      "position": {
        "start": 2901,
        "end": 2988,
        "length": 87
      },
      "ranking": 4,
      "polarity": "Muito Positivo"
    }
  ],
  "text": {
    "ranking": {
      "-4": 0,
      "-3": 0,
      "-2": 0,
      "-1": 0,
      "0": 0,
      "1": 0,
      "2": 0,
      "3": 0,
      "4": 1
    },
    "polarity": {
      "Muito Negativo": 0,
      "Negativo": 0,
      "Neutro": 0,
      "Positivo": 0,
      "Muito Positivo": 1
    },
    "overall_polarity": "Neutro"
  }
}

O arquivo JSON contém cada frase do texto separada dentro do subgrupo sentences, a posição dos caracteres de início (start) e término (end) no arquivo de entrada, o tamanho da sentença (length), a conotação encontrada (ranking) e a polarity baseada na conotação. Dentro do subgrupo text, os resultados considerando o texto de todo arquivo (não apenas as sentenças) são levados em conta, onde ranking e polarity apresentam o número de sentenças com os referidos scores, e overall_polarity determina a polaridade geral do texto.

No caso dos argumentos da execução utilizando o argumento -c, é escrito no tópico do Kafka o id da mensagem recebida do consumidor, e ranking e a polaridade referente a mensagem. O JSON possui a seguinte estrutura:

{
  "identificador": 123890,
  "sentiment": {
    "ranking": 2,
    "polarity": "Positivo"
  }
}

Releases

No releases published

Packages

No packages published