Sentiment Analysis Tool
Analysis Results
Original Text:
Sentiment:
Confidence:
element containing confidence score const errorMessage = document.getElementById('errorMessage'); const downloadPdfButton = document.getElementById('downloadPdfButton'); // Store analysis results for PDF generation let currentAnalysisResults = { text: '', sentiment: '', confidence: null }; // Simple sentiment analysis logic (for demonstration purposes) function performSentimentAnalysis(text) { text = text.toLowerCase(); let positiveWords = ['great', 'excellent', 'love', 'happy', 'good', 'fantastic', 'amazing', 'positive', 'wonderful', 'joy']; let negativeWords = ['bad', 'terrible', 'hate', 'sad', 'poor', 'awful', 'negative', 'worry', 'frustrate', 'disappointed']; let positiveCount = 0; let negativeCount = 0; positiveWords.forEach(word => { if (text.includes(word)) { positiveCount++; } }); negativeWords.forEach(word => { if (text.includes(word)) { negativeCount++; } }); let sentiment = 'Neutral'; let confidence = 0; if (positiveCount > negativeCount) { sentiment = 'Positive'; confidence = (positiveCount / (positiveCount + negativeCount || 1)) * 100; } else if (negativeCount > positiveCount) { sentiment = 'Negative'; confidence = (negativeCount / (positiveCount + negativeCount || 1)) * 100; } else if (positiveCount > 0 || negativeCount > 0) { // If counts are equal but non-zero, it's mixed, leaning neutral for simplicity sentiment = 'Neutral'; confidence = 50; // Or some other indication of mixed/low confidence } // If no sentiment-bearing words found if (positiveCount === 0 && negativeCount === 0) { sentiment = 'Neutral'; confidence = 0; } return { sentiment, confidence: confidence.toFixed(2) }; } // Global function for analysis button, as per spec window.analyzeSentiment = function() { const text = textInput.value.trim(); clearMessages(); resultsSection.style.display = 'none'; // Hide results until analysis downloadPdfButton.style.display = 'none'; // Hide PDF button if (!text) { displayErrorMessage('Please enter some text to analyze.'); return; } const analysis = performSentimentAnalysis(text); originalTextInputSpan.textContent = text; sentimentOutput.textContent = analysis.sentiment; // Remove previous sentiment classes sentimentOutput.classList.remove('sentiment-positive', 'sentiment-negative', 'sentiment-neutral'); // Apply new sentiment class and set confidence if (analysis.sentiment === 'Positive') { sentimentOutput.classList.add('sentiment-positive'); } else if (analysis.sentiment === 'Negative') { sentimentOutput.classList.add('sentiment-negative'); } else { sentimentOutput.classList.add('sentiment-neutral'); } if (analysis.confidence > 0) { confidenceScoreSpan.textContent = `${analysis.confidence}%`; confidenceScoreContainer.style.display = 'block'; } else { confidenceScoreContainer.style.display = 'none'; } currentAnalysisResults = { text: text, sentiment: analysis.sentiment, confidence: analysis.confidence > 0 ? `${analysis.confidence}%` : 'N/A' }; resultsSection.style.display = 'block'; // Show results downloadPdfButton.style.display = 'block'; // Show PDF button }; // Global function for PDF download window.downloadSentimentReportPdf = function() { if (!currentAnalysisResults.text) { displayErrorMessage('No analysis results to download for PDF.'); return; } const { jsPDF } = window.jspdf; const doc = new jsPDF(); doc.setFontSize(18); doc.setTextColor(0, 86, 179); /* Matches h2 color */ doc.text('Sentiment Analysis Report', doc.internal.pageSize.getWidth() / 2, 20, { align: 'center' }); doc.setFontSize(12); doc.setTextColor(51, 51, 51); doc.text('Original Text:', 20, 40); doc.setFontSize(10); doc.setTextColor(73, 80, 87); // Use splitTextToSize to handle long text const splitText = doc.splitTextToSize(currentAnalysisResults.text, doc.internal.pageSize.getWidth() - 40); doc.text(splitText, 20, 47); let yPos = 47 + (splitText.length * doc.getLineHeight()); // Adjust Y position based on text height doc.setFontSize(12); doc.setTextColor(51, 51, 51); doc.text('Sentiment:', 20, yPos + 15); doc.setFontSize(12); // Set color based on sentiment for PDF if (currentAnalysisResults.sentiment === 'Positive') { doc.setTextColor(40, 167, 69); // Green } else if (currentAnalysisResults.sentiment === 'Negative') { doc.setTextColor(220, 53, 69); // Red } else { doc.setTextColor(108, 117, 125); // Gray } doc.text(currentAnalysisResults.sentiment, 50, yPos + 15); if (currentAnalysisResults.confidence !== 'N/A') { doc.setFontSize(10); doc.setTextColor(85, 85, 85); doc.text(`Confidence: ${currentAnalysisResults.confidence}`, 20, yPos + 25); } doc.save(`Sentiment_Analysis_Report.pdf`); }; function displayErrorMessage(message) { errorMessage.textContent = message; errorMessage.style.display = 'block'; } function clearMessages() { errorMessage.style.display = 'none'; errorMessage.textContent = ''; } });