About This Project
Sistem klasifikasi emosi tweet menggunakan Natural Language Processing dan Machine Learning. Project ini dapat menganalisis teks tweet dan mengidentifikasi emosi seperti senang, sedih,
marah, dan takut.
Menggunakan model deep learning yang telah dilatih pada dataset emosi tweet untuk memberikan analisis sentiment yang akurat dan real-time.
Python
Streamlit
NLP
Machine Learning
Transformers
Project Goal
Tujuan utama project ini adalah membangun sistem AI yang dapat memahami dan mengklasifikasi emosi dalam teks media sosial secara otomatis.
Sistem ini dapat membantu bisnis untuk memahami sentiment pelanggan, menganalisis feedback produk, dan monitoring brand reputation di media sosial.
<!doctype html>
<html lang="id" class="no-js">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Tweet Emotion Detection - Portfolio REA</title>
<meta name="author" content="Ruangguru Tech Team" />
<meta name="publisher" content="PT Ruang Raya Indonesia" />
<meta name="description" content="Tweet Emotion Detection project by M. Alif Al hakim - AI sentiment analysis untuk klasifikasi emosi pada teks tweet menggunakan machine learning." />
<link rel="canonical" href="https://www.ruangguru.com/rea/portfolio/tweet-emotion-detection" />
<link rel="icon" type="image/jpg" href="https://cdn-web.ruangguru.com/file-uploader/d2d58a11-1905-4ae2-ab6a-809190e7cd48.jpg" />
<style>
@import url('https://fonts.googleapis.com/css2?family=Inter:ital,opsz,wght@0,14..32,100..900;1,14..32,100..900&family=Quicksand:wght@300..700&display=swap');
:root {
--color-primary: #0f6ff2;
--color-secondary: #0dc7f1;
--color-accent-light: #ecf7ff;
--color-text-dark: #21272a;
--color-text-medium: #2c313a;
--color-text-light: #697077;
--color-white: #ffffff;
--color-background-light: #f9fcff;
--color-background-dark: #000000;
--color-border: #dde1e6;
}
html {
overflow-x: hidden;
scroll-behavior: smooth;
}
body {
margin: 0;
font-family: 'Inter', sans-serif;
background-color: var(--color-white);
color: var(--color-text-dark);
overflow-x: hidden;
line-height: 1.6;
}
.page-container {
max-width: 1440px;
margin-left: auto;
margin-right: auto;
position: relative;
}
.section-container {
padding: 80px;
}
.header {
background-color: var(--color-white);
border-bottom: 1px solid var(--color-border);
padding: 20px 0;
position: sticky;
top: 0;
z-index: 100;
}
.nav {
max-width: 1200px;
margin: 0 auto;
padding: 0 20px;
display: flex;
justify-content: space-between;
align-items: center;
}
.logo {
font-size: 24px;
font-weight: 700;
color: var(--color-primary);
text-decoration: none;
}
.nav-links {
display: flex;
gap: 32px;
list-style: none;
margin: 0;
padding: 0;
}
.nav-links a {
color: var(--color-text-medium);
text-decoration: none;
font-weight: 500;
transition: color 0.3s ease;
}
.nav-links a:hover {
color: var(--color-primary);
}
.breadcrumb {
padding: 20px 0;
background-color: var(--color-background-light);
}
.breadcrumb-container {
max-width: 1200px;
margin: 0 auto;
padding: 0 20px;
}
.breadcrumb-nav {
display: flex;
align-items: center;
gap: 8px;
font-size: 14px;
color: var(--color-text-light);
}
.breadcrumb-nav a {
color: var(--color-primary);
text-decoration: none;
transition: color 0.2s ease;
}
.breadcrumb-nav a:hover {
color: var(--color-secondary);
}
.breadcrumb-separator {
color: var(--color-text-light);
margin: 0 4px;
}
.hero {
background: linear-gradient(135deg, var(--color-background-light) 0%, var(--color-accent-light) 100%);
padding: 80px 0;
}
.hero-container {
max-width: 1200px;
margin: 0 auto;
padding: 0 20px;
display: grid;
grid-template-columns: 1fr 1fr;
gap: 60px;
align-items: center;
}
.hero-content {
text-align: left;
}
.hero-image {
text-align: center;
}
.hero-image img {
max-width: 100%;
height: auto;
border-radius: 16px;
box-shadow: 0 20px 40px rgba(0, 0, 0, 0.15);
}
.hero-badge {
display: inline-block;
background-color: var(--color-primary);
color: var(--color-white);
padding: 8px 16px;
border-radius: 50px;
font-size: 14px;
font-weight: 500;
margin-bottom: 24px;
}
.hero h1 {
font-size: 48px;
font-weight: 700;
color: var(--color-text-dark);
margin: 0 0 16px 0;
line-height: 1.2;
}
.hero-subtitle {
font-size: 20px;
color: var(--color-text-light);
margin: 0 auto 32px auto;
max-width: 600px;
line-height: 1.5;
}
.hero-actions {
display: flex;
gap: 16px;
flex-wrap: wrap;
}
.btn {
display: inline-flex;
justify-content: center;
align-items: center;
padding: 16px 32px;
border-radius: 100px;
text-decoration: none;
font-family: 'Inter', sans-serif;
font-weight: 500;
font-size: 16px;
line-height: 1;
border: none;
cursor: pointer;
transition: all 0.3s ease;
box-sizing: border-box;
}
.btn-primary {
background-color: var(--color-text-medium);
color: var(--color-white);
}
.btn-primary:hover {
opacity: 0.9;
transform: translateY(-2px);
}
.btn-secondary {
background-color: transparent;
color: var(--color-text-medium);
border: 1px solid var(--color-border);
}
.btn-secondary:hover {
background-color: var(--color-text-medium);
color: var(--color-white);
}
.project-showcase {
padding: 80px 0;
}
.showcase-container {
max-width: 1200px;
margin: 0 auto;
padding: 0 20px;
}
.showcase-image {
background-color: var(--color-white);
border: 1px solid var(--color-border);
border-radius: 16px;
padding: 40px;
margin-bottom: 60px;
text-align: center;
box-shadow: 0 4px 20px rgba(0, 0, 0, 0.08);
}
.showcase-image img {
max-width: 100%;
height: auto;
border-radius: 12px;
}
.project-content {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 40px;
margin-top: 80px;
}
.content-section {
background: linear-gradient(135deg, var(--color-white) 0%, rgba(249, 252, 255, 0.8) 100%);
padding: 48px;
border-radius: 20px;
border: 1px solid rgba(15, 111, 242, 0.1);
box-shadow:
0 20px 40px rgba(0, 0, 0, 0.08),
0 0 0 1px rgba(255, 255, 255, 0.05);
position: relative;
overflow: hidden;
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
}
.content-section::before {
content: '';
position: absolute;
top: 0;
left: 0;
right: 0;
height: 4px;
background: linear-gradient(90deg, var(--color-primary) 0%, var(--color-secondary) 100%);
}
.content-section:hover {
transform: translateY(-8px);
box-shadow:
0 30px 60px rgba(0, 0, 0, 0.12),
0 0 0 1px rgba(15, 111, 242, 0.1);
}
.content-section h2 {
font-size: 28px;
font-weight: 700;
color: var(--color-text-dark);
margin: 0 0 20px 0;
position: relative;
}
.content-section h2::after {
content: '';
position: absolute;
bottom: -8px;
left: 0;
width: 40px;
height: 3px;
background: linear-gradient(90deg, var(--color-primary) 0%, var(--color-secondary) 100%);
border-radius: 2px;
}
.content-section p {
color: var(--color-text-medium);
margin: 0 0 20px 0;
line-height: 1.7;
font-size: 16px;
}
.tech-stack {
display: flex;
flex-wrap: wrap;
gap: 12px;
margin-top: 32px;
}
.tech-tag {
background: linear-gradient(135deg, var(--color-accent-light) 0%, rgba(236, 247, 255, 0.8) 100%);
color: var(--color-primary);
padding: 10px 16px;
border-radius: 12px;
font-size: 14px;
font-weight: 600;
border: 1px solid rgba(15, 111, 242, 0.15);
transition: all 0.3s ease;
position: relative;
overflow: hidden;
}
.tech-tag::before {
content: '';
position: absolute;
top: 0;
left: -100%;
width: 100%;
height: 100%;
background: linear-gradient(90deg, transparent, rgba(15, 111, 242, 0.1), transparent);
transition: left 0.5s;
}
.tech-tag:hover {
transform: translateY(-2px);
box-shadow: 0 8px 20px rgba(15, 111, 242, 0.2);
}
.tech-tag:hover::before {
left: 100%;
}
.author-section {
background: var(--color-background-light);
padding: 60px 40px;
border-radius: 20px;
text-align: left;
margin: 60px 0;
position: relative;
box-shadow: 0 4px 20px rgba(0, 0, 0, 0.06);
display: flex;
align-items: flex-start;
gap: 24px;
}
.author-section:hover {
transform: none;
box-shadow: 0 4px 20px rgba(0, 0, 0, 0.06);
}
.author-section::before {
display: none;
}
.author-info {
display: flex;
flex-direction: column;
min-width: 140px;
align-items: flex-start;
}
.author-avatar {
width: 60px;
height: 60px;
border-radius: 50%;
margin: 0 0 16px 0;
background: linear-gradient(135deg, var(--color-primary) 0%, var(--color-secondary) 100%);
display: flex;
align-items: center;
justify-content: center;
font-size: 20px;
font-weight: 700;
color: var(--color-white);
flex-shrink: 0;
}
.author-name {
font-size: 18px;
font-weight: 700;
margin: 0 0 4px 0;
color: var(--color-text-dark);
}
.author-batch {
font-size: 14px;
color: var(--color-text-light);
font-weight: 500;
}
.quote {
background: transparent;
padding: 0;
border-radius: 0;
margin: 0;
border: none;
box-shadow: none;
position: relative;
overflow: visible;
flex: 1;
}
.quote::before {
content: '“';
position: absolute;
top: -8px;
left: -8px;
font-size: 32px;
color: var(--color-primary);
opacity: 0.4;
font-family: Georgia, serif;
line-height: 1;
}
.quote-text {
font-style: italic;
color: var(--color-text-medium);
font-size: 16px;
line-height: 1.6;
margin: 0;
font-weight: 400;
position: relative;
z-index: 2;
}
.footer {
background-color: var(--color-text-dark);
color: var(--color-white);
padding: 60px 0;
text-align: center;
margin-top: 80px;
}
.footer-container {
max-width: 1200px;
margin: 0 auto;
padding: 0 20px;
}
.footer-links {
display: flex;
justify-content: center;
gap: 32px;
margin-top: 20px;
flex-wrap: wrap;
}
.footer-links a {
color: rgba(255, 255, 255, 0.8);
text-decoration: none;
transition: color 0.3s ease;
}
.footer-links a:hover {
color: var(--color-white);
}
@media (max-width: 1024px) {
.hero {
padding: 100px 0 80px 0;
}
.hero-container {
padding: 0 20px;
gap: 40px;
}
.project-showcase {
padding: 80px 0;
}
.showcase-container {
padding: 0 20px;
}
.project-content {
gap: 30px;
}
.showcase-image {
padding: 40px;
}
.content-section {
padding: 36px;
}
.author-section {
padding: 60px 40px;
}
.quote {
padding: 40px;
}
}
@media (max-width: 768px) {
.hero {
padding: 80px 0 60px 0;
}
.hero-container {
padding: 0 20px;
grid-template-columns: 1fr;
gap: 40px;
}
.hero-content {
text-align: center;
}
.hero h1 {
font-size: 48px;
}
.hero-subtitle {
font-size: 20px;
}
.hero-actions {
justify-content: center;
}
.project-showcase {
padding: 60px 0;
}
.project-content {
grid-template-columns: 1fr;
gap: 24px;
margin-top: 60px;
}
.showcase-image {
padding: 30px;
margin-bottom: 60px;
}
.content-section {
padding: 32px;
}
.content-section h2 {
font-size: 24px;
}
.author-section {
flex-direction: column;
padding: 40px 24px;
margin: 60px 0 30px 0;
text-align: center;
gap: 20px;
}
.author-info {
align-items: center;
min-width: auto;
}
.author-name {
font-size: 16px;
}
.author-batch {
font-size: 13px;
}
.quote-text {
font-size: 15px;
}
.quote::before {
font-size: 24px;
top: -4px;
left: -4px;
}
.hero-actions {
flex-direction: column;
align-items: center;
gap: 16px;
}
.btn {
padding: 16px 32px;
font-size: 16px;
width: 100%;
max-width: 280px;
}
}
@media (max-width: 480px) {
.hero h1 {
font-size: 36px;
}
.hero-subtitle {
font-size: 18px;
}
.showcase-image {
padding: 20px;
}
.content-section {
padding: 24px;
}
.author-section {
padding: 40px 20px;
}
.quote {
padding: 24px;
}
.quote::before {
font-size: 60px;
top: 15px;
left: 20px;
}
}
/* ============================================================================
PROMO BANNER STYLES
============================================================================ */
/* CSS from section:promo-banner */
.promo-banner-section {
background: linear-gradient(90deg, #ffffff 0%, #dceffd 100%);
border-bottom: 1px solid var(--color-border);
position: fixed;
top: 0;
left: 0;
right: 0;
z-index: 1000;
cursor: pointer;
overflow: hidden;
}
.promo-banner-container {
max-width: 1280px;
margin: 0 auto;
display: flex;
justify-content: center;
align-items: center;
gap: 16px;
padding: 12px 20px;
position: relative;
overflow: hidden;
}
.promo-text {
font-family: 'Inter', sans-serif;
font-size: 16px;
color: #333333;
margin: 0;
white-space: nowrap;
animation: marquee 20s linear infinite;
display: inline-block;
padding-left: 100%;
}
@media (max-width: 768px) {
.promo-text {
animation: marquee 15s linear infinite;
font-size: 12px;
}
}
@keyframes marquee {
0% {
transform: translate3d(0, 0, 0);
}
100% {
transform: translate3d(-100%, 0, 0);
}
}
.promo-button {
font-family: 'Inter', sans-serif;
font-weight: 500;
font-size: 12px;
color: var(--color-primary);
text-decoration: none;
padding: 6px 12px;
border: 1px solid var(--color-primary);
border-radius: 100px;
transition: all 0.3s ease;
flex-shrink: 0;
white-space: nowrap;
background-color: transparent;
}
.promo-button:hover {
background-color: var(--color-primary);
color: var(--color-white);
}
/* ============================================================================
HEADER STYLES
============================================================================ */
.site-header {
background-color: var(--color-white);
border-bottom: 1px solid var(--color-border);
padding: 16px 80px;
position: relative;
}
.header-container {
display: flex;
justify-content: space-between;
align-items: center;
max-width: 1280px;
margin: 0 auto;
}
.main-nav ul {
margin: 0;
padding: 0;
list-style: none;
display: flex;
align-items: center;
gap: 16px;
}
.main-nav a {
font-family: 'Inter', sans-serif;
font-weight: 500;
font-size: 16px;
color: var(--color-text-dark);
text-decoration: none;
padding: 12px 8px;
align-items: center;
gap: 4px;
}
.main-nav a:hover {
color: var(--color-primary);
}
/* Program Dropdown Styles */
.dropdown {
position: relative;
display: inline-block;
}
.dropdown-toggle {
display: flex;
align-items: center;
gap: 4px;
cursor: pointer;
transition: all 0.3s ease;
font-family: 'Inter', sans-serif;
font-weight: 500;
font-size: 16px;
color: var(--color-text-dark);
text-decoration: none;
padding: 12px 8px;
}
.dropdown-toggle:hover {
color: var(--color-primary);
}
.dropdown-icon {
width: 16px;
height: 16px;
transition: transform 0.3s ease;
}
.dropdown.active .dropdown-icon {
transform: rotate(180deg);
}
.dropdown-menu {
position: absolute;
top: 100%;
left: 50%;
transform: translateX(-50%);
background-color: var(--color-white);
border-radius: 12px;
box-shadow: 0 8px 32px rgba(0, 0, 0, 0.15);
padding: 16px;
min-width: 320px;
opacity: 0;
visibility: hidden;
transform: translateX(-50%) translateY(-10px);
transition: all 0.3s ease;
z-index: 1000;
border: 1px solid var(--color-border);
margin-top: 4px;
}
.dropdown.active .dropdown-menu {
opacity: 1;
visibility: visible;
transform: translateX(-50%) translateY(0);
}
.dropdown-item {
display: block;
padding: 16px;
text-decoration: none;
color: var(--color-text-dark);
border-radius: 8px;
transition: all 0.3s ease;
margin-bottom: 8px;
}
.dropdown-item:last-child {
margin-bottom: 0;
}
.dropdown-item:hover {
background-color: var(--color-background-light);
color: var(--color-primary);
}
.dropdown-item h4 {
font-family: 'Inter', sans-serif;
font-weight: 600;
font-size: 16px;
margin: 0 0 4px 0;
color: inherit;
}
.dropdown-item p {
font-family: 'Inter', sans-serif;
font-size: 14px;
color: var(--color-text-light);
margin: 0;
line-height: 1.4;
}
/* Mobile Dropdown in Mobile Nav */
.mobile-nav .dropdown-menu {
position: static;
visibility: visible;
opacity: 1;
transform: none;
box-shadow: none;
border: none;
border-radius: 0;
padding: 0;
min-width: auto;
max-height: 0;
overflow: hidden;
transition: max-height 0.3s ease;
margin-top: 0;
}
.mobile-nav .dropdown.active .dropdown-menu {
max-height: 300px;
}
.mobile-nav .dropdown-item {
padding: 16px 20px;
margin-bottom: 0;
border-radius: 0;
border-bottom: 1px solid var(--color-border);
display: block;
}
.mobile-nav .dropdown-item:last-child {
border-bottom: none;
}
.mobile-nav .dropdown-item h4 {
font-size: 15px;
margin-bottom: 4px;
font-weight: 600;
}
.mobile-nav .dropdown-item p {
font-size: 13px;
line-height: 1.4;
color: var(--color-text-light);
}
.mobile-nav .dropdown-toggle {
justify-content: space-between;
}
.mobile-nav .dropdown-icon {
width: 12px;
height: 12px;
}
/* Hamburger Menu Styles */
.hamburger-menu {
display: none;
flex-direction: column;
justify-content: space-around;
width: 24px;
height: 24px;
background: none;
border: none;
cursor: pointer;
padding: 0;
z-index: 1001;
}
.hamburger-line {
width: 100%;
height: 2px;
background-color: var(--color-text-dark);
transition: all 0.3s ease;
}
.hamburger-menu.active .hamburger-line:nth-child(1) {
transform: rotate(45deg) translate(6px, 6px);
}
.hamburger-menu.active .hamburger-line:nth-child(2) {
opacity: 0;
}
.hamburger-menu.active .hamburger-line:nth-child(3) {
transform: rotate(-45deg) translate(6px, -6px);
}
/* Mobile Navigation */
.mobile-nav {
position: absolute;
top: 100%;
left: 0;
right: 0;
background-color: var(--color-white);
border-bottom: 1px solid var(--color-border);
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
z-index: 9999;
max-height: 0;
overflow: hidden;
transition:
max-height 0.3s ease,
opacity 0.3s ease;
opacity: 0;
}
.mobile-nav.active {
max-height: 800px;
opacity: 1;
}
.mobile-nav ul {
list-style: none;
padding: 16px 20px;
margin: 0;
}
.mobile-nav a {
display: block;
padding: 16px 20px;
color: var(--color-text-dark);
text-decoration: none;
font-family: 'Inter', sans-serif;
font-weight: 500;
font-size: 16px;
transition: background-color 0.3s ease;
}
.mobile-nav a:hover,
.mobile-nav a:active {
background-color: var(--color-background-light);
color: var(--color-primary);
}
@media (max-width: 768px) {
.site-header {
padding: 16px 20px;
}
.main-nav {
display: none;
}
.hamburger-menu {
display: flex;
}
}
/* ============================================================================
FOOTER STYLES
============================================================================ */
.site-footer {
background-color: var(--color-background-dark);
color: var(--color-white);
padding: 48px 80px;
}
.footer-container {
max-width: 1280px;
margin: 0 auto;
display: flex;
flex-direction: column;
gap: 48px;
}
.footer-top {
display: flex;
justify-content: space-between;
align-items: center;
flex-wrap: wrap;
gap: 32px;
}
.footer-nav ul {
list-style: none;
padding: 0;
margin: 0;
display: flex;
flex-wrap: wrap;
gap: 16px;
}
.footer-nav a {
color: var(--color-white);
text-decoration: none;
font-family: 'Inter', sans-serif;
font-size: 16px;
}
.social-icons {
display: flex;
gap: 16px;
}
.footer-bottom {
text-align: center;
font-family: 'Inter', sans-serif;
font-size: 14px;
padding-top: 48px;
border-top: 1px solid rgba(255, 255, 255, 0.2);
}
.footer-bottom p {
margin: 0;
}
/* ============================================================================
WHATSAPP CONSULTATION STYLES
============================================================================ */
@keyframes pulse {
0% {
box-shadow: 0 0 0 0 rgba(37, 211, 102, 0.7);
}
70% {
box-shadow: 0 0 0 10px rgba(37, 211, 102, 0);
}
100% {
box-shadow: 0 0 0 0 rgba(37, 211, 102, 0);
}
}
.whatsapp-consult {
position: fixed;
bottom: 20px;
right: 20px;
background: #25d366;
border-radius: 30px;
display: flex;
align-items: center;
gap: 12px;
padding: 16px 20px;
box-shadow: 0 6px 20px rgba(37, 211, 102, 0.4);
z-index: 1001;
text-decoration: none;
transition: all 0.3s ease;
cursor: pointer;
animation: pulse 2s infinite;
}
.whatsapp-consult:hover {
transform: translateY(-3px) scale(1.05);
box-shadow: 0 8px 25px rgba(37, 211, 102, 0.5);
animation: none;
}
.whatsapp-consult svg {
width: 24px;
height: 24px;
fill: white;
flex-shrink: 0;
}
.whatsapp-consult-text {
color: white;
font-weight: 700;
font-size: 16px;
white-space: nowrap;
}
/* ============================================================================
STICKY CTA STYLES
============================================================================ */
.sticky-cta {
position: fixed;
display: none;
bottom: 0;
left: 0;
right: 0;
z-index: 1000;
background: white;
border-radius: 16px 16px 0 0;
box-shadow: 0 -4px 20px rgba(0, 0, 0, 0.15);
transition: transform 0.3s ease;
}
.sticky-cta-toggle {
position: absolute;
top: -20px;
left: 50%;
transform: translateX(-50%);
background: white;
border-radius: 20px;
width: 60px;
height: 40px;
display: flex;
align-items: center;
justify-content: center;
cursor: pointer;
box-shadow: 0 -2px 10px rgba(0, 0, 0, 0.1);
transition: all 0.3s ease;
}
.toggle-icon {
width: 16px;
height: 16px;
transition: transform 0.3s ease;
}
.sticky-cta-collapsed {
padding: 16px 20px 20px 20px;
display: flex;
flex-direction: column;
gap: 12px;
}
.sticky-cta-expanded {
padding: 0 20px 16px 20px;
display: none;
flex-direction: column;
gap: 16px;
border-top: 1px solid #f0f0f0;
margin-top: 8px;
}
.urgency-info-collapsed {
display: flex;
gap: 12px;
justify-content: space-between;
}
.seats-filled {
background: #ff4444;
color: white;
padding: 8px 16px;
border-radius: 20px;
font-size: 14px;
font-weight: 600;
flex: 1;
text-align: center;
}
.limited-quota {
background: #f0f0f0;
color: var(--color-text-medium);
padding: 8px 16px;
border-radius: 20px;
font-size: 14px;
font-weight: 600;
flex: 1;
text-align: center;
}
.btn-whatsapp {
display: flex;
align-items: center;
justify-content: center;
gap: 10px;
background: #25d366;
color: white;
padding: 20px 32px;
border-radius: 50px;
text-decoration: none;
font-weight: 700;
font-size: 18px;
transition: all 0.3s ease;
width: 100%;
box-sizing: border-box;
animation: pulse 2s infinite;
}
.btn-whatsapp:hover {
background: #22c55e;
transform: translateY(-2px) scale(1.02);
box-shadow: 0 6px 20px rgba(37, 211, 102, 0.4);
animation: none;
}
.whatsapp-icon {
font-size: 24px;
}
.pricing-info {
display: flex;
align-items: center;
justify-content: center;
gap: 12px;
margin-bottom: 8px;
}
.discount-badge {
background: #ff4444;
color: white;
padding: 4px 8px;
border-radius: 8px;
font-size: 14px;
font-weight: 600;
}
.price-container {
display: flex;
align-items: center;
gap: 8px;
}
.original-price {
text-decoration: line-through;
color: #999;
font-size: 16px;
}
.current-price {
font-size: 24px;
font-weight: 700;
color: var(--color-text-dark);
}
.payment-info {
background: #e8f4f8;
padding: 12px 16px;
border-radius: 8px;
display: flex;
align-items: center;
justify-content: center;
}
.payment-option {
display: flex;
align-items: center;
gap: 8px;
font-size: 14px;
color: var(--color-text-medium);
}
.check-icon {
color: #4caf50;
font-weight: bold;
}
</style>
<script type="module" crossorigin src="https://cdn-web-2.ruangguru.com/landing-page-web/public/staticpages/www.ruangguru.com/rea/portfolio/tweet-emotion-detection/assets/index-BDXVvFHL.js"></script>
</head>
<body>
<!-- Google Tag Manager (noscript) -->
<noscript><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-PVNLZFT" height="0" width="0" style="display: none; visibility: hidden"></iframe></noscript>
<!-- End Google Tag Manager (noscript) -->
<!-- Header -->
<header id="header" class="site-header">
<div class="header-container">
<a href="https://www.ruangguru.com/rea" class="logo">
<img src="https://cdn-web.ruangguru.com/file-uploader/dd4a94a6-93fd-41d7-9cd8-8c5ce6e857f1.png" alt="REA Academy" style="height: 40px; width: auto" />
</a>
<nav class="main-nav">
<ul>
<li class="dropdown">
<a href="#" class="dropdown-toggle">
Program
<svg class="dropdown-icon" viewBox="0 0 24 24" fill="currentColor">
<path d="M7 10l5 5 5-5z" />
</svg>
</a>
<div class="dropdown-menu">
<a href="https://www.ruangguru.com/rea/ai-engineering" class="dropdown-item">
<h4>AI Engineering</h4>
<p>Bangun sistem AI end-to-end dengan teknologi terdepan</p>
</a>
<a href="https://www.ruangguru.com/rea/ai-python" class="dropdown-item">
<h4>AI Python</h4>
<p>Pelajari dasar-dasar pemrograman Python untuk AI</p>
</a>
</div>
</li>
<li><a href="https://www.ruangguru.com/rea/ai-engineering#syllabus">Silabus</a></li>
<li><a href="https://www.ruangguru.com/rea/ai-engineering#instructors">Instruktur</a></li>
<li><a href="https://www.ruangguru.com/rea/ai-engineering#alumni">Alumni</a></li>
<li><a href="https://cta.ruangguru.com/rea-ai-engineering-consult-sticky" target="_blank">Konsultasi</a></li>
</ul>
</nav>
<button class="hamburger-menu" id="hamburger-menu" aria-label="Toggle navigation">
<span class="hamburger-line"></span>
<span class="hamburger-line"></span>
<span class="hamburger-line"></span>
</button>
</div>
<nav class="mobile-nav" id="mobile-nav">
<ul>
<li class="dropdown">
<a href="#" class="dropdown-toggle">
Program
<svg class="dropdown-icon" viewBox="0 0 24 24" fill="currentColor">
<path d="M7 10l5 5 5-5z" />
</svg>
</a>
<div class="dropdown-menu">
<a href="https://www.ruangguru.com/rea/ai-engineering" class="dropdown-item">
<h4>AI Engineering</h4>
<p>Bangun sistem AI end-to-end dengan teknologi terdepan</p>
</a>
<a href="https://www.ruangguru.com/rea/ai-python" class="dropdown-item">
<h4>AI Python</h4>
<p>Pelajari dasar-dasar pemrograman Python untuk AI</p>
</a>
</div>
</li>
<li><a href="https://www.ruangguru.com/rea/ai-engineering#syllabus">Silabus</a></li>
<li><a href="https://www.ruangguru.com/rea/ai-engineering#instructors">Instruktur</a></li>
<li><a href="https://www.ruangguru.com/rea/ai-engineering#alumni">Alumni</a></li>
<li><a href="https://cta.ruangguru.com/rea-ai-engineering-consult-sticky" target="_blank">Konsultasi</a></li>
</ul>
</nav>
</header>
<!-- Breadcrumb -->
<section class="breadcrumb">
<div class="breadcrumb-container">
<nav class="breadcrumb-nav" aria-label="Breadcrumb">
<a href="https://www.ruangguru.com/rea">Home</a>
<span class="breadcrumb-separator">></span>
<a href="https://www.ruangguru.com/rea/ai-engineering">AI Engineering</a>
<span class="breadcrumb-separator">></span>
<span>Tweet Emotion Detection</span>
</nav>
</div>
</section>
<main>
<section class="hero">
<div class="hero-container">
<div class="hero-content">
<div class="hero-badge">REA AI Bootcamp</div>
<h1>Tweet Emotion Detection</h1>
<p class="hero-subtitle">AI-powered sentiment analysis system untuk mengklasifikasi emosi dalam teks tweet menggunakan machine learning dan natural language processing.</p>
<div class="hero-actions">
<a href="https://text-emotion-classifier-analysis.streamlit.app/" class="btn btn-primary" target="_blank">Live Demo</a>
<a href="#about" class="btn btn-secondary">Learn More</a>
</div>
</div>
<div class="hero-image">
<img src="https://cdn-web.ruangguru.com/file-uploader/53acc94b-ea95-484f-a35f-43f059d455bd.png" alt="Tweet Emotion Detection Interface" />
</div>
</div>
</section>
<section class="project-showcase">
<div class="showcase-container">
<div class="project-content">
<div class="content-section" id="about">
<h2>About This Project</h2>
<p>
Sistem klasifikasi emosi tweet menggunakan Natural Language Processing dan Machine Learning. Project ini dapat menganalisis teks tweet dan mengidentifikasi emosi seperti senang, sedih,
marah, dan takut.
</p>
<p>Menggunakan model deep learning yang telah dilatih pada dataset emosi tweet untuk memberikan analisis sentiment yang akurat dan real-time.</p>
<div class="tech-stack">
<span class="tech-tag">Python</span>
<span class="tech-tag">Streamlit</span>
<span class="tech-tag">NLP</span>
<span class="tech-tag">Machine Learning</span>
<span class="tech-tag">Transformers</span>
</div>
</div>
<div class="content-section">
<h2>Project Goal</h2>
<p>Tujuan utama project ini adalah membangun sistem AI yang dapat memahami dan mengklasifikasi emosi dalam teks media sosial secara otomatis.</p>
<p>Sistem ini dapat membantu bisnis untuk memahami sentiment pelanggan, menganalisis feedback produk, dan monitoring brand reputation di media sosial.</p>
</div>
</div>
<div class="author-section">
<div class="author-info">
<img class="author-avatar" src="https://cdn-web.ruangguru.com/file-uploader/d74016f7-7f6d-4ef4-877e-e2219ca0b276.jpg" alt="M. Alif Al Hakim" />
<div class="author-name">M. Alif Al Hakim</div>
<div class="author-batch">REA AI Bootcamp</div>
</div>
<div class="quote">
<p class="quote-text">
"Saya membuat Tweet Emotion Detection karena tweet merupakan informasi penting bagi perusahaan maupun pemerintahan, karena bisa melihat sentimen publik terhadap suatu hal agar bisa
melakukan peningkatan dan perbaikan."
</p>
</div>
</div>
</div>
</section>
</main>
<!-- Footer -->
<footer id="footer" class="site-footer">
<div class="footer-container">
<div class="footer-top">
<a href="https://www.ruangguru.com/rea" class="footer-logo">
<img src="https://cdn-web.ruangguru.com/file-uploader/2e4e9a95-6215-4b18-993d-b15ba7669189.png" alt="REA Academy" style="height: 32px; width: auto" />
</a>
<nav class="footer-nav">
<ul>
<li><a href="https://www.ruangguru.com/rea">Home</a></li>
<li><a href="https://www.ruangguru.com/rea/ai-engineering">AI Engineering</a></li>
<li><a href="https://www.ruangguru.com/rea/ai-python">AI Python</a></li>
<li><a href="https://cta.ruangguru.com/rea-ai-engineering-consult-sticky" target="_blank">Konsultasi</a></li>
</ul>
</nav>
<div class="social-icons"></div>
</div>
<div class="footer-bottom">
<p>© 2025 Ruangguru Engineering Academy. All rights reserved.</p>
</div>
</div>
</footer>
<!-- WhatsApp Consultation Container -->
<a href="https://cta.ruangguru.com/rea-ai-engineering-consult-sticky" target="_blank" rel="noopener noreferrer" class="whatsapp-consult" aria-label="Chat via WhatsApp">
<svg viewBox="0 0 24 24">
<path
d="M17.472 14.382c-.297-.149-1.758-.867-2.03-.967-.273-.099-.471-.148-.67.15-.197.297-.767.966-.94 1.164-.173.199-.347.223-.644.075-.297-.15-1.255-.463-2.39-1.475-.883-.788-1.48-1.761-1.653-2.059-.173-.297-.018-.458.13-.606.134-.133.298-.347.446-.52.149-.174.198-.298.298-.497.099-.198.05-.371-.025-.52-.075-.149-.669-1.612-.916-2.207-.242-.579-.487-.5-.669-.51-.173-.008-.371-.01-.57-.01-.198 0-.52.074-.792.372-.272.297-1.04 1.016-1.04 2.479 0 1.462 1.065 2.875 1.213 3.074.149.198 2.096 3.2 5.077 4.487.709.306 1.262.489 1.694.625.712.227 1.36.195 1.871.118.571-.085 1.758-.719 2.006-1.413.248-.694.248-1.289.173-1.413-.074-.124-.272-.198-.57-.347m-5.421 7.403h-.004a9.87 9.87 0 01-5.031-1.378l-.361-.214-3.741.982.998-3.648-.235-.374a9.86 9.86 0 01-1.51-5.26c.001-5.45 4.436-9.884 9.888-9.884 2.64 0 5.122 1.03 6.988 2.898a9.825 9.825 0 012.893 6.994c-.003 5.45-4.437 9.884-9.885 9.884m8.413-18.297A11.815 11.815 0 0012.05 0C5.495 0 .16 5.335.157 11.892c0 2.096.547 4.142 1.588 5.945L.057 24l6.305-1.654a11.882 11.882 0 005.683 1.448h.005c6.554 0 11.89-5.335 11.893-11.893A11.821 11.821 0 0020.89 3.488"
/>
</svg>
<span class="whatsapp-consult-text">Konsultasi Sekarang</span>
</a>
<!-- Sticky CTA -->
<div class="sticky-cta" id="stickyCta">
<div class="sticky-cta-toggle" id="stickyCtaggle">
<img src="https://cdn-web.ruangguru.com/file-uploader/968b1f93-69ac-4b3a-be2e-d61802361fcc.svg" alt="Toggle" class="toggle-icon" />
</div>
<!-- Collapsed Content -->
<div class="sticky-cta-collapsed">
<div class="urgency-info-collapsed" id="urgency-info">
<div class="seats-filled" id="seats-filled"></div>
<div class="limited-quota" id="limited-quota"></div>
</div>
<div class="sticky-cta-button-collapsed">
<a href="#" class="btn-whatsapp" id="whatsapp-button">
<span class="whatsapp-icon" id="whatsapp-icon"></span>
<span id="whatsapp-text"></span>
</a>
</div>
</div>
<!-- Expanded Content -->
<div class="sticky-cta-expanded" id="stickyCtagontent">
<div class="pricing-info">
<div class="discount-badge" id="discount-badge"></div>
<div class="price-container">
<span class="original-price" id="original-price"></span>
<span class="current-price" id="current-price"></span>
</div>
</div>
<div class="payment-info">
<div class="payment-option">
<span class="check-icon">✓</span>
<span id="payment-info-text"></span>
</div>
</div>
</div>
</div>
<!-- Google Tag Manager -->
<script>
(function (w, d, s, l, i) {
w[l] = w[l] || [];
w[l].push({ 'gtm.start': new Date().getTime(), event: 'gtm.js' });
var f = d.getElementsByTagName(s)[0],
j = d.createElement(s),
dl = l != 'dataLayer' ? '&l=' + l : '';
j.async = true;
j.src = 'https://www.googletagmanager.com/gtm.js?id=' + i + dl;
f.parentNode.insertBefore(j, f);
})(window, document, 'script', 'dataLayer', 'GTM-PVNLZFT');
</script>
<!-- End Google Tag Manager -->
<!-- Tracker -->
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<script src="https://unpkg.com/analytics@0.8.1/dist/analytics.min.js"></script>
<script type="text/javascript" src="https://unpkg.com/analytics-plugin-trackable/dist/analytics-plugin-trackable.min.js"></script>
<script type="text/javascript" defer>
$(document).on('click', '[data-tracking-event-type]', function (event) {
const eventType = $(this).data('tracking-event-type');
const context = $(this).data('tracking-context');
Analytics.track(eventType, context);
});
/* Initialize analytics */
var Analytics = _analytics.init({
app: 'REA',
debug: false,
plugins: [analyticsTrackable()],
});
Analytics.ready(function () {
Analytics.page();
});
</script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/3.12.2/gsap.min.js"></script>
<script>
// Dropdown functionality
document.addEventListener('DOMContentLoaded', function () {
const dropdowns = document.querySelectorAll('.dropdown');
dropdowns.forEach(dropdown => {
const toggle = dropdown.querySelector('.dropdown-toggle');
toggle.addEventListener('click', function (e) {
e.preventDefault();
dropdown.classList.toggle('active');
// Close other dropdowns
dropdowns.forEach(otherDropdown => {
if (otherDropdown !== dropdown) {
otherDropdown.classList.remove('active');
}
});
});
});
// Close dropdowns when clicking outside
document.addEventListener('click', function (e) {
if (!e.target.closest('.dropdown')) {
dropdowns.forEach(dropdown => {
dropdown.classList.remove('active');
});
}
});
// Mobile menu toggle
const hamburger = document.getElementById('hamburger-menu');
const mobileNav = document.getElementById('mobile-nav');
if (hamburger && mobileNav) {
hamburger.addEventListener('click', function () {
hamburger.classList.toggle('active');
mobileNav.classList.toggle('active');
});
}
});
</script>
</body>
</html>