|
|
|
|
| import streamlit as st
|
|
|
| from datetime import datetime
|
|
|
|
|
| from textblob import TextBlob
|
| import matplotlib.pyplot as plt
|
| import pandas as pd
|
| from wordcloud import WordCloud
|
|
|
|
|
| class Journal:
|
| def __init__(self):
|
| self.entries = []
|
|
|
| def add_entry(self, timestamp, entry_text):
|
| entry = {"timestamp": timestamp, "entry_text": entry_text}
|
| self.entries.append(entry)
|
|
|
| def view_entries(self):
|
| st.header("Journal Entries")
|
| for index, entry in enumerate(self.entries, start=1):
|
| timestamp = entry["timestamp"]
|
| entry_text = entry["entry_text"]
|
| st.write(f"{index}. {timestamp}\n{entry_text}\n")
|
| st.button(f"Delete Entry {index}", key=f"delete_{index}", on_click=self.delete_entry, args=(index-1,))
|
| st.write("------")
|
|
|
| def delete_entry(self, index):
|
| if 0 <= index < len(self.entries):
|
| deleted_entry = self.entries.pop(index)
|
| st.write("Entry deleted:")
|
| st.write(deleted_entry)
|
| else:
|
| st.write("Invalid entry index.")
|
|
|
| def sentiment_analysis(self):
|
| positive_count = 0
|
| negative_count = 0
|
| neutral_count = 0
|
|
|
| for entry in self.entries:
|
| entry_text = entry["entry_text"]
|
| blob = TextBlob(entry_text)
|
| polarity = blob.sentiment.polarity
|
|
|
| if polarity > 0.2:
|
| positive_count += 1
|
| elif polarity < -0.2:
|
| negative_count += 1
|
| else:
|
| neutral_count += 1
|
|
|
| return positive_count, negative_count, neutral_count
|
|
|
| def generate_word_cloud(self):
|
| all_text = " ".join([entry["entry_text"] for entry in self.entries])
|
| wordcloud = WordCloud(width=800, height=400, background_color="white").generate(all_text)
|
| plt.figure(figsize=(10, 5))
|
| plt.imshow(wordcloud, interpolation="bilinear")
|
| plt.axis("off")
|
| plt.title("Word Cloud of Journal Entries")
|
| st.pyplot()
|
|
|
| def main():
|
|
|
|
|
| st.markdown(
|
| "<div style='text-align: center;'>"
|
| "<h1> Your Personal Mental Health Journaling Companion</h1>"
|
| "</div>",
|
| unsafe_allow_html=True
|
| )
|
|
|
|
|
| st.markdown(
|
| "<div style='text-align: center;'><h5 style='font-size: 25px;'>"
|
| "Unveil Clarity Within:\n\n 'Discover Healing and Insight through Digital Journaling'"
|
| "</h5></div>",
|
| unsafe_allow_html=True
|
| )
|
|
|
|
|
| if "journal" not in st.session_state:
|
| st.session_state.journal = Journal()
|
|
|
|
|
| st.markdown(
|
| "<div style='text-align: left; font-size: 20px;'>"
|
| "<i>Your thoughts are the foundation of your strength, and this digital journaling experience is designed to empower you every step of the way.</i>""</div>",
|
| unsafe_allow_html=True
|
| )
|
|
|
| entry_text = st.text_area(
|
| "**Take one step closer to healing and enter your daily journal here:**",
|
| key="entry_text"
|
| )
|
|
|
|
|
| timestamp = datetime.now().strftime("%m-%d %H:%M")
|
|
|
| if st.button("Add Entry"):
|
| st.session_state.journal.add_entry(timestamp, entry_text)
|
| st.success("Entry added!")
|
|
|
| if st.button("View my Entries"):
|
| st.session_state.journal.view_entries()
|
| st.write("Saved Entries:")
|
| entries_table = []
|
| for index, entry in enumerate(st.session_state.journal.entries, start=1):
|
| timestamp = entry["timestamp"]
|
| entry_text = entry["entry_text"]
|
| entries_table.append((index, timestamp, entry_text))
|
| st.table(entries_table)
|
|
|
| search_term = st.text_input("Search Entry:")
|
| filtered_entries = [
|
| (index, timestamp, entry_text)
|
| for index, (index, timestamp, entry_text) in enumerate(entries_table, start=1)
|
| if search_term.lower() in entry_text.lower()
|
| ]
|
| if search_term:
|
| st.write("Filtered Entries:")
|
| st.table(filtered_entries)
|
| if st.button("Analyze my Emotions"):
|
| positive_count, negative_count, neutral_count = st.session_state.journal.sentiment_analysis()
|
|
|
| sentiment_df = pd.DataFrame({
|
| 'Sentiment': ['Positive', 'Negative', 'Neutral'],
|
| 'Count': [positive_count, negative_count, neutral_count]
|
| })
|
| st.bar_chart(sentiment_df.set_index('Sentiment'))
|
| if st.button("Create a Visual Representation of my Entry"):
|
| st.session_state.journal.generate_word_cloud()
|
|
|
| if __name__ == '__main__':
|
| main()
|
|
|