예제 #1
0
    def add_dataCrawling(self):
        aksi = request.form['aksi']

        instance_Api = Api()
        instance_Excel = Excel()

        # Fungsi CARI TWEET(crawling) : Ambil data menggunakan API Twitter ==> Simpan(data) ke Excel & Tampilkan(data) ke layar
        if aksi == 'crawling':
            kata_kunci = request.form['kata_kunci']
            tanggal_awal = request.form['tanggal_awal']
            tanggal_akhir = request.form['tanggal_akhir']

            # Ambil data menggunakan API Twitter (Tweepy)
            data_crawling = instance_Api.get_search(
                kata_kunci + ' -filter:retweets', tanggal_awal, tanggal_akhir)
            # Fungsi[1] : Simpan data_crawling ke dalam file Excel
            instance_Excel.save_excel_crawling(data_crawling)
            # Menampilkan data_crawling ke layar
            return json.dumps({'data_crawling': data_crawling})

        # Fungsi SIMPAN TWEET(crawling) : Ambil data dari excel(yang telah disimpan[1]) ==> Simpan ke Database
        if aksi == 'save_crawling':
            # Fungsi[2] : Membuat tuple dari file excel
            tuples_excel = instance_Excel.make_tuples_crawling()

            # Simpan ke Database dengan VALUES berupa tuple dari Fungsi[2]
            instance_Model = Models(
                'REPLACE INTO tbl_tweet_crawling(id, text, user, created_at) VALUES (%s, %s, %s, %s)'
            )
            instance_Model.query_sql_multiple(tuples_excel)
            return None
예제 #2
0
	def add_dataSplit(self):
		rasio = request.form['rasio']
		jumlah_data = float(request.form['jumlah_data'])
		
		if rasio == '1:9':
			jumlah_dataTes = math.floor(jumlah_data * 0.1) # Membagi data sebanyak 10% sebagai data tes(dengan pembulatan ke bawah)
			jumlah_dataLatih = math.ceil(jumlah_data * 0.9) # Membagi data sebanyak 90% sebagai data latih(dengan pembulatan ke atas)
		elif rasio == '2:8':
			jumlah_dataTes = math.floor(jumlah_data * 0.2) # Membagi data sebanyak 20% sebagai data tes(dengan pembulatan ke bawah)
			jumlah_dataLatih = math.ceil(jumlah_data * 0.8) # Membagi data sebanyak 80% sebagai data latih(dengan pembulatan ke atas)
		
		# SPLIT value 0 = data tes	|	value1 = data latih

		# SPLIT SECARA RANDOM / ACAK
		# # Membuat list(data_type) dengan value 0 sebanyak jumlah variabel 'jumlah_dataTes'
		# data_type = [0 for i in range(int(jumlah_dataTes))]
		# # Perulangan untuk mengisi value 1 ke dalam list(data_type) pada index random sebanyak jumlah variabel 'jumlah_dataLatih'
		# for _ in range(int(jumlah_dataLatih)):
		# 	data_type.insert(random.randint(0, len(data_type)), 1)

		# SPLIT SECARA LATIH DULU BARU UJI
		data_type = []
		for i in range(int(jumlah_data)):
			if	i < jumlah_dataLatih:
				data_type.append(1)
			else:
				data_type.append(0)
		
		# SELECT data tweet yang TELAH diberi label untuk diproses
		instance_Model = Models('SELECT * FROM tbl_tweet_clean WHERE sentiment_type IS NOT NULL')
		data_withLabel = instance_Model.select()
		
		data_simpan_tes = []
		data_simpan_latih = []

		# Menyimpan data(yang telah diSELECT) ke tabel yang berbeda berdasarkan value dari variabel 'data_type'
		for index, data in enumerate(data_withLabel):
			if data_type[index] == 0: # Jika value 'data_type' bernilai 0 maka akan di INSERT kedalam tabel TESTING
				data_simpan_tes.append((data['id'], data['text'], data['clean_text'], data['user'], data['created_at'], data['sentiment_type'])) # Membuat tuple sebagai isian untuk kueri INSERT
			else: # Jika value 'data_type' tidak bernilai 0  INSERT kedalam tabel TRAINING
				data_simpan_latih.append((data['id'], data['text'], data['clean_text'], data['user'], data['created_at'], data['sentiment_type'])) # Membuat tuple sebagai isian untuk kueri INSERT
		
		# Menyimpan data dengan kueri INSERT IGNORE, dengan memperbarui record yang duplikat berdasarkan PK
		instance_Model = Models('INSERT IGNORE tbl_tweet_testing(id, text, clean_text, user, created_at, sentiment_type) VALUES (%s, %s, %s, %s, %s, %s)')
		instance_Model.query_sql_multiple(data_simpan_tes)
		# Menyimpan data dengan kueri INSERT IGNORE, dengan memperbarui record yang duplikat berdasarkan PK
		instance_Model = Models('INSERT IGNORE tbl_tweet_training(id, text, clean_text, user, created_at, sentiment_type) VALUES (%s, %s, %s, %s, %s, %s)')
		instance_Model.query_sql_multiple(data_simpan_latih)
		return 'true'
예제 #3
0
    def import_fileExcelStopword(self):
        excel_file = request.files['excel_file']

        if (excel_file.filename.lower().endswith(('.xls', '.xlsx'))):
            instance_Excel = Excel()
            tuples_excel = instance_Excel.make_tuples_stopword(excel_file)
            # Simpan ke Database dengan VALUES berupa tuple
            instance_Model = Models(
                'INSERT INTO tbl_stopword(stopword) VALUES (%s)')
            instance_Model.query_sql_multiple(tuples_excel)
            return None
        flash(
            'Format file tidak sesuai! File excel harus ber-ekstensi .xls atau .xlsx',
            'error')
        return None
예제 #4
0
    def import_fileExcelCrawling(self):
        excel_file = request.files['excel_file']

        if (excel_file.filename.lower().endswith(('.xls', '.xlsx'))):
            instance_Excel = Excel()
            tuples_excel = instance_Excel.make_tuples_crawling(excel_file)
            # Simpan ke Database dengan VALUES berupa tuple
            instance_Model = Models(
                'REPLACE INTO tbl_tweet_crawling(id, text, user, created_at) VALUES (%s, %s, %s, %s)'
            )
            instance_Model.query_sql_multiple(tuples_excel)
            return None
        flash(
            'Format file tidak sesuai! File excel harus ber-ekstensi .xls atau .xlsx',
            'error')
        return None
	def add_dataLabelingKamus(self):
		aksi = request.form['aksi']

		# FUNGSI LABELING DENGAN KAMUS : Data teks bersih ==> Hitung Skor(Sentimen) ==> Pemberian Kelas Sentimen ==> Update ==> Tampilkan(data) ke layar
		if aksi == 'labelingKamus':
			# SELECT data tanpa label dari database
			instance_Model = Models('SELECT id, clean_text FROM tbl_tweet_clean WHERE sentiment_type IS NULL')
			data_noLabel = instance_Model.select()

			# SELECT data kata-kata & bobot positif dari database
			instance_Model = Models('SELECT positive_word FROM tbl_lexicon_positive')
			kamus_positive = instance_Model.select()

			# SELECT data kata-kata & bobot negative dari database
			instance_Model = Models('SELECT negative_word FROM tbl_lexicon_negative')
			kamus_negative = instance_Model.select()
			
			teks_data = [] # wadauh untuk clean_text agar bisa ditampilkan ke layar (response)
			skor_data = [] # wadauh untuk skor agar bisa ditampilkan ke layar (response)
			total_positive = [] # wadauh untuk jumlah positive agar bisa ditampilkan ke layar (response)
			total_negative = [] # wadauh untuk jumlah negatif agar bisa ditampilkan ke layar (response)

			jumlah_netral = 0	# menghitung tweet yang berskor = 0 atau sentimen netral

			data_ubah = []

			print('\n-- PROSES '+ str(len(data_noLabel)) +' DATA --')	# PRINT KE CMD
			for index, data_nL in enumerate(data_noLabel):	# loop data tweet yang belum memiliki label
				skor = 0
				count_positive = 0
				count_negative = 0

				# Menghitung jumlah skor pada teks bersih dengan kamus
				for clean_text in data_nL['clean_text'].split(): # Tokenizing
					for data_p in kamus_positive:	# loop data kata positif
						if clean_text == data_p['positive_word']:
							skor += 1
							count_positive += 1
							break
					for data_n in kamus_negative:	# loop data kata negatif
						if clean_text == data_n['negative_word']:
							skor -= 1
							count_negative += 1
							break
				
				# Klasifikasi sentimen berdasarkan skor
				if skor > 0:
					sentimen = 'positif'
				elif skor < 0:
					sentimen = 'negatif'
				else:
					jumlah_netral += 1
					continue

				try:
					data_ubah.append((sentimen, data_nL['id'])) # Membuat tuple sebagai isian untuk kueri UPDATE
					
					# Simpan data ke list
					teks_data.append(data_nL['clean_text'])
					skor_data.append(skor)
					total_positive.append(count_positive)
					total_negative.append(count_negative)
				except:
					print('\nGagal Mengubah Data '+ str(data['id']) +'\n')
					return None
				print(index+1)	# PRINT KE CMD
			
			# Menyimpan sentimen hasil dengan kueri UPDATE
			instance_Model = Models('UPDATE tbl_tweet_clean SET sentiment_type=%s WHERE id = %s')
			instance_Model.query_sql_multiple(data_ubah)

			print('\n-- SELESAI --\n')	# PRINT KE CMD
			# Menampilkan data ke layar
			return json.dumps({ 'teks_data': teks_data, 'total_positive': total_positive, 'total_negative': total_negative, 'skor_data': skor_data, 'jumlah_netral': jumlah_netral })
예제 #6
0
    def add_dataPreprocessing(self):
        aksi = request.form['aksi']

        instance_Excel = Excel()

        # Fungsi PREPROCESSING : Data Tweet dari database ==> PREPROCESSING ==> Tweet Bersih ==> Simpan(data) ke Excel & Tampilkan(data) ke layar
        if aksi == 'preprocessing':
            instance_Model = Models('SELECT * FROM tbl_tweet_crawling')
            data_preprocessing = instance_Model.select()

            first_data = []
            last_data = []
            case_folding = []
            remove_non_character = []
            remove_stop_word = []
            change_stemming = []
            change_slang = []

            data_simpan = []

            # Inisialisasi untuk proses 7. Change Slang Word
            instance_Model = Models(
                'SELECT slangword,kata_asli FROM tbl_slangword')
            slangwords = instance_Model.select()
            # Inisialisasi Konfigurasi Library Sastrawi untuk proses Remove Stop Word
            instance_Model = Models('SELECT stopword FROM tbl_stopword')
            stopwords = instance_Model.select()
            # Inisialisasi Konfigurasi Library Sastrawi untuk prosesStemming
            instance_Stemming = StemmerFactory()
            stemmer = instance_Stemming.create_stemmer()

            print('\n-- PROSES ' + str(len(data_preprocessing)) +
                  ' DATA --')  # PRINT KE CMD
            for index, data in enumerate(data_preprocessing):
                first_data.append(data['text'])

                # Case Folding : Mengubah huruf menjadi huruf kecil
                result_text = data['text'].lower()
                case_folding.append(result_text)

                # Remove URL, Mention, Hastag & Number  : Menghilangkan kata yang diawali dengan kata 'http', '@' dan '#'
                result_text = re.sub(r'http\S+|@\S+|#\S+|\d+', '', result_text)

                # Remove Selain Huruf : Menghilangkan selain huruf [a-z]
                result_text = re.sub(r'[^a-z ]', '', result_text)

                # Remove Whitespace : Menghilangkan spasi/tab/baris yang kosong
                result_text = result_text.strip()
                result_text = re.sub('\s+', ' ', result_text)
                remove_non_character.append(result_text)

                # Merubah slang word ke kata aslinya
                for slang in slangwords:
                    if slang['slangword'] in result_text:
                        result_text = re.sub(
                            r'\b{}\b'.format(slang['slangword']),
                            slang['kata_asli'], result_text)
                change_slang.append(result_text)

                # Menghapus stop word
                for stop in stopwords:
                    if stop['stopword'] in result_text:
                        result_text = re.sub(
                            r'\b{}\b'.format(stop['stopword']), '',
                            result_text)
                remove_stop_word.append(result_text)

                # Stemming : Menghilangkan infleksi/kata berimbuhan kata ke bentuk dasarnya
                result_text = stemmer.stem(result_text)
                change_stemming.append(result_text)

                last_data.append(result_text)

                if result_text != '':
                    # SIMPAN DATA
                    try:
                        data_simpan.append(
                            (data['id'], data['text'], result_text,
                             data['user'], data['created_at'])
                        )  # Membuat tuple sebagai isian untuk kueri INSERT
                    except:
                        print('\nGagal Menyimpan Data (ID: ' +
                              str(data['id']) + ')\n')
                else:
                    print('\nGagal Menyimpan Data (ID: ' + str(data['id']) +
                          ')\n')
                print(index + 1)  # PRINT KE CMD

            # Menyimpan data hasil preprocessing dengan kueri INSERT IGNORE, dengan memperbarui record yang duplikat berdasarkan PK
            instance_Model = Models(
                'REPLACE INTO tbl_tweet_clean(id, text, clean_text, user, created_at) VALUES (%s, %s, %s, %s, %s)'
            )
            instance_Model.query_sql_multiple(data_simpan)

            print('\n-- SELESAI --\n')  # PRINT KE CMD

            # Menampilkan data ke layar
            return json.dumps({
                'first_data': first_data,
                'case_folding': case_folding,
                'remove_non_character': remove_non_character,
                'change_slang': change_slang,
                'remove_stop_word': remove_stop_word,
                'change_stemming': change_stemming,
                'last_data': last_data
            })