File size: 5,142 Bytes
b0503ee
84669bc
b7577da
7feda08
51568dc
7fc55d1
 
6d0ac04
51568dc
 
 
 
7fc55d1
51568dc
6ba2176
51568dc
6ba2176
 
 
c163eb2
6ba2176
7feda08
d35a2d1
 
463d2eb
 
d35a2d1
 
 
 
 
 
 
 
 
 
 
 
 
463d2eb
 
d35a2d1
 
9e251df
e6cd790
9e251df
e6cd790
d35a2d1
 
 
 
9e251df
 
 
 
e6cd790
73bd89d
9e251df
e5063d8
 
 
 
 
 
d35a2d1
e5063d8
d35a2d1
e5063d8
d35a2d1
e5063d8
d35a2d1
e5063d8
d35a2d1
e5063d8
 
 
 
d35a2d1
 
 
e5063d8
 
 
d35a2d1
e5063d8
e6cd790
e5063d8
463d2eb
d2a1a53
e5063d8
d35a2d1
 
 
 
 
 
463d2eb
 
d35a2d1
 
 
 
 
 
 
 
e91f3ee
 
 
 
 
e5063d8
a4c0f0e
c163eb2
51568dc
 
 
 
d35a2d1
 
51568dc
 
 
 
d35a2d1
51568dc
 
d35a2d1
73bd89d
51568dc
aed9390
a4c0f0e
e91f3ee
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
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")

# 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 check subject-verb agreement
def check_subject_verb_agreement(doc):
    corrected_text = []
    for token in doc:
        if token.dep_ == "nsubj":  # Check if the token is a subject
            subject = token
            verb = token.head  # Find the associated verb
            if verb.tag_ in {"VBZ", "VBP"}:  # Singular/plural verb forms
                if subject.tag_ == "NNS" and verb.tag_ == "VBZ":  # Plural subject with singular verb
                    corrected_text.append(verb.lemma_)  # Convert verb to plural form
                elif subject.tag_ == "NN" and verb.tag_ == "VBP":  # Singular subject with plural verb
                    corrected_text.append(verb.lemma_ + 's')  # Convert verb to singular form
                else:
                    corrected_text.append(verb.text)  # No correction needed
            else:
                corrected_text.append(verb.text)
        corrected_text.append(token.text)
    return ' '.join(corrected_text)

# Function to correct singular/plural errors using dependency parsing
def correct_singular_plural_errors(doc):
    corrected_text = []
    
    for token in doc:
        if token.pos_ == "NOUN":
            if token.tag_ == "NN" and token.head.pos_ == "VERB" and token.head.tag_ == "VBP":
                corrected_text.append(token.lemma_ + 's')  # Singular noun, plural verb
            elif token.tag_ == "NNS" and token.head.pos_ == "VERB" and token.head.tag_ == "VBZ":
                corrected_text.append(token.lemma_)  # Plural noun, singular verb
            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:
        # Map SpaCy POS tags to WordNet POS tags
        pos = None
        if token.pos_ in {"NOUN"}:
            pos = wordnet.NOUN
        elif token.pos_ in {"VERB"}:
            pos = wordnet.VERB
        elif token.pos_ in {"ADJ"}:
            pos = wordnet.ADJ
        elif token.pos_ in {"ADV"}:
            pos = wordnet.ADV
        
        synonyms = get_synonyms_nltk(token.text.lower(), pos) if pos else []
        
        # Replace with a synonym only if it makes sense
        if synonyms and token.pos_ in {"NOUN", "VERB", "ADJ", "ADV"} and synonyms[0] != token.text.lower():
            paraphrased_words.append(synonyms[0])
        else:
            paraphrased_words.append(token.text)
    
    return ' '.join(paraphrased_words)

# 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: Parse the text with spaCy
    doc = nlp(paraphrased_text)
    
    # Step 3: Apply grammatical corrections on the paraphrased text
    corrected_text = correct_article_errors(doc)
    
    corrected_text = capitalize_sentences_and_nouns(corrected_text)
    
    corrected_text = check_subject_verb_agreement(nlp(corrected_text))
    
    corrected_text = correct_singular_plural_errors(nlp(corrected_text))
    
    # Step 4: Capitalize sentences and proper nouns (final correction step)
    final_text = correct_tense_errors(nlp(corrected_text))
    
    return final_text
def predict_en(text):
    prediction = pipeline_en(text)
    label = prediction[0]['label']
    score = prediction[0]['score']
    return label, round(score, 4)

# 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='Prob')

        # 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=5, 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()