Spaces:
Running
Running
import streamlit as st | |
from meta_ai_api import MetaAI | |
from urllib.parse import urlparse | |
import pandas as pd | |
import plotly.express as px | |
from nltk.sentiment.vader import SentimentIntensityAnalyzer | |
import nltk | |
# Initialize Meta AI API | |
ai = MetaAI() | |
PAGE_CONFIG = { | |
"page_title": "Meta AI Query Analysis - a Free SEO Tool by WordLift", | |
"page_icon": "img/fav-ico.png", | |
"layout": "centered" | |
} | |
def local_css(file_name): | |
with open(file_name) as f: | |
st.markdown(f'<style>{f.read()}</style>', unsafe_allow_html=True) | |
st.set_page_config(**PAGE_CONFIG) | |
local_css("style.css") | |
def fetch_response(query): | |
response = ai.prompt(message=query) | |
return response | |
def display_sources(sources): | |
if sources: | |
for source in sources: | |
# Parse the domain from the URL | |
domain = urlparse(source['link']).netloc | |
# Format and display the domain and title | |
st.markdown(f"- **{domain}**: [{source['title']}]({source['link']})", unsafe_allow_html=True) | |
else: | |
st.write("No sources available.") | |
# ---------------------------------------------------------------------------- # | |
# Sentiment Analysis Function | |
# ---------------------------------------------------------------------------- # | |
# Download the VADER lexicon for sentiment analysis | |
nltk.download('vader_lexicon') | |
# Initialize the Sentiment Intensity Analyzer | |
sid = SentimentIntensityAnalyzer() | |
def sentiment_analysis(text): | |
# Split the text into sentences | |
sentences = [sentence.strip() for sentence in text.split('.') if sentence] | |
# Create a DataFrame to hold the content and sentiment scores | |
df = pd.DataFrame(sentences, columns=['content']) | |
# Calculate sentiment scores for each sentence | |
df['sentiment_scores'] = df['content'].apply(lambda x: sid.polarity_scores(x)) | |
# Split sentiment_scores into separate columns | |
df = pd.concat([df.drop(['sentiment_scores'], axis=1), df['sentiment_scores'].apply(pd.Series)], axis=1) | |
# Determine the dominant sentiment and its confidence | |
df['dominant_sentiment'] = df[['neg', 'neu', 'pos']].idxmax(axis=1) | |
df['confidence'] = df[['neg', 'neu', 'pos']].max(axis=1) | |
return df | |
# ---------------------------------------------------------------------------- # | |
# Main Function | |
# ---------------------------------------------------------------------------- # | |
def main(): | |
# Path to the image | |
image_path = 'img/meta-ai-logo.png' # Replace with your image's filename and extension | |
# Create two columns | |
col1, col2 = st.columns([1, 2]) # Adjust the ratio as needed for your layout | |
# Use the first column to display the image | |
with col1: | |
st.image(image_path, width=60) | |
# Use the second column to display the title and other content | |
with col2: | |
st.title("Meta AI SEO Tool") | |
# User input | |
user_query = st.text_area("Enter your query:", height=150) | |
submit_button = st.button("Analyze Query") | |
if submit_button and user_query: | |
# Fetching response from Meta AI | |
response = fetch_response(user_query) | |
msg = response.get('message', 'No response message.') | |
# Write response | |
st.write(msg) | |
# Run sentiment analysis | |
df_sentiment = sentiment_analysis(msg) | |
# Display negative sentence locations | |
fig = px.scatter(df_sentiment, y='dominant_sentiment', color='dominant_sentiment', size='confidence', | |
hover_data=['content'], | |
color_discrete_map={"neg": "firebrick", "neu": "navajowhite", "pos": "darkgreen"}, | |
labels={'dominant_sentiment': 'Sentiment'}, | |
title='Sentiment Analysis of Sentences') | |
fig.update_layout(width=800, height=300) | |
st.plotly_chart(fig) | |
# Display the AI response in a collapsible section | |
with st.expander("Show Sources"): | |
# Display sources with clickable links in a collapsible section | |
display_sources(response.get('sources', [])) | |
if __name__ == "__main__": | |
main() | |