Kaleidoscope / Personalized_Text_Annotation.py
ProfessorLeVesseur's picture
Update Personalized_Text_Annotation.py
82fadde verified
raw
history blame
7.29 kB
#------------------------------------------------------------------------
# Import Modules
#------------------------------------------------------------------------
import streamlit as st
import string
from annotated_text import annotated_text
from PIL import Image
from pathlib import Path
from dotenv import load_dotenv
load_dotenv()
#------------------------------------------------------------------------
# Configurations
#------------------------------------------------------------------------
# Streamlit page setup
# icon = Image.open("MTSS.ai_Icon.png")
icon = Image.open("/Users/cheynelevesseur/Desktop/Python_Code/LLM_Projects/LLM_Prxmpting/MTSS.ai_Icon.png")
st.set_page_config(
page_title="Kaleidoscope | Text Annotation",
page_icon=icon,
layout="centered",
initial_sidebar_state="auto",
menu_items={
'About': "### *This application was created by* \n### LeVesseur Ph.D | MTSS.ai"
}
)
#------------------------------------------------------------------------
# Header
#------------------------------------------------------------------------
# st.image('MTSS.ai_Logo.png', width=300)
st.title('MTSS:grey[.ai]')
st.header('Kaleidoscope:grey[ | Text Annotation]')
contact = st.sidebar.toggle('Handmade by \n**LeVesseur** :grey[ PhD] \n| :grey[MTSS.ai]')
if contact:
st.sidebar.write('Inquiries: [[email protected]](mailto:[email protected]) \nProfile: [levesseur.com](http://levesseur.com) \nCheck out: [InkQA | Dynamic PDFs](http://www.inkqa.com)')
#------------------------------------------------------------------------
# Sidebar
#------------------------------------------------------------------------
# Color options
colors = {
"Green (DAF1E7)": "#DAF1E7",
"Blue (BDE5FF)": "#BDE5FF",
"Navy (D1DBE9)": "#D1DBE9",
"Teal (D6EAED)": "#D6EAED",
"Iceburg (E4EEF6)": "#E4EEF6",
"Vermillion (F6DCDD)": "#F6DCDD",
}
with st.sidebar:
st.divider()
# Sidebar display (Option 1: Color blocks with hex)
st.sidebar.header("Recommended Colors")
for color_name, hex_code in colors.items():
st.sidebar.color_picker(color_name, hex_code)
st.subheader("Example")
annotated_text(
"I",
" ",
"really",
" ",
("appreciate", "Emotion", "#daf1e7"),
" ",
"all",
" ",
"that",
" ",
"the",
" ",
"social",
" ",
"committee",
" ",
"has",
" ",
"done",
" ",
"to",
" ",
"keep",
" ",
"us",
" ",
"feeling",
" ",
"connected",
" ",
".",
" ",
"I",
" ",
"also",
" ",
"really",
" ",
("value", "Priority", "#bde5ff"),
" ",
"our",
" ",
"in",
" ",
"-person",
" ",
"meetings",
" ",
"and",
" ",
"the",
" ",
"social",
" ",
"opportunities",
" ",
"built",
" ",
"into",
" ",
"these",
" ",
"meetings",
" ",
".",
)
st.divider()
st.subheader("Directions for Using the Text Annotation Tool")
directions = """
1. **Enter Your Text**:
- Type or paste the text you want to annotate in the text area provided.
2. **Submit Your Text**:
- Click the "Submit Text" button to process your input. This will split your text into individual words.
3. **Annotate the Words**:
- For each word, you can provide a label (e.g., "Emotion", "Priority", "Verb").
- Choose a color for each label using the color picker.
4. **Generate Annotated Text**:
- Once you have labeled and colored the words you want to annotate, click the "Generate Annotated Text" button.
- The annotated text will be displayed, showing your labels and chosen colors.
5. **Take a Screenshot**:
- To use the annotated text, take a screenshot of the displayed text.
6. **Adjust Text Width** (Optional):
- If you want to adjust the width of the sentences for a better screenshot, minimize or resize your browser window accordingly before taking the screenshot.
"""
st.markdown(directions)
#------------------------------------------------------------------------
# Functions: Personalized Labels and Colors
#------------------------------------------------------------------------
# Function to split text into words
def split_text(text):
# Add a space before punctuation marks
for char in string.punctuation:
text = text.replace(char, f" {char}")
return text.split()
# Initialize session state to store text and annotations
if 'user_text' not in st.session_state:
st.session_state.user_text = ""
if 'words' not in st.session_state:
st.session_state.words = []
if 'labels' not in st.session_state:
st.session_state.labels = []
if 'colors' not in st.session_state:
st.session_state.colors = []
# User input for the text
user_text = st.text_area("Enter the text you want to annotate:", value=st.session_state.user_text, height=100)
# Button to process the text
if st.button("Submit Text"):
st.session_state.user_text = user_text
st.session_state.words = split_text(user_text)
st.session_state.labels = [""] * len(st.session_state.words)
st.session_state.colors = ["#FFFFFF"] * len(st.session_state.words)
# Collect annotation inputs for each word
if st.session_state.words:
for i, word in enumerate(st.session_state.words):
st.write(f"Annotate the word: {word}")
st.session_state.labels[i] = st.text_input(
f"Label for '{word}'",
value=st.session_state.labels[i],
key=f"label_{i}"
)
st.session_state.colors[i] = st.color_picker(
f"Color for '{word}'",
value=st.session_state.colors[i],
key=f"color_{i}"
)
# Generate button to process the annotations
if st.button("Generate Annotated Text", type="primary"):
annotated_elements = []
for i, word in enumerate(st.session_state.words):
if st.session_state.labels[i] and st.session_state.colors[i] != "#FFFFFF":
annotated_elements.append((word, st.session_state.labels[i], st.session_state.colors[i]))
else:
annotated_elements.append(word)
annotated_elements.append(" ") # Add space between words
# Remove the last extra space added
if annotated_elements and annotated_elements[-1] == " ":
annotated_elements.pop()
# Display the annotated text using the `annotated_text` function
st.subheader("Annotated Text:")
annotated_text(*annotated_elements)
# Print the code for the annotated text
st.subheader("Generated Code:")
code_str = 'annotated_text(\n'
for elem in annotated_elements:
if isinstance(elem, tuple):
code_str += f' ("{elem[0]}", "{elem[1]}", "{elem[2]}"),\n'
else:
code_str += f' "{elem}",\n'
code_str += ')'
st.code(code_str, language='python')