storytelling / app.py
jitesh's picture
adds probability_emote page
441ec1f
raw history blame
No virus
6.77 kB
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)