sashtech's picture
Update app.py
3b5e5a8 verified
raw
history blame
6.5 kB
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()