File size: 2,795 Bytes
c75ee0b
1367d73
 
 
 
 
 
c75ee0b
1367d73
 
 
 
 
 
 
 
c75ee0b
1367d73
 
 
 
c75ee0b
1367d73
 
 
 
c75ee0b
1367d73
 
 
 
c75ee0b
1367d73
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import streamlit as st
import folium
from streamlit_folium import st_folium
from collections import defaultdict
# from joblib import Parallel, delayed
from post_assesment import get_sentiment, emotions
from post_search import search_posts_parallel

emotion_to_color = {
    'no_emotion': "#666666",
    'joy': "#33cc33",
    'sadness': "#0066ff",
    'surprise': "#ff9900",
    'fear': "#aa2fd6",
    'anger': "#ff0000"
}

POSTS_CNT = 500
# TOP_CITIES_CNT = 2
NUM_OF_WORKERS = 8
# top_cities = cities_db.nlargest(n=TOP_CITIES_CNT, columns="population")

# === Beginning of the page ===
st.title("Sentiment analysis")
topic = st.text_input("Enter your topic:", "котики")
button = st.button("Start!")

if button:
    st.session_state["running"] = True
    st.session_state.pop("results", None)
    st.session_state.pop("posts", None)

if st.session_state.get("running", False):
    st.text("Processing query...")
    st.session_state["posts"] = search_posts_parallel(topic, POSTS_CNT)
    # posts_per_city = Parallel(n_jobs=NUM_OF_WORKERS) \
    # (
    #     delayed(search_posts_by_pos)(topic, POSTS_CNT, city_row["city"], city_row["lat"], city_row["lon"]) 
    #     for ind, city_row in top_cities.iterrows()
    # )
    # posts = [post for city_list in posts_per_city for post in city_list]
    # print(*[post.owner_id for post in posts], sep='\n', flush=True)
    # st.session_state["posts"] = posts
    st.text("Gathered posts...")
    st.session_state["results"] = get_sentiment(st.session_state["posts"])
    # st.write(st.session_state["results"])
    st.session_state["running"] = False
    
if "results" in st.session_state:
    print("Got results!", flush=True)
    posts = st.session_state["posts"]
    results = st.session_state["results"]
    scores = defaultdict(lambda: {e: 0.0 for e in emotions})
    cnt = defaultdict(int)
    names = {}
    for i in range(len(posts)):
        pos = posts[i].geolocation
        names[pos] = posts[i].city_of_origin
        cnt[pos] += 1
        # for label, score in results[i].items():
        #     scores[pos][label] = score
        scores[pos][results[i]["label"]] = results[i]["score"] if results[i]["label"] != "no_emotion" else 0.001
    colors = {pos: emotion_to_color[max(score, key=score.get)] for pos, score in scores.items()}
    map_table = {
        "lon": [pos[0] for pos in cnt.keys()],
        "lat": [pos[1] for pos in cnt.keys()],
        "color": colors,
        "size": cnt.values()
    }
    m = folium.Map()
    for pos in cnt.keys():
        # print(pos)
        folium.CircleMarker((float(pos[0]), float(pos[1])), radius=cnt[pos] / POSTS_CNT * 100, color=colors[pos]).add_to(m)
    st_folium(m, width=725, returned_objects=[])
    # st.map(map_table, latitude="lat", longitude="lon", color="color", size="size")