AutoTypo / app.py
PixiRus's picture
Update app.py
e27b837 verified
Raw
History Blame Contribute Delete
2.62 kB
import gradio as gr
import numpy as np
from autocorrect_package.autocorrection import Autocorrection
# Initialize spell checker
checker = Autocorrection("autocorrect_package/corpus.txt")
# Shared state
state = {"input_text": "", "last_word": "", "suggestions": []}
# Suggestion generator
def live_autocorrect(input_text):
state["input_text"] = input_text
words = input_text.strip().split()
if not words:
state["last_word"] = ""
state["suggestions"] = []
return input_text, []
last_word = words[-1].lower()
state["last_word"] = last_word
# Already correct
if last_word in checker.vocabulary:
state["suggestions"] = []
return input_text, []
# Get corrections
corrections = checker.correct_spelling(last_word)
corrections = sorted(corrections, key=lambda x: x[1], reverse=True)[:5]
state["suggestions"] = corrections
return input_text, [w for w, _ in corrections]
# Replace last word when clicked
def apply_suggestion(evt: gr.SelectData):
if not evt or not state["input_text"] or not state["last_word"]:
return state["input_text"]
selected_word = evt.value.split(" ")[0]
words = state["input_text"].strip().split()
if words:
words[-1] = selected_word
new_text = " ".join(words)
state["input_text"] = new_text
return new_text
return state["input_text"]
# This function is called on every text change, but only triggers correction if live_mode is True
def trigger_conditionally(input_text, live_mode):
if live_mode:
return live_autocorrect(input_text)
else:
return gr.update(), gr.update()
# Gradio UI
with gr.Blocks() as demo:
gr.Markdown("## πŸ“ Text Suggestion & Correction")
gr.Markdown("Toggle 'Live Mode' for real-time suggestions, or use the button.")
live_toggle = gr.Checkbox(label="Enable Live Mode", value=False)
input_box = gr.Textbox(label="Type here...", placeholder="Start typing...", lines=2)
suggest_button = gr.Button("πŸ” Suggest Corrections")
suggestion_list = gr.List(label="Suggestions (click to replace)", interactive=True)
# When typing, only trigger suggestions if live mode is ON
input_box.change(fn=trigger_conditionally, inputs=[input_box, live_toggle], outputs=[input_box, suggestion_list])
# Button trigger (always works)
suggest_button.click(fn=live_autocorrect, inputs=input_box, outputs=[input_box, suggestion_list])
# Click to replace word
suggestion_list.select(fn=apply_suggestion, outputs=input_box)
if __name__ == "__main__":
demo.launch()