import streamlit as st from src.story_gen import StoryGenerator from src.probability_emote import run_pe import plotly.express as px import random import numpy as np st.set_page_config(page_title='Storytelling ' + u'\U0001F5BC', page_icon=u'\U0001F5BC', layout="wide") gen = StoryGenerator() container_mode = st.sidebar.container() container_guide = st.container() container_param = st.sidebar.container() container_button = st.sidebar.container() mode = container_mode.radio( "Select a mode", ('Probability Emote', 'Create Statistics', 'Play Storytelling'), index=0) def initialise_storytelling(): choices_first_sentence = [ 'Custom', 'Hello, I\'m a language model,', 'So I suppose you want to ask me how I did it.', 'I always wanted to be a giraffe - until that night.', 'My first tutor was a dragon with a terrible sense of humor.', 'Doctors told her she could never diet again.', 'Memory is all around us, as well as within.', ] cfs = st.selectbox('Choose First Sentence', choices_first_sentence) if cfs == 'Custom': story_till_now = st.text_input( label='First Sentence', key='first_sentence') else: st.session_state.first_sentence = cfs story_till_now = cfs first_sentence = story_till_now first_emotion = gen.get_emotion(first_sentence) length = container_param.slider(label='Length of the generated sentence', min_value=1, max_value=100, value=10, step=1) return first_sentence, first_emotion, length if mode == 'Create Statistics': first_sentence, first_emotion, length = initialise_storytelling() # story_till_now = first_sentence num_generation = container_param.slider( label='Number of generation', min_value=1, max_value=100, value=5, step=1) num_tests = container_param.slider( label='Number of tests', min_value=1, max_value=1000, value=3, step=1) reaction_weight_mode = container_param.select_slider( "Reaction Weight w:", ["Random", "Fixed"]) if reaction_weight_mode == "Fixed": reaction_weight = container_param.slider( label='Reaction Weight w', min_value=0.0, max_value=1.0, value=0.5, step=0.01) elif reaction_weight_mode == "Random": reaction_weight = -1 if container_button.button('Analyse'): gen.get_stats(story_till_now=first_sentence, num_generation=num_generation, length=length, reaction_weight=reaction_weight, num_tests=num_tests) # if len(gen.stories) > 0: # for si, story in enumerate(gen.stories): # st.markdown(f'### Story no. {si}:', unsafe_allow_html=False) # st.markdown(story, unsafe_allow_html=False) # data=gen.stats_df[gen.stats_df.sentence_no==3] # fig = px.violin(data_frame=data, x="reaction_weight", y="num_reactions", hover_data=data.columns) # st.plotly_chart(fig, use_container_width=True) # fig2 = px.box(data_frame=data, x="reaction_weight", y="num_reactions", hover_data=data.columns) # st.plotly_chart(fig2, use_container_width=True) if len(gen.data) > 0: for si, story in enumerate(gen.data): st.markdown(f'### Story {si}:', unsafe_allow_html=False) for i, sentence in enumerate(story): col_turn, col_sentence, col_emo = st.columns([1, 8, 2]) col_turn.markdown( sentence['turn'], unsafe_allow_html=False) col_sentence.markdown( sentence['sentence'], unsafe_allow_html=False) col_emo.markdown( f'{sentence["emotion"]} {np.round(sentence["confidence_score"], 3)}', unsafe_allow_html=False) st.table(data=gen.stats_df, ) data = gen.stats_df[gen.stats_df.sentence_no == 3] fig = px.violin(data_frame=data, x="reaction_weight", y="num_reactions", hover_data=data.columns) st.plotly_chart(fig, use_container_width=True) fig2 = px.box(data_frame=data, x="reaction_weight", y="num_reactions", hover_data=data.columns) st.plotly_chart(fig2, use_container_width=True) else: container_guide.markdown( '### You selected statistics. Now set your parameters and click the `Analyse` button.') elif mode == 'Play Storytelling': first_sentence, first_emotion, length = initialise_storytelling() # story_till_now = first_sentence if 'sentence_list' not in st.session_state: st.session_state.sentence_list = [{'sentence': first_sentence, 'emotion': first_emotion['label'], 'score': first_emotion['score']}] if 'full_story' not in st.session_state: st.session_state.full_story = first_sentence container_button = container_button.columns([1, 1, 1]) heading_container = st.container() col_turn, col_sentence, col_emo = st.columns([1, 8, 2]) if container_button[0].button('Run'): heading_container.markdown(f'### Story') # st.text(story_till_now) full_story, emotion, new_sentence = gen.next_sentence( st.session_state.full_story, length) st.session_state.full_story = full_story st.session_state.sentence_list.append({ 'sentence': new_sentence, 'emotion': emotion["label"], 'score': emotion["score"]}) # col_sentence.markdown(st.session_state.sentence_list) for step in st.session_state.sentence_list: col_turn, col_sentence, col_emo = st.columns([1, 8, 2]) col_sentence.markdown(step['sentence']) col_emo.markdown( f'{step["emotion"]} {np.round(step["score"], 3)}', unsafe_allow_html=False) else: step = st.session_state.sentence_list[0] # col_sentence.markdown(step['sentence']) # col_emo.markdown( # f'{step["emotion"]} {np.round(step["score"], 3)}', unsafe_allow_html=False) container_guide.markdown( '### Write the first sentence and then hit the `Run` button') if container_button[2].button('Clear'): st.session_state.full_story = first_sentence st.session_state.sentence_list = [{'sentence': first_sentence, 'emotion': first_emotion['label'], 'score': first_emotion['score']}] elif mode == 'Probability Emote': # container_mode.write('Let\'s play storytelling.') run_pe(container_param)