File size: 4,130 Bytes
645bb63
 
ed5a50b
df70e6e
 
 
 
645bb63
 
 
 
8668335
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
645bb63
 
 
 
 
e958e6a
55363be
 
 
 
 
e958e6a
 
645bb63
df70e6e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
8668335
 
 
 
 
645bb63
bc304a6
d05fda2
bc304a6
 
ed5a50b
bc304a6
 
 
ed5a50b
bc304a6
 
 
 
645bb63
 
 
 
 
 
 
 
df70e6e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
8668335
62435e7
e958e6a
ed5a50b
ebcd7c3
 
8668335
645bb63
62435e7
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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()