Spaces:
Sleeping
Sleeping
File size: 3,608 Bytes
40abb93 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 | import json
from collections import Counter
import gradio as gr
# --- same logic as server.py ---
STOP_WORDS = {'the','a','an','and','or','but','in','on','at','to','for',
'of','with','by','from','up','about','into','over','after',
'is','are','was','were','be','been','being','have','has',
'had','do','does','did','will','would','can','could','shall',
'should','may','might','i','you','he','she','it','we','they',
'me','him','her','us','them','my','your','his','its','our',
'their','this','that','these','those','not','no','nor','so'}
def analyze_text(text: str) -> str:
words = text.split()
sentences = [s.strip() for s in text.replace('!', '.').replace('?', '.').split('.') if s.strip()]
return json.dumps({
"total_characters": len(text),
"total_words": len(words),
"total_sentences": len(sentences),
"avg_word_length": round(sum(len(w) for w in words) / len(words), 2) if words else 0,
"avg_sentence_length": round(len(words) / len(sentences), 2) if sentences else 0,
"unique_words": len(set(w.lower() for w in words))
}, indent=2)
def extract_keywords(text: str, count: int = 5) -> str:
words = [w.lower().strip('.,!?;:\'"()[]{}') for w in text.split()]
words = [w for w in words if w and w not in STOP_WORDS and len(w) > 2]
keywords = Counter(words).most_common(count)
return json.dumps({"keywords": [{"word": w, "frequency": c} for w, c in keywords]}, indent=2)
def check_reading_level(text: str) -> str:
words = text.split()
sentences = [s.strip() for s in text.replace('!', '.').replace('?', '.').split('.') if s.strip()]
if not sentences or not words:
return json.dumps({"error": "Text too short"}, indent=2)
syllables = sum(sum(1 for c in w if c.lower() in 'aeiou') for w in words)
grade = 0.39 * (len(words) / len(sentences)) + 11.8 * (syllables / len(words)) - 15.59
grade = max(0, min(grade, 20))
if grade < 5: level = "Elementary School"
elif grade < 8: level = "Middle School"
elif grade < 12: level = "High School"
else: level = "College"
return json.dumps({"grade_level": round(grade, 1), "reading_level": level}, indent=2)
def reverse_text(text: str) -> str:
return text[::-1]
# --- UI ---
with gr.Blocks(title="Text Processor") as demo:
gr.Markdown("# Text Processor MCP Server")
with gr.Tab("Analyze Text"):
text_input = gr.Textbox(label="Text", lines=5)
analyze_btn = gr.Button("Analyze")
output = gr.Textbox(label="Results")
analyze_btn.click(fn=analyze_text, inputs=text_input, outputs=output)
with gr.Tab("Extract Keywords"):
kw_input = gr.Textbox(label="Text", lines=5)
kw_count = gr.Slider(1, 20, value=5, step=1, label="Keyword count")
kw_btn = gr.Button("Extract")
kw_output = gr.Textbox(label="Keywords")
kw_btn.click(fn=extract_keywords, inputs=[kw_input, kw_count], outputs=kw_output)
with gr.Tab("Reading Level"):
rl_input = gr.Textbox(label="Text", lines=5)
rl_btn = gr.Button("Check")
rl_output = gr.Textbox(label="Reading Level")
rl_btn.click(fn=check_reading_level, inputs=rl_input, outputs=rl_output)
with gr.Tab("Reverse Text"):
rev_input = gr.Textbox(label="Text", lines=5)
rev_btn = gr.Button("Reverse")
rev_output = gr.Textbox(label="Reversed")
rev_btn.click(fn=reverse_text, inputs=rev_input, outputs=rev_output)
if __name__ == "__main__":
demo.launch(mcp_server=True)
|