Spaces:
Sleeping
Sleeping
| import streamlit as st | |
| import requests | |
| import json | |
| st.set_page_config( | |
| page_title="Sentiment Analysis App", | |
| page_icon="π", | |
| layout="centered" | |
| ) | |
| st.title("Sentiment Analysis App") | |
| st.write("Enter text to analyze its sentiment using Hugging Face's API") | |
| # API credentials input | |
| api_key = st.text_input("Enter your Hugging Face API key:", type="password", help="Your Hugging Face API token") | |
| # Model selection | |
| model_options = { | |
| "DistilBERT (SST-2)": "distilbert/distilbert-base-uncased-finetuned-sst-2-english", | |
| "Twitter-roBERTa-base": "cardiffnlp/twitter-roberta-base-sentiment", | |
| "BERT-base-multilingual": "nlptown/bert-base-multilingual-uncased-sentiment" | |
| } | |
| selected_model = st.selectbox("Select a sentiment analysis model:", options=list(model_options.keys())) | |
| # Text input area | |
| text_input = st.text_area("Enter text to analyze:", height=150) | |
| # Function to call the Hugging Face API | |
| def analyze_sentiment(text, model, api_key): | |
| API_URL = f"https://api-inference.huggingface.co/models/{model}" | |
| headers = { | |
| "Authorization": f"Bearer {api_key}" | |
| } | |
| payload = { | |
| "inputs": text, | |
| } | |
| try: | |
| response = requests.post(API_URL, headers=headers, json=payload) | |
| return response.json() | |
| except Exception as e: | |
| return {"error": str(e)} | |
| # Submit button | |
| if st.button("Analyze Sentiment"): | |
| if not api_key: | |
| st.error("Please enter your Hugging Face API key") | |
| elif not text_input: | |
| st.error("Please enter some text to analyze") | |
| else: | |
| with st.spinner("Analyzing sentiment..."): | |
| selected_model_path = model_options[selected_model] | |
| result = analyze_sentiment(text_input, selected_model_path, api_key) | |
| # Process and display results | |
| try: | |
| if "error" in result: | |
| st.error(f"Error: {result['error']}") | |
| elif isinstance(result, list) and len(result) > 0: | |
| # Process the results | |
| if isinstance(result[0], list): | |
| items = result[0] | |
| else: | |
| items = result | |
| # Find the highest scoring sentiment | |
| highest_item = max(items, key=lambda x: x['score']) | |
| score = highest_item['score'] | |
| label = highest_item['label'].lower() | |
| # Display emoji based on sentiment and score | |
| st.subheader("Sentiment:") | |
| col1, col2 = st.columns([1, 3]) | |
| # Select emoji based on sentiment label and score | |
| if 'positive' in label or 'pos' in label or '5' in label or '4' in label: | |
| if score > 0.9: | |
| emoji = "π" | |
| elif score > 0.7: | |
| emoji = "π" | |
| else: | |
| emoji = "π" | |
| sentiment_text = f"Positive ({score:.2f})" | |
| elif 'negative' in label or 'neg' in label or '1' in label or '2' in label: | |
| if score > 0.9: | |
| emoji = "π‘" | |
| elif score > 0.7: | |
| emoji = "π " | |
| else: | |
| emoji = "βΉ" | |
| sentiment_text = f"Negative ({score:.2f})" | |
| else: # neutral or '3' in label | |
| emoji = "π" | |
| sentiment_text = f"Neutral ({score:.2f})" | |
| with col1: | |
| st.markdown(f"<h1 style='font-size:4rem; text-align:center;'>{emoji}</h1>", unsafe_allow_html=True) | |
| with col2: | |
| st.markdown(f"<h2>{sentiment_text}</h2>", unsafe_allow_html=True) | |
| # Add confidence meter | |
| st.progress(score) | |
| else: | |
| st.warning("Unexpected response format. Please check your API key and try again.") | |
| st.json(result) | |
| except Exception as e: | |
| st.error(f"Error processing results: {str(e)}") | |
| st.json(result) | |
| # Footer | |
| st.markdown("---") | |
| st.markdown("Built with Streamlit and Hugging Face API") |