Spaces:
Sleeping
Sleeping
| 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") |