jsodoge's picture
Update app.py
dda5c06 verified
raw
history blame
3.41 kB
import numpy as np
from sentence_transformers import SentenceTransformer
from sklearn.metrics.pairwise import cosine_similarity
from shiny import App, render, ui
import pandas as pd
# Initialize the sentence transformer model
model = SentenceTransformer('all-MiniLM-L6-v2')
# Sample queries
#queries = [
# "What is the weather today?",
# "How to learn Python?",
# "Best practices for data science.",
# "What is the capital of France?",
# "How to cook pasta?",
# ... (other queries)
#]
queries = pd.read_excel("egu_session_descriptions.xlsx").Description
titles = pd.read_excel("egu_session_descriptions.xlsx").Title
ids = pd.read_excel("egu_session_descriptions.xlsx").ID
ids = [int(num) for num in ids]
prefix = "https://meetingorganizer.copernicus.org/EGU25/session/"
# Create a new list with the URL prefix added to each number
urls = [f"{prefix}{num}" for num in ids]
# The column to display as results
# Precompute embeddings for the queries
query_embeddings = model.encode(queries)
# Define the UI
app_ui = ui.page_fluid(
ui.h3("EGU25 AI-session recommender"),
ui.card(
ui.card_header("How to use"),
ui.p("Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lore.")),
ui.input_text_area("user_input", "Enter your text:", placeholder="Paste abstract", width = "100%"),
ui.input_action_button("submit", "Get session recommendations", class_="btn btn-primary"),
ui.HTML("<hr>"),
ui.output_ui("results"),
ui.card_footer("Application developed by Jan Sodoge. Project by the Computational Extreme Events Group at the Helmholtz-Centre For Environmental Research"),
)
# Define server logic
def server(input, output, session):
@output
@render.ui
def results():
if input.submit(): # Note the () to call the input
user_text = input.user_input() # Note the () to call the input
if user_text:
# Compute the embedding for the user input
user_embedding = model.encode([user_text])
# Compute cosine similarities
similarities = cosine_similarity(user_embedding, query_embeddings).flatten()
# Get the indices of the top 5 similar queries
top_indices = np.argsort(similarities)[-5:][::-1]
# Prepare the results to display
result_boxes = [
ui.a(
ui.div(
titles[idx],
style="padding: 10px; margin: 5px; border-radius: 5px; color: white; font-weight: bold; background-color: #4682B4;"
),
href=urls[idx], target="_blank" # Open in a new tab
)
for idx in top_indices
]
#result_boxes = [ui.div(titles[idx], style="padding: 10px; margin: 5px; border-radius: 5px; color: white; font-weight: bold; background-color: #4682B4;") for idx in top_indices]
return result_boxes
return ui.div("Please enter text and press the button.")
# Create the Shiny app
app = App(app_ui, server)
if __name__ == "__main__":
app.run()