Spaces:
Running
Running
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() |