Selasa, 20 Maret 2018

Sentiment Analyst pada graph facebook menggunakan Python3, NLTK Analisa sentiment Vader dan visualisasi menggunakan matplotlib.

Kelompok:
-Andika Demas Riyandi 51414067
-Denny Aditya P 52414708
-M. Andika Nugraha 57414084
-Rendytio Arifian Puspito 59414055

Sentiment Analyst pada graph facebook menggunakan Python3, NLTK Analisa
sentiment Vader dan visualisasi menggunakan matplotlib.
Opinion Mining / Sentiment Analysis (sebagian besar researcher menganggap dua istilah ini
sama/interchangeable) merupakan sebuah cabang penelitian di domain Text Mining yang
mulai booming pada awal tahun 2002-an. Riset-nya mulai marak semenjak paper
dari B.Pang dan L.Lee [1] keluar. Secara umum, Sentiment analysis ini dibagi menjadi 2 kategori besar :
  • Coarse-grained sentiment analysis
  • Fined-grained sentiment analysis
Coarse-grained sentiment analysis - kita mencoba melakukan proses analysis pada level Dokumen.
Singkatnya adalah kita mencoba mengklasifikasikan orientasi sebuah dokumen secara keseluruhan.
Orientasi ini ada 3 jenih : Positif, Netral, Negatif. Akan tetapi, ada juga yang menjadikan nilai orientasi ini bersifat kontinu / tidak diskrit.
Fined-grained sentiment analysis - kategori kedua ini yang sedang Naik Daun sekarang. Maksudnya adalah para researcher sebagian
besar fokus pada jenis ini. Obyek yang ingin diklasifikasi bukan berada pada level dokumen melainkan sebuah kalimat pada
suatu dokumen.
contoh :
  • Saya tidak suka programming. (negatif)
  • Hotel yang baru saja dikunjungi sangat indah sekali. (positif)
Graph facebook merupakan API yang disediakan oleh Facebook. Untuk dapat menggunakan
Graph facebook diperlukan akun facebook guna mendapatkan Token API.


Untuk mendapatkan token dapat mengunjungi https://developers.facebook.com/tools-and-support/
 lalu pilih “Penjelajahan API Graf” kemudian pilih dapatkan token dan centang service yang diperlukan
Kemudian klik “Dapatkan token” dan lakukan Authenticate maka anda akan segera mendapatkan Token API
Gambar di atas merupakan Akses Token yang nantinya dapat digunakan pada code yang akan dibuat.
Disini kami akan melakukan Analisa pada halaman Facebook Eddie Griffin. Berikut adalah post yang akan
kami Analisa.
https://www.facebook.com/EddieGriffinOfficial/posts/10155290098795967

Sebelumnya kita akan mengambil semua komentar pada post tersebut, maka kami akan mencobanya
terlebih dahulu pada Graph facebook. Dengan versi 2.12. dengan code graph sebagai berikut.
Method GET -> /v2.12/ EddieGriffinOfficial untuk mengetahui ID dari halaman tersebut.

Gambar di atas merupakan Id dari halaman yang kita inginkan sedangkan Id post yang akan kita Analisa
adalah 10155290098795967. Maka untuk mendapatkan semua komentar dari post tersebut kita dapat
menggunakan
GET ->/v2.12/73107530966_10155290098795967/comments
Maka akan di dapatkan output sebagai berikut

Pada gambar di atas terdapat 407 komentar yang akan kami Analisa. Setelah itu kita akan menggunakan
Bahasa Python untuk mengambil semua data tersebut yang selanjutnya akan dibuatkan
file dalam bentuk .txt untuk di Analisa.
Berikut adalah code untuk melakukan pengambilan data atau disebut dengan data Scrapping.
import requests
import signal
import sys


graph_api_version = 'v2.12'


access_token = 'ISI DENGAN AKSES TOKEN'


user_id = '73107530966'


post_id = '10155290098795967'


url = 'https://graph.facebook.com/{}/{}_{}/comments'.format(graph_api_version, user_id, post_id)


comments = []



limit = 0


def write_comments_to_file(filename):
   print()


   if len(comments) == 0:
       print('No comments to write.')
       return


   with open(filename, 'w', encoding='utf-8') as f:
       for comment in comments:
           f.write(comment + '\n')
       print('Wrote {} comments to {}'.format(len(comments), filename))



def signal_handler(signal, frame):
   print('KeyboardInterrupt')
   write_comments_to_file('comments.txt')
   sys.exit(0)



signal.signal(signal.SIGINT, signal_handler)


r = requests.get(url, params={'access_token': access_token})
while True:
   data = r.json()


 
   if 'error' in data:
       raise Exception(data['error']['message'])



   for comment in data['data']:
       text = comment['message'].replace('\n', ' ')
       comments.append(text)


   print('Got {} comments, total: {}'.format(len(data['data']), len(comments)))


   if 0 < limit <= len(comments):
       break


   if 'paging' in data and 'next' in data['paging']:
       r = requests.get(data['paging']['next'])
   else:
       break


write_comments_to_file('comments.txt')

Pada kode di atas coment dalam bentuk graf akan disimpan dalam bentuk .txt
Gambar di atas merupakan proses dari scrapping data, dan berikut adalah output dari data yang telah di ambil
dalam bentuk .txt

Data yang akan dilakukan Analisa sudah tersedia maka selanjutnya akan dilakukan Analisa sentimental
menggunakan Natural Language Toolkit atau NLTK dengan metode Analisa sentiment Vander.
Yang mana data tersbut akan di export ke dalam bentuk xls dengan menggunakan
library xlsxwriter dan dilakukan visualisasi data dalam bentuk pie chart menggunakan Matplotlib.
Berikut adalah code untuk melakukan sentiment analis

import nltk
import string
import xlsxwriter
import matplotlib.pyplot as plt


messages = [line.rstrip() for line in open("comments.txt",encoding="utf8")]
from nltk.sentiment.vader import SentimentIntensityAnalyzer


sid = SentimentIntensityAnalyzer()


summary = {"positive":0,"neutral":0,"negative":0}


data_and_result = []


for x in messages:
   ss = sid.polarity_scores(x)
   if ss["compound"] == 0.0:
       summary["neutral"] +=1
       data_x_result = [x,'neutral']
   elif ss["compound"] > 0.0:
       summary["positive"] +=1
       data_x_result = [x,'positive']
   else:
       summary["negative"] +=1
       data_x_result = [x,'negative']
   data_and_result.append(data_x_result)
print(summary)


# plot
labels = 'Positive', 'Neutral', 'Negative'
sizes = [summary["positive"], summary["neutral"], summary["negative"]]



fig1, ax1 = plt.subplots()
ax1.pie(sizes, labels=labels, autopct='%1.1f%%',
        startangle=90)
ax1.axis('equal')  


plt.show()


workbook = xlsxwriter.Workbook('Analisa.xlsx')
worksheet = workbook.add_worksheet()


row = 0
col = 0


for data, result in (data_and_result):
   worksheet.write(row, col,     data)
   worksheet.write(row, col + 1, result)
   row += 1


workbook.close()



Gambar di atas merupakan visualisasi dari commentar yang telah dilakukan Analisa sentiment,
berikut adalh hasil dalam bentuk xls yang sudah dilakukan Analisa.

Sumber Referensi

https://medium.com/@sharonwoo/sentiment-analysis-with-nltk-422e0f794b8