import streamlit as st from pathlib import Path import json from support_functions import HealthseaSearch def visualize_dataset(): # Configuration health_aspect_path = Path("data/health_aspects.json") product_path = Path("data/products.json") condition_path = Path("data/condition_vectors.json") benefit_path = Path("data/benefit_vectors.json") # Load data @st.cache(allow_output_mutation=True) def load_data( _health_aspect_path: Path, _product_path: Path, _condition_path: Path, _benefit_path: Path, ): with open(_health_aspect_path) as reader: health_aspects = json.load(reader) with open(_product_path) as reader: products = json.load(reader) with open(_condition_path) as reader: conditions = json.load(reader) with open(_benefit_path) as reader: benefits = json.load(reader) return health_aspects, products, conditions, benefits # Functions def kpi(n, text): html = f"""

{n}

{text}
""" return html def central_text(text): html = f"""

{text}

""" return html # Loading data health_aspects, products, conditions, benefits = load_data( health_aspect_path, product_path, condition_path, benefit_path ) search_engine = HealthseaSearch(health_aspects, products, conditions, benefits) # KPI st.markdown("""This app presents the analyzed dataset of up to one million reviews. You can search for the best products and substances to any health aspect based on what reviewers wrote in their reviews.""") st.markdown("""---""") st.markdown(central_text("🎀 Dataset"), unsafe_allow_html=True) kpi_products, kpi_reviews, kpi_condition, kpi_benefit = st.columns(4) kpi_products.markdown(kpi(len(products), "Products"), unsafe_allow_html=True) kpi_reviews.markdown(kpi(933.240, "Reviews"), unsafe_allow_html=True) kpi_condition.markdown(kpi(len(conditions), "Conditions"), unsafe_allow_html=True) kpi_benefit.markdown(kpi(len(benefits), "Benefits"), unsafe_allow_html=True) st.markdown("""---""") # Expander show_conditions, show_benefits = st.columns(2) with show_conditions.expander("Top 1000 mentioned Conditions"): st.write(search_engine.get_all_conditions_df()) with show_benefits.expander("Top 1000 mentioned Benefits"): st.write(search_engine.get_all_benefits_df()) st.markdown("""---""") # Search search = st.text_input(label="Search for an health aspect", value="joint pain") n = st.slider("Show top n results", min_value=10, max_value=1000, value=25) st.markdown("""---""") st.markdown(central_text("🧃 Products"), unsafe_allow_html=True) st.markdown("""The products are scored based on what reviewers say. Additional variables in the scoring function are product rating, helpful count and whether the review is considered 'fake'. """) # DataFrame st.write(search_engine.get_products_df(search, n)) # KPI & Alias aspect_alias = search_engine.get_aspect(search)["alias"] if len(aspect_alias) > 0: kpi_mentions, kpi_product_mentions, kpi_alias = st.columns(3) kpi_mentions.markdown( kpi(search_engine.get_aspect_meta(search)["frequency"], "Mentions"), unsafe_allow_html=True, ) kpi_product_mentions.markdown( kpi(len(search_engine.get_aspect(search)["products"]), "Products"), unsafe_allow_html=True, ) kpi_alias.markdown( kpi(len(aspect_alias), "Similar health aspects"), unsafe_allow_html=True, ) vectors = [] main_aspect = search_engine.get_aspect_meta(search) vectors.append((main_aspect["name"], main_aspect["vector"])) for aspect in aspect_alias: current_aspect = search_engine.get_aspect_meta(aspect) vectors.append((current_aspect["name"], current_aspect["vector"])) st.markdown("\n") st.markdown("""To improve the search, the table also shows results of other health aspects with a high similarity""") st.write(search_engine.tsne_plot(vectors)) else: kpi_mentions, kpi_product_mentions = st.columns(2) kpi_mentions.markdown( kpi(search_engine.get_aspect_meta(search)["frequency"], "Mentions"), unsafe_allow_html=True, ) kpi_product_mentions.markdown( kpi(len(search_engine.get_aspect(search)["products"]), "Products"), unsafe_allow_html=True, ) st.markdown("""---""") # Substances st.markdown(central_text("🍯 Substances"), unsafe_allow_html=True) st.markdown("""The scores of the substances are based on the products""") # DataFrame st.write(search_engine.get_substances_df(search, n)) kpi_tmp, kpi_substances = st.columns(2) kpi_substances.markdown( kpi(len(search_engine.get_aspect(search)["substance"]), "Substances"), unsafe_allow_html=True, )