Sentiment Analysis membantu Anda untuk memahami apakah topic yang dibicarakan orang-orang penting atau tidak. Aplikasi yang akan kita bangun mengambil sebuah keyword kemudian mencocokkannya dengan tweet seseorang dalam Twitter. Aplikasi menggunakan module dari NodeJS yang bisa melakukan scoring/penilaian terhadap teks dari tweet tersebut dan menampilkan statistik nya.

Teknologi

Teknologi-teknologi yang kita gunakan dalam membangun aplikasi ini adalah :

  • Nodejs
  • Express sebagai server
  • jQuery untuk manipulasi DOM dari sisi client
  • Slush generator yaitu slush-express untuk scaffolding project
  • diskDB sebagai database untuk menyimpan hasilnya
  • module Twitter untuk menghubungkan ke Twitter
  • module Sentiment untuk melakukan analisis

Memulai Aplikasi

Buat folder dengan nama sentimentAnalysisApp dan buka terminal. Pertama kita akan menginstall Gulp, Slush, dan Express generator menggunakan perintah berikut :

npm i -g gulp slush slush-express

Kalau modulnya sudah diinstal, kita akan membuat scaffolding project Express dengan perintah:

slush express

Slush meminta Anda untuk memilih view engine dan stylesheet engine. Jawab seperti dibawah ini.
[?] Select a View Engine: HTML
[?] Select a Stylesheet Engine: CSS
Hanya menunggu beberapa menit untuk membuat scaffolding aplikasi dan menginstall dependency nya. Kira-kira hasil dari scaffolding nya terlihat seperti ini:

sentimentAnalysisApp
├── Gulpfile.js
├── app.js
├── bin
│ └── www
├── bower.json
├── package.json
├── public
│ └── stylesheets
│ └── style.css
├── routes
│ ├── index.js
│ └── users.js
└── views
├── error.html
└── index.html

Berikut penjelasan file dan foldernya :

  • bin/www – Untuk melakukan inisialisasi dan konfigurasi port.
  • app.js – Untuk konfigurasi server, routes, dan views,
  • gulpFile.js – Sebagai task runner project kita.
  • /routes – Berisi file untuk membuat route aplikasi.
  • /views – Berisi file untuk membuat tampilan aplikasi.

Anda bisa menjalankan aplikasi dengan perintah gulp. Express server akan menjalankannya pada port 3000. Buka browser http://localhost:3000 dan Anda akan melihat tampilan homepage.

Membuat Server

Pertama, kita menginstall beberapa dependency sebagai berikut :

npm install twitter sentiment –save

Selanjutnya, buat sebuah folder dengan anam logic pada root project. Buat duah buah file dengan nama twitterSearch.js dan sentimentAnalysis.js. File-file ini berisi sebuah logic untuk mengambil tweets dari twitter serta melakukan analisis terhadap tweets tersebut. Buat folder lagi dengan nama db, yang digunakan untuk menyimpan data.
Selanjutnya, buka routes/index.js menggunakan IDE/editor yang Anda sukai. Kita akan menambahkan route baru, POST /search. Teks yang dicari oleh user akan di submit ke route tersebut. Update routes/index.js as sebagai berikut :

'use strict';
var express = require('express');
var router = express.Router();
var twitterSearch = require('../logic/twitterSearch');

/* GET home page. */
router.get('/', function(req, res) {
  res.render('index');
});

router.post('/search', function(req, res) {
  twitterSearch(req.body.search, function (data) {
    res.json(data);
  });
});

module.exports = router;

Fungsi twitterSearch() untuk mencari dan mencocokkan dengan tweets dari Twitter.
Selanjutnya, open logic/twitterSearch.js tambahkan code berikut :

//includes
var util = require('util'),
    twitter = require('twitter'),
    sentimentAnalysis = require('./sentimentAnalysis'),
    db = require('diskdb');

db = db.connect('db', ['sentiments']);
//config
var config = {
  consumer_key: 'xxxxxxxxxxxxxxxxxxxxxxxxxxx',
  consumer_secret: 'xxxxxxxxxxxxxxxxxxxxxxxxxxx',
  access_token_key: 'xxxxxxxxxxxxxxxxxxxxxxxxxxx-xxxxxxxxxxxxxxxxxxxxxxxxxxx',
  access_token_secret: 'xxxxxxxxxxxxxxxxxxxxxxxxxxx'
};

module.exports = function(text, callback) {
  var twitterClient = new twitter(config);
  var response = [], dbData = []; // to store the tweets and sentiment

  twitterClient.search(text, function(data) {
    for (var i = 0; i < data.statuses.length; i++) {
      var resp = {};

      resp.tweet = data.statuses[i];
      resp.sentiment = sentimentAnalysis(data.statuses[i].text);
      dbData.push({
        tweet: resp.tweet.text,
        score: resp.sentiment.score
      });
      response.push(resp);
    };
    db.sentiments.save(dbData);
    callback(response);
  });
}

Kalau kita ingin mendapatkan tweets, kita harus melakukan registrasi sebuah app baru pada Twitter pada menu Developer. Kemudian baru bisa untuk men-generate key dan token.
Arahkan ke Twitter apps dan klik Create New App. Isi form nya. Kalau app sudah dibuat, kita akan men-generate token. Klik pada API Keys tabs, dan scroll ke bawah halaman. Kemudian klik Create my access token. Kalau sudah, Anda akan melihat pesan untuk melakukan refresh halaman, lanjutkan. Sekarang kita mendapatkan API key, API secret, Access token, dan Access token secret and dan copy pada:

var config = {
  consumer_key: 'API key',
  consumer_secret: 'API secret',
  access_token_key: 'Access token',
  access_token_secret: 'Access token secret'
};

Selanjutnya, buka logic/sentimentAnalysis.js dan tambahkan code berikut :

var sentiment = require('sentiment');

module.exports = function(text) {
  return sentiment(text);
};

Sederhana bukan…,Sekarang, ayo buat client nya.

Membuat Client

Buat sebuah fodler dengan nama scripts di dalam folder public. Dalam scripts, buat sebuah file dengan anama app.js dab buka dengan editor yang Anda sukai.
Lengkapi app.js dengan code berikut.

$(document).ready(function() {
  // handle the form submit
  $('#searchText').on('keypress', function(e) {
    if (e.which == 13 || e.keyCode == 13) {
      if ($(this).val().trim().length > 0) {
        // initiate an Ajax call to send the data
        fireAJAX($(this).val().trim());
      }
    }
  });

  function fireAJAX(text) {
    $.ajax({
      type: 'POST',
      url: '/search',
      data: {
        search: text
      },
      beforeSend: function(xhr) {
        $('.tweet-results').html('');
        $('.results').show();
        enableState();
      },
      success: parseData,
      error: oops
    });
  }

  function parseData(data) {
    disableState();
    var html = '';
    for (var i = 0; i < data.length; i++) {
      var s = data[i].sentiment,
          t = data[i].tweet;

      var _o = {
        imgSrc: t.user.profile_image_url,
        tweetLink: 'http://twitter.com/' + t.user.screen_name + '/status/' + t.id_str,
        tweet: t.text,
        score: s.score ? s.score : '--',
        comparative: s.comparative ? s.comparative : '--',
        favorited: t.favorite_count ? t.favorite_count : 0,
        retweet: t.retweet_count ? t.retweet_count : 0,
        wordsMatched: s.words && s.words.length ? s.words : '--',
        positiveWords: s.positive && s.positive.length ? s.positive : '--',
        negativeWords: s.negative && s.negative.length ? s.negative : '--'
      };

      html += tmpl('tweet_tmpl', _o);
    };
    $('.tweet-results').html(html);
  }

  function oops(data) {
    $('.error').show();
    disableState();
  }

  function disableState() {
    $('.loading').hide();
    $('#searchText').prop('disabled', false);
  }

  function enableState() {
    $('.loading').show();
    $('#searchText').prop('disabled', true);
  }
});

// Simple JavaScript Templating
// John Resig - http://ejohn.org/ - MIT Licensed
(function() {
  var cache = {};

  this.tmpl = function tmpl(str, data) {
    // Figure out if we're getting a template, or if we need to
    // load the template - and be sure to cache the result.
    var fn = !/\W/.test(str) ?
      cache[str] = cache[str] ||
      tmpl(document.getElementById(str).innerHTML) :

    // Generate a reusable function that will serve as a template
    // generator (and which will be cached).
    new Function("obj",
      "var p=[],print=function(){p.push.apply(p,arguments);};" +

      // Introduce the data as local variables using with(){}
      "with(obj){p.push('" +

      // Convert the template into pure JavaScript
      str
      .replace(/[\r\t\n]/g, " ")
      .split("{{").join("\t") // modified
      .replace(/((^|\}\})[^\t]*)'/g, "$1\r") // modified
      .replace(/\t=(.*?)}}/g, "',$1,'") // modified
      .split("\t").join("');") 
      .split("}}").join("p.push('") // modified
      .split("\r").join("\\'") + "');}return p.join('');");

    // Provide some basic currying to the user
    return data ? fn(data) : fn;
  };
})();

Selanjutnya, buka views/index.html tambahkan code berikut.
Line 1-26 :
1-26SentimentAnalysis
Line 27-55 :
27-55SentimentAnalytic
Line 56-71 :
56-71SA

Terakhir, open stylesheets/style.css tambahkan code berikut :

body {
  padding: 50px;
  font: 14px"Lucida Grande", Helvetica, Arial, sans-serif;
  background: #eee;
}
a {
  color: #00B7FF;
}
input {
  width: 98%;
  padding: 9px;
  font-size: 17px;
}
.results {
  display: none;
}
.error {
  color: red;
  display: none;
}
.tweet-results {
  width: 100%;
  overflow: hidden;
  padding-right: 18px;
}
.left {
  float: left;
  width: 39%;
}
.right {
  float: right;
  width: 55%;
  border-left: 1px dashed;
  padding-left: 21px;
}
article {
  background: #fff;
  display: block;
  padding: 18px;
  border: 1px solid #eee;
  margin-top: 21px;
  margin-bottom: 21px;
  overflow: hidden;
  box-shadow: 6px 4px 9px 1px rgba(119, 119, 119, 0.75);
  -moz-box-shadow: 6px 4px 9px 1px rgba(119, 119, 119, 0.75);
  -webkit-box-shadow: 6px 4px 9px 1px rgba(119, 119, 119, 0.75);
}
article img {
  width: 64px;
  float: left;
  margin:0 5px 0 0;
}
.right table {
  width: 100%;
}
.right table, .right table td {
  border: 1px solid;
}
.right table td {
  width: 50%;
}

Hore…!, Kita sudah selesai melakukan development. Ayo jalankan aplikasinya dan test langsung gak usa malu-malu. Balik lagi ke terminal, Jalankan perintah gulp untuk menghidupkan server. Arahkan ke http://localhost:3000/ Anda mlihat search bar. Ketikkan kata-kata positif berikut “This is Awesome” dan tekan enter, kira-kira hasilnya seperti ini :
First

2
3

Advertisements