r0m4k's picture
Upload app.py
dc9f45b verified
Raw
History Blame Contribute Delete
3.87 kB
import gradio as gr
import json
def analyze_text(text: str) -> str:
"""Analyze text and return statistics.
Args:
text: The input text to analyze
Returns:
JSON string with analysis results
"""
words = text.split()
chars = len(text)
chars_no_spaces = len(text.replace(" ", ""))
sentences = text.count(".") + text.count("!") + text.count("?")
avg_word_length = round(chars_no_spaces / len(words), 2) if words else 0
avg_sentence_length = round(len(words) / max(sentences, 1), 2)
return json.dumps({
"total_characters": chars,
"characters_without_spaces": chars_no_spaces,
"total_words": len(words),
"total_sentences": max(sentences, 1),
"average_word_length": avg_word_length,
"average_sentence_length": avg_sentence_length
}, indent=2)
def extract_keywords(text: str, count: int = 5) -> str:
"""Extract keywords (most common words) from text.
Args:
text: The input text
count: Number of keywords to return (default 5)
Returns:
JSON string with keywords and frequencies
"""
stopwords = {
"the", "a", "an", "and", "or", "but", "in", "on", "at", "to", "for",
"of", "with", "is", "are", "was", "were", "be", "been", "by", "from"
}
words = text.lower().split()
filtered = [w.strip(".,!?;:") for w in words if w.lower() not in stopwords]
from collections import Counter
word_freq = Counter(filtered)
top_words = word_freq.most_common(count)
return json.dumps({
"keywords": [{"word": w, "frequency": f} for w, f in top_words]
}, indent=2)
def check_reading_level(text: str) -> str:
"""Estimate reading difficulty level.
Args:
text: The input text
Returns:
JSON string with reading level estimate
"""
sentences = max(text.count(".") + text.count("!") + text.count("?"), 1)
words = len(text.split())
vowels = "aeiou"
syllables = sum(1 for c in text.lower() if c in vowels)
if words == 0:
return json.dumps({"error": "No text to analyze"})
grade = max(0, (0.39 * (words / sentences)) + (11.8 * (syllables / words)) - 15.59)
if grade < 6:
level = "Elementary School"
elif grade < 9:
level = "Middle School"
elif grade < 13:
level = "High School"
else:
level = "College/Academic"
return json.dumps({
"grade_level": round(grade, 1),
"reading_level": level
}, indent=2)
# Create web UI
with gr.Blocks(title="Text Processor") as demo:
gr.Markdown("# Text Processing Tools")
gr.Markdown("Analyze text statistics, extract keywords, and check reading difficulty.")
with gr.Tab("Analyze Text"):
text_input1 = gr.Textbox(
label="Enter text",
lines=8,
placeholder="Paste your text here..."
)
analysis_output = gr.Textbox(label="Analysis Results", lines=8)
gr.Button("Analyze", size="lg").click(analyze_text, text_input1, analysis_output)
with gr.Tab("Extract Keywords"):
text_input2 = gr.Textbox(label="Enter text", lines=8)
count_input = gr.Slider(1, 20, value=5, step=1, label="Number of keywords")
keywords_output = gr.Textbox(label="Keywords", lines=8)
gr.Button("Extract", size="lg").click(
extract_keywords,
[text_input2, count_input],
keywords_output
)
with gr.Tab("Reading Level"):
text_input3 = gr.Textbox(label="Enter text", lines=8)
level_output = gr.Textbox(label="Reading Level Analysis", lines=5)
gr.Button("Check Level", size="lg").click(check_reading_level, text_input3, level_output)
if __name__ == "__main__":
demo.launch(mcp_server=True)