File size: 6,503 Bytes
b0503ee
84669bc
b7577da
7feda08
51568dc
7fc55d1
 
6d0ac04
51568dc
 
 
2389531
 
 
 
 
51568dc
7fc55d1
51568dc
6ba2176
51568dc
6ba2176
 
 
c163eb2
6ba2176
7feda08
e5063d8
 
 
 
 
3b5e5a8
e5063d8
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
463d2eb
 
 
 
3b5e5a8
463d2eb
3b5e5a8
 
 
463d2eb
 
3b5e5a8
463d2eb
 
73bd89d
 
9e251df
 
e6cd790
9e251df
e6cd790
 
3b5e5a8
 
e6cd790
 
 
3b5e5a8
 
 
e6cd790
 
9e251df
 
 
 
e6cd790
73bd89d
9e251df
73bd89d
 
 
 
3b5e5a8
 
 
 
 
 
 
 
 
 
73bd89d
 
 
 
9e251df
b815c8c
e5063d8
 
 
 
 
 
 
3b5e5a8
e5063d8
3b5e5a8
e5063d8
3b5e5a8
e5063d8
3b5e5a8
e5063d8
 
 
 
3b5e5a8
 
 
 
 
 
 
 
e5063d8
 
 
 
e6cd790
e5063d8
e6cd790
e5063d8
463d2eb
d2a1a53
e5063d8
a256e24
73bd89d
463d2eb
73bd89d
3b5e5a8
463d2eb
3b5e5a8
e5063d8
a4c0f0e
c163eb2
51568dc
 
 
 
3b5e5a8
 
51568dc
 
 
 
3b5e5a8
51568dc
 
3b5e5a8
73bd89d
51568dc
aed9390
a4c0f0e
3b5e5a8
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
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
import os
import gradio as gr
from transformers import pipeline
import spacy
import subprocess
import nltk
from nltk.corpus import wordnet

# Initialize the English text classification pipeline for AI detection
pipeline_en = pipeline(task="text-classification", model="Hello-SimpleAI/chatgpt-detector-roberta")

# Function to predict the label and score for English text (AI Detection)
def predict_en(text):
    res = pipeline_en(text)[0]
    return res['label'], res['score']

# Ensure necessary NLTK data is downloaded for Humanifier
nltk.download('wordnet')
nltk.download('omw-1.4')

# Ensure the SpaCy model is installed for Humanifier
try:
    nlp = spacy.load("en_core_web_sm")
except OSError:
    subprocess.run(["python", "-m", "spacy", "download", "en_core_web_sm"])
    nlp = spacy.load("en_core_web_sm")

# Function to get synonyms using NLTK WordNet (Humanifier)
def get_synonyms_nltk(word, pos):
    synsets = wordnet.synsets(word, pos=pos)
    if synsets:
        lemmas = synsets[0].lemmas()
        return [lemma.name().replace('_', ' ') for lemma in lemmas]
    return []

# Function to capitalize the first letter of sentences and proper nouns (Humanifier)
def capitalize_sentences_and_nouns(text):
    doc = nlp(text)
    corrected_text = []

    for sent in doc.sents:
        sentence = []
        for token in sent:
            if token.i == sent.start:  # First word of the sentence
                sentence.append(token.text.capitalize())
            elif token.pos_ == "PROPN":  # Proper noun
                sentence.append(token.text.capitalize())
            else:
                sentence.append(token.text)
        corrected_text.append(' '.join(sentence))

    return ' '.join(corrected_text)

# Function to correct tense errors in a sentence (Tense Correction)
def correct_tense_errors(text):
    doc = nlp(text)
    corrected_text = []

    for token in doc:
        if token.tag_ in {"VBD", "VBN"} and token.lemma_:
            # Convert past tense verbs to their base form
            corrected_text.append(token.lemma_)
        else:
            corrected_text.append(token.text)

    return ' '.join(corrected_text)

# Function to correct singular/plural errors (Singular/Plural Correction)
def correct_singular_plural_errors(text):
    doc = nlp(text)
    corrected_text = []
    
    for token in doc:
        if token.pos_ == "NOUN":
            if token.tag_ == "NN":  # Singular noun
                if any(child.text.lower() in {'many', 'several', 'few', 'a', 'one'} for child in token.head.children):
                    corrected_text.append(token.text if token.text.endswith('s') else token.text + 's')
                else:
                    corrected_text.append(token.text)
            elif token.tag_ == "NNS":  # Plural noun
                if any(child.text.lower() in {'a', 'one'} for child in token.head.children):
                    singular = token.lemma_
                    corrected_text.append(singular)
                else:
                    corrected_text.append(token.text)
            else:
                corrected_text.append(token.text)
        else:
            corrected_text.append(token.text)
    
    return ' '.join(corrected_text)

# Function to check and correct article errors
def correct_article_errors(text):
    doc = nlp(text)
    corrected_text = []
    tokens = list(doc)
    
    for i, token in enumerate(tokens):
        if token.text.lower() in {'a', 'an'}:
            if i + 1 < len(tokens):
                next_token = tokens[i + 1]
                if next_token.text[0].lower() in 'aeiou':
                    corrected_text.append('an')
                else:
                    corrected_text.append('a')
            else:
                corrected_text.append(token.text)
        else:
            corrected_text.append(token.text)
    return ' '.join(corrected_text)

# Paraphrasing function using SpaCy and NLTK (Humanifier)
def paraphrase_with_spacy_nltk(text):
    doc = nlp(text)
    paraphrased_words = []
    
    for token in doc:
        pos = None
        if token.pos_ == "NOUN":
            pos = wordnet.NOUN
        elif token.pos_ == "VERB":
            pos = wordnet.VERB
        elif token.pos_ == "ADJ":
            pos = wordnet.ADJ
        elif token.pos_ == "ADV":
            pos = wordnet.ADV
        
        synonyms = get_synonyms_nltk(token.text.lower(), pos) if pos else []
        
        # Replace with a synonym only if it's more common and fits the context
        if synonyms and token.pos_ in {"NOUN", "VERB", "ADJ", "ADV"}:
            # Avoid replacing with the same word or rare synonyms
            synonym = synonyms[0]
            if synonym != token.text.lower() and len(synonym.split()) == 1:
                paraphrased_words.append(synonym)
            else:
                paraphrased_words.append(token.text)
        else:
            paraphrased_words.append(token.text)
    
    paraphrased_sentence = ' '.join(paraphrased_words)
    return paraphrased_sentence

# Combined function: Paraphrase -> Grammar Correction -> Capitalization (Humanifier)
def paraphrase_and_correct(text):
    # Step 1: Paraphrase the text
    paraphrased_text = paraphrase_with_spacy_nltk(text)
    
    # Step 2: Apply grammatical corrections on the paraphrased text
    corrected_text = correct_article_errors(paraphrased_text)
    corrected_text = capitalize_sentences_and_nouns(corrected_text)
    corrected_text = correct_singular_plural_errors(corrected_text)
    corrected_text = correct_tense_errors(corrected_text)
    
    return corrected_text

# Gradio app setup with two tabs
with gr.Blocks() as demo:
    with gr.Tab("AI Detection"):
        t1 = gr.Textbox(lines=5, label='Text')
        button1 = gr.Button("🤖 Predict!")
        label1 = gr.Textbox(lines=1, label='Predicted Label 🎃')
        score1 = gr.Textbox(lines=1, label='Probability')
        
        # Connect the prediction function to the button
        button1.click(predict_en, inputs=[t1], outputs=[label1, score1], api_name='predict_en')
    
    with gr.Tab("Humanifier"):
        text_input = gr.Textbox(lines=10, label="Input Text")
        paraphrase_button = gr.Button("Paraphrase & Correct")
        output_text = gr.Textbox(label="Paraphrased Text")
        
        # Connect the paraphrasing function to the button
        paraphrase_button.click(paraphrase_and_correct, inputs=text_input, outputs=output_text)

# Launch the app with the remaining functionalities
demo.launch()