Curso de Introdução à Análise de Sentimentos

Olá, pessoal! Tudo bem com todos e todas?

Venho aqui para divulgar o curso da PROGNIT de Introdução à Análise de Sentimentos. O curso é voltado para iniciantes na área, então não há necessidade de ter conhecimento prévio sobre Análise de Sentimentos ou Machine Leaning. O único pré-requisito é ter conhecimento sobre alguma linguagem de programação.

Para quem prefere um abordagem prática, focada na implementação, este curso é ideal!

Dê uma conferida no site e garanta a sua vaga:

Curso de Introdução à Análise de Sentimentos

Exemplo simples de Sistema Multiagentes em Java

Olá pessoal,

Neste post irei apresentar um exemplo simples de um Sistema Multiagentes (SMA) implementado em Java utilizando o Eclipse. Um SMA representa um sistema que possui um conjunto de agentes que interagem um ambiente comum. Um agente (inteligente), por sua vez, é uma entidade que pode perceber o ambiente no qual está inserido, reagir e se comunicar com outros agentes.

Um exemplo de SMA é um ambiente de jogos. Além do personagem do jogador, um jogo é composto também de personagens que possuem “vida própria” e objetivos. Cada um desses outros personagens que agem por conta própria podem ser considerados como agentes.

Bom, aqui irei apresentar uma implementação simples de um SMA. Neste exemplo, dois agentes irão ter um pequeno diálogo:

Agente 1: “Olá. Meu nome é Maria.”
Agente 2: “Olá. Meu nome é João”.
Agente 2: “Olá. Como vai você?”
Agente 1: “Bem e você?”
Agente 2: “Eu vou bem também”

Para esta implementação, iremos utilizar o framework JADE e o software Eclipse. JADE (Java Agent Development Framework) é um framework Java que implementa os princípios de um SMA de acordo com as especificações da FIPA (The Foundation of Intelligent Physical Agents). Faça o download do arquivo jadeBin aqui.

Os agentes implementados através do framework JADE possuem um ciclo de vida. Este ciclo é apresentado na figura abaixo:

Na figura do ciclo de vida, cinco métodos são destacados em vermelho: setup(), doDelete(), action(), done() e takedown(). Para a implementação mínima de um agente, estes métodos devem conter alguma lógica definida. Em resumo, o raciocínio pode ser:

setup(): o que acontecerá na inicialização?
doDelete(): o agente deve permanecer vivo?
action(): qual ação (comportamento) o agente irá executar?
done(): tarefa finalizada?
takedown(): encerrar a vida do agente.

Dessa forma, organizando estes métodos em três estados gerais, pode-se dizer que a área (1) representa a inicialização do agente, a área (2) o desenvolvimento da vida do agente (execução de suas ações) e a área (3) o fim da vida do agente.

Vamos então começar a implementação. Crie um novo projeto (Java Project) no Eclipse e adicione o arquivo jade.jar ao projeto. Para tanto, clique com o botão direito do mouse no projeto, selecione Build Path e em seguida Add External Archives. Navegue até a pasta onde você descompactou o arquivo jadeBin e selecione o arquivo jade.jar (localizado na pasta lib).

Feito isso, vamos implementar o primeiro agente: a Maria. Para tanto, crie duas classes Java. Uma se chamará ComportamentoMaria e a outra AgenteMaria. A classe ComportamentoMaria irá implementar as ações que a agente Maria irá executar. A classe AgenteMaria irá implementar a inicialização da agente em si.


import jade.core.Agent;

public class AgenteMaria extends Agent{
  private static final long serialVersionUID = 1L;

  protected void setup(){
    //agente se apresenta
    System.out.println(this.getLocalName() + " diz: Olá. Meu nome é "+ this.getLocalName());
    //definição do comportamento que a agente Maria irá executar
    addBehaviour(new ComportamentoMaria(this));
  }
}


import jade.core.Agent;
import jade.core.behaviours.SimpleBehaviour;
import jade.lang.acl.ACLMessage;
import jade.lang.acl.MessageTemplate;

public class ComportamentoMaria extends SimpleBehaviour{
  private static final long serialVersionUID = 1L;
  private static final MessageTemplate mt = MessageTemplate.MatchPerformative(ACLMessage.REQUEST);
  ACLMessage msgAgente;
  int contMaria = 0; //conta quantas mensagens já foram enviadas pela agente Maria

  public ComportamentoMaria(Agent agent) {
    super (agent);
  }

  @Override
  public void action() {
    //agente irá verificar se alguma mensagem foi enviada a ela
    msgAgente = myAgent.receive(mt);
    if (msgAgente != null) {
      System.out.println(msgAgente.getContent());
      enviaMsg();
    } else {
      this.block();
    }
  }

  private void enviaMsg(){
    ACLMessage msg = new ACLMessage(ACLMessage.REQUEST);
    msg.addReceiver(msgAgente.getSender());
    msg.setContent(myAgent.getLocalName() + " diz: Bem e você?");
    myAgent.send(msg);
  }

  @Override
  public boolean done() {
    if (contMaria == 3)
      myAgent.doDelete();
    else
      contMaria++;

    return false;
  }
}

A classe AgenteMaria irá implementar o método setup(), ou seja, irá definir as regras de inicialização da agente. Neste exemplo, a agente irá se apresentar e irá determinar a classe que irá definir suas ações.

A classe ComportamentoMaria irá implementar os métodos action(), done(), doDelete() e herdar a classe SimpleBehaviour. Comportamentos do tipo SimpleBehaviour são utilizados quando o agente irá executar uma única tarefa que não poderá ser interrompida [1].

A comunicação entre os agente acontecerá via ACLMessage (Agente Comunication Language), uma implementação que segue a FIPA ACL Message Structure Specification [2].

Agora crie mais duas classes: ComportamentoJoao e AgenteJoao. A primeira irá implementar as ações do agente João e a segunda será o agente João em si. Os códigos utilizados para o agente João são semelhantes aos utilizados para a agente Maria.


import jade.core.Agent;

public class AgenteJoao extends Agent {
  private static final long serialVersionUID = 1L;

  protected void setup(){
    //linha de apresentação
    System.out.println(this.getLocalName() + " diz: Olá. Meu nome é "+ this.getLocalName());
    addBehaviour(new ComportamentoJoao(this));
  }
}


import jade.core.AID;
import jade.core.Agent;
import jade.core.behaviours.SimpleBehaviour;
import jade.lang.acl.ACLMessage;
import jade.lang.acl.MessageTemplate;

public class ComportamentoLucia extends SimpleBehaviour{
  private static final long serialVersionUID = 1L;
  private static final MessageTemplate mt = MessageTemplate.MatchPerformative(ACLMessage.REQUEST);
  ACLMessage msgAgente;
  int contJoao = 0; //conta quantas mensagens já foram enviadas pelo agente João

  public ComportamentoLucia(Agent agent) {
    super (agent);
  }

  @Override
  public void action() {
    if (contJoao == 0){ //para a primeira mensagem da conversa entre os agentes
      enviaPrimeiraMsg();
    } else {
      msgAgente = myAgent.receive(mt);
      if (msgAgente!= null) {
        System.out.println(msgAgente.getContent());
        enviaMsg();
      } else {
        this.block();
      }
    }
  }

  private void enviaPrimeiraMsg(){
    //definição do agente que irá conversar com o João
    AID agenteRecebedor = new AID ("maria", AID.ISLOCALNAME);
    ACLMessage priMsgAgente = new ACLMessage(ACLMessage.REQUEST);
    priMsgAgente.addReceiver(agenteRecebedor);
    priMsgAgente.setContent(myAgent.getLocalName() + " diz: Olá! Como vai você?");
    myAgent.send(priMsgAgente);
  }

  private void enviaMsg(){
    ACLMessage msg = new ACLMessage(ACLMessage.REQUEST);
    msg.addReceiver(msgAgente.getSender());
    msg.setContent(myAgent.getLocalName() +" diz: Eu vou bem também!");
    myAgent.send(msg);
  }

  @Override
  public boolean done() {
    if (contJoao == 1)
      myAgent.doDelete();
    else
      contJoao++;

    return false;
  }
}

Vocês devem ter observado que o método takeDown() não foi implementado em nenhuma das classes. Isto acontece, pois este método já é chamado pelo framework no momento em que é encerrada a vida do agente [3].

Com o código todo implementado, vamos ao passo final antes da execução. Precisamos alterar as configurações de execução. Para tanto, clique com o botão direito do mouse no projeto, selecione Run As e em seguida Run Configurations. Aplique as seguintes configurações:

Na aba Main, no campo Main class , preencha com jade.Boot . Na aba Arguments , no campo Program arguments , preencha com -agents maria:.AgenteMaria;joao:.AgenteJoao .

Aplique as alterações e execute o projeto. Você irá ver na sua tela do console esta saída:

É isso pessoal. Espero que este exemplo tenha sido útil para vocês.

Até mais!

Referências:

[1] http://jade.tilab.com/doc/api/jade/core/behaviours/SimpleBehaviour.html
[2] http://jade.tilab.com/doc/api/jade/lang/acl/ACLMessage.html
[3] http://jade.tilab.com/doc/programmersguide.pdf

Filme sobre a Grace Hopper – The Queen of Code

Oi pessoal,

Primeiramente, Feliz 2015 a todos vocês! Que 2015 seja um ano de muito sucesso!! =)

E este ano começou com uma notícia maravilhosa para quem levanta a bandeira da igualdade de gênero na tecnologia. A história da computação (e de toda tecnologia) é repleta de participação feminina. Grandes mulheres que contribuíram fortemente para avanços tecnológicos. Infelizmente, a história se esqueceu de várias dessas mulheres. Lembramos de grandes homens como Allan Turing, Charles Babbage, Bill Gates, Steve Jobs, Linus Torvalds, Tim Bernes-Lee, mas as grandes mulheres foram esquecidas. A única da qual se fala é Ada Byron, mas até ela é pouco conhecida.

E é por isso que a contribuição da atriz norte-americana Gillian Jacobs é tão significativa. Ela dirigiu o documentário The Queen of Code, de mais ou menos 16min, sobre a genial Grace Hopper.


Gillian Jacobs


Grace Hopper

Grace Hopper foi uma matemática que colaborou grandemente para o crescimento da computação. Seus principais feitos estão associados a criação da linguagem COBOL (utilizada até os dias atuais) e dos compiladores. Um texto sobre a Grace ganhará um espaço aqui neste blog em breve! =)

Enquanto isso, conheçam o ótimo trabalho da Gillian ao apresentar ao público Grace Hopper. Infelizmente não achei uma versão com legendas em português. Assim que encontrar, atualizarei este post.

O vídeo pode ser acessado aqui: http://espn.go.com/video/clip?id=12205119

Até a próxima!

[Filme] Downloaded – A Saga do Napster

Oi Pessoal,

Dia desses assisti ao filme “Downloaded – A Saga do Napster”, dirigido por Alex Winter.

filme napster

Trata-se de um documentário que conta a história do Napster, um software de compartilhamento de arquivos via P2P, e de seus principais criadores, Shawn Fanning e Sean Parker. A narrativa começa com a história do nascimento do Napster, passando pelo boom do sucesso do compartilhamento de músicas via P2P até o seu fim diante de muitas batalhas judiciais. O documentário finaliza apresentando o que os criadores fazem nos dias atuais.


Shawn Fanning

Sean Parker

Na minha opinião, o Napster foi um divisor de águas na história da indústria fonográfica. Apesar de ter perdido a batalha contra empresas gigantes, o legado deixado por este software foi uma mudança cultural e uma quebra de monopólio: ele abriu as portas para uma nova forma de comercializar e consumir música.

napster_logo

Ouvi algumas pessoas comentarem que o filme é lento e meio tedioso. Para mim, o documentário foi bem construído e consegue transmitir informações importantíssimas. Recomendo a todos!

Para quem quiser conhecer um pouco mais, segue o trailer do filme:

Bom filme!! =)

Conexão Java x HSQLDB

Olá pessoal,

Precisei nestes últimos dias realizar uma conexão entre uma aplicação java e um banco criado em HSQLDB. Queria deixar aqui três dicas que me fizeram perder um bom tempo de trabalho…

1. O erro: “User lacks privilege or object not found:” (nome da tabela)

Pesquisei bastante em muitos fóruns e concluí que “cada caso era um caso”. Para algumas pessoas era o simples erro de escrita na tabela, para outras era por que a conexão estava aberta no HSQLDB Manager (utilize o comando SHUTDOWN para encerrar a conexão sem fechar o Manager). No meu caso era o apontamento para o banco de dados.

Eu estava usando:

String username = "SA";
String password = "";
String url="jdbc:hsqldb:file:bdusuarios";

connection = DriverManager.getConnection(url,username,password);

Ou seja, não estava informando o caminho completo para o banco. Somente alterei o caminho e funcionou:

String username = "SA";
String password = "";
String url="jdbc:hsqldb:file:Z://app//bd//bdusuarios";

connection = DriverManager.getConnection(url,username,password);

2. Autoincrement nos campos ID

Para definir que um campo é autoincrement, o comando é:
CREATE TABLE USUARIOS (ID INTEGER NOT NULL GENERATED ALWAYS AS IDENTITY, NOME_COMPLETO VARCHAR(100))

Para este caso, o campo ID será autoincrement.

3. Comando SHOW TABLES

Para listar todas as tabelas de um banco:

SELECT * FROM INFORMATION_SCHEMA.SYSTEM_TABLES where TABLE_TYPE='TABLE'

É isso pessoal! Espero que seja útil para vocês.

Até mais! =)

Listar canal de usuário do Youtube com PHP e JSON

Olá a todos!

Depois de muito tempo, vamos a mais um post. E este é sobre recuperar os dados do canal de um usuário do youtube utilizando PHP e JSON. Felizmente isso é bem tranquilo de fazer.

O primeiro passo é identificar o endereço feed do canal do usuário. Este endereço possui o seguinte padrão:

http://gdata.youtube.com/feeds/api/users/identificadordousuario/uploads?alt=json

Feito isso, o resto é tranquilo. O código abaixo mostra como recuperar algumas informações e apresentá-las em uma simples tabela:


<?php
header ('Content-type: text/html; charset=iso-8859-1');
$JSON_Data = @json_decode(file_get_contents('http://gdata.youtube.com/feeds/api/users/id_do_usuario/uploads?alt=json'), TRUE);
?>
<html>
<head>
</head>
<body>
<table border="1">
<tr>
<td> Imagem </td>
<td> Título </td>
<td> Descrição </td>
<td> Link </td>
<td> Total de Visualizações</td>
</tr>
<?php
foreach($JSON_Data['feed']['entry'] as $item){
?>
<tr>
<td><img src="<?=$item['media$group']['media$thumbnail'][1]['url']; ?>"></td>
<td><?=utf8_decode($item['title']['$t']);?></td>
<td><?=utf8_decode($item['content']['$t']);?></td>
<td><?=$item['media$group']['media$content'][0]['url'];?></td>
<td><?=$item['yt$statistics']['viewCount'];?></td>
</tr>
<?php
}
?>
</table>
</body>
</html>

É isso pessoal! Espero que este código seja útil a vocês.

Até a próxima!

Reduzir Imagem em PHP

Olá Pessoal,

Depois de muito tempo sem postar, estou de volta! E, felizmente, com mais tempo disponível para o blog! =)

Bom, semana passada precisei de um código em PHP que reduzisse o tamanho de uma imagem. Considerando que o usuário não deveria ter o trabalho de fazer isso em um software e só depois fazer upload no sistema, pesquisei e inseri o código.


$diretorio_original = "imagem_original/";
$diretorio_pequena = "imagem_pequena/";

// Se uma imagem foi enviada
if($_FILES['txt_imagem']['name'] != ''){
$ext = explode('.',$_FILES['txt_imagem']['name']);
$ext = $ext[count($ext)-1];
// Se a extensao for de um tipo valido
if(preg_match('/(gif|jpg|jpeg|png)/i',$ext)){
$nome_original = 'original_'.$_FILES['txt_imagem']['name'];
$nome_pequena = 'pequena_'.$_FILES['txt_imagem']['name'];

$caminho_original = $diretorio_original.$nome_original;
$caminho_pequena = $diretorio_pequena.$nome_pequena;

if(move_uploaded_file($_FILES['txt_imagem']['tmp_name'], $caminho_original)){
chmod($caminho_original, 0644);

//pega os valores da largura, altura e tipo da imagem
list($largura,$altura,$tipo) = getimagesize($caminho_original);

if ($tipo == 1) // gif
$imagem = imagecreatefromgif($caminho_original);
else if ($tipo == 2) // jpeg
$imagem = imagecreatefromjpeg($caminho_original);
else if ($tipo == 3) //png
$imagem = imagecreatefrompng($caminho_original);

$thumb = imagecreatetruecolor(128, 90);

imagecopyresampled($thumb, $imagem, 0, 0, 0, 0, 128, 90, $largura,$altura);
//reduz a imagem para 128 x 90

if ($tipo == 1) // gif
imagegif($thumb,$caminho_pequena);
else if ($tipo == 2) // jpeg
imagejpeg($thumb,$caminho_pequena);
else if ($tipo == 3) //png
imagepng($thumb,$caminho_pequena);

echo "Imagem reduzida com sucesso em ".$diretorio_original." e ".$diretorio_pequena;

} else {
echo "imagem não enviada!";
}
} else{
echo "extensão inválida";
}
} else {
echo "imagem não carregada!";
}

Baixe a versão simplificada aqui! =)

Até mais!