import gradio as gr from transformers import pipeline import numpy as np import pandas as pd from sentence_transformers import SentenceTransformer, util import nltk from nltk import sent_tokenize nltk.download("punkt") # Loading in dataframes krishnamurti_df = pd.read_json("krishnamurti_df.json") stoic_df = pd.read_json("stoic_df.json") # Loading in sentence_similarity model sentence_similarity_model = "all-mpnet-base-v2" model = SentenceTransformer(sentence_similarity_model) # Loading in text-generation models stoic_generator = pipeline("text-generation", model="eliwill/stoic-generator-10e") krishnamurti_generator = pipeline("text-generation", model="distilgpt2") # Creating philosopher dictionary philosopher_dictionary = { "stoic": { "generator": stoic_generator, "dataframe": stoic_df }, "krishnamurti": { "generator": krishnamurti_generator, "dataframe": krishnamurti_df } } ############### DEFINING FUNCTIONS ########################### def ask_philosopher(philosopher, question): """ Return first 5 sentences generated by question for the given philosopher model """ generator = philosopher_dictionary[philosopher]['generator'] answer = generator(question, min_length=100, max_length=120)[0]['generated_text'] # generate about 50 word tokens answer = " ".join(sent_tokenize(answer)[:6]) # Get the first five sentences return answer def get_similar_quotes(philosopher, question): """ Return top 3 most similar quotes to the question from a philosopher's dataframe """ df = philosopher_dictionary[philosopher]['dataframe'] question_embedding = model.encode(question) sims = [util.dot_score(question_embedding, quote_embedding) for quote_embedding in df['Embedding']] ind = np.argpartition(sims, -3)[-3:] similar_sentences = [df['quote'][i] for i in ind] top3quotes = pd.DataFrame(data = similar_sentences, columns=["Quotes"], index=range(1,4)) top3quotes['Quotes'] = top3quotes['Quotes'].str[:-1].str[:250] + "..." return top3quotes def main(question, philosopher): out_image = "marcus-aurelius.jpg" return ask_philosopher(philosopher, question), get_similar_quotes(philosopher, question), out_image with gr.Blocks(css=".gradio-container {background-image: url('file=mountains_resized.jpg')} #title {color: white}") as demo: gr.Markdown(""" # Ask a Philsopher """, elem_id="title" ) with gr.Row(): with gr.Column(): inp1 = gr.Textbox(placeholder="Place your question here...", label="Ask a question") inp2 = gr.Dropdown(choices=["stoic", "krishnamurti"], value="stoic", label="Choose a philosopher") out_image = gr.Image() with gr.Column(): out1 = gr.Textbox( lines=3, max_lines=10, label="Answer" ) out2 = gr.DataFrame( headers=["Quotes"], max_rows=5, interactive=False, wrap=True) btn = gr.Button("Run") btn.click(fn=main, inputs=[inp1,inp2], outputs=[out1,out2,out_image]) demo.launch()