File size: 3,006 Bytes
345ca03
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import streamlit as st
from transformers import pipeline
import re

st.set_page_config(page_title="Grammar Agent - Grammarly Alternative", layout="wide")
st.title("πŸ“ Grammar Agent - English Text Corrector")

# Load grammar correction model
@st.cache_resource
def load_model():
    return pipeline("text2text-generation", model="vennify/t5-base-grammar-correction")

grammar_corrector = load_model()

# Utility functions
def capitalize_sentences(text):
    sentences = re.split(r'(?<=[.!?]) +', text)
    return ' '.join(s[0].upper() + s[1:] if s else '' for s in sentences)

def correct_text(text):
    corrected = grammar_corrector(text, max_length=512)[0]['generated_text']
    corrected = capitalize_sentences(corrected)
    return corrected

def word_by_word_diff(original, corrected):
    original_words = original.split()
    corrected_words = corrected.split()
    diffs = []
    for i in range(min(len(original_words), len(corrected_words))):
        if original_words[i] != corrected_words[i]:
            diffs.append((original_words[i], corrected_words[i]))
    if len(original_words) != len(corrected_words):
        extra = corrected_words[len(original_words):]
        for word in extra:
            diffs.append(("", word))
    return diffs

def analyze_differences(original, corrected):
    diffs = word_by_word_diff(original, corrected)
    analysis = []
    for orig, corr in diffs:
        reason = "Grammar, Spelling or Punctuation correction"
        if orig == "":
            reason = "Missing word"
        elif orig.lower() != corr.lower():
            if orig.lower() == corr:
                reason = "Capitalization"
            elif re.sub(r'[.,!?;]', '', orig.lower()) == re.sub(r'[.,!?;]', '', corr.lower()):
                reason = "Punctuation"
            elif len(orig) <= 3 or len(corr) <= 3:
                reason = "Spelling"
        analysis.append({
            "Original": orig,
            "Correction": corr,
            "Reason": reason
        })
    return analysis

# Input Area
input_text = st.text_area("Enter your sentence, paragraph, or essay:", height=250)

if st.button("Correct and Analyze") and input_text:
    with st.spinner("Analyzing and correcting text..."):
        corrected = correct_text(input_text)
        analysis = analyze_differences(input_text, corrected)

    st.subheader("βœ… Corrected Text:")
    st.success(corrected)

    st.subheader("πŸ“Š Error Analysis:")
    if analysis:
        for item in analysis:
            st.markdown(f"**Original:** `{item['Original']}` β†’ **Correction:** `{item['Correction']}`")
            st.markdown(f"_Reason_: {item['Reason']}")
            st.markdown("---")
    else:
        st.write("No major corrections found. Great job!")

    st.subheader("πŸ“ƒ Side-by-Side Comparison")
    st.columns(2)[0].markdown(f"**Original:**\n\n{input_text}")
    st.columns(2)[1].markdown(f"**Corrected:**\n\n{corrected}")
else:
    st.info("Enter text above and click 'Correct and Analyze' to begin.")