Spaces:
Running
Running
File size: 6,452 Bytes
b0503ee 84669bc b7577da 7feda08 51568dc 7fc55d1 9079e3b 51568dc 7fc55d1 51568dc 6ba2176 51568dc 6ba2176 c163eb2 6ba2176 7feda08 b7577da 51568dc b7577da 51568dc b7577da c163eb2 b7577da 96ac1ff b7577da 51568dc b7577da 51568dc b7577da c163eb2 b7577da 51568dc b7577da 51568dc b7577da 51568dc e5063d8 51568dc c163eb2 51568dc 96ac1ff b7577da aed9390 51568dc c163eb2 |
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 180 181 182 |
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")
# Grammar, Tense, and Singular/Plural Correction Functions
# Correct article errors (e.g., "a apple" -> "an apple")
def check_article_error(text):
tokens = nltk.pos_tag(nltk.word_tokenize(text))
corrected_tokens = []
for i, token in enumerate(tokens):
word, pos = token
if word.lower() == 'a' and i < len(tokens) - 1 and tokens[i + 1][1] == 'NN':
corrected_tokens.append('an' if tokens[i + 1][0][0] in 'aeiou' else 'a')
else:
corrected_tokens.append(word)
return ' '.join(corrected_tokens)
# Correct tense errors (e.g., "She has go out" -> "She has gone out")
def check_tense_error(text):
tokens = nltk.pos_tag(nltk.word_tokenize(text))
corrected_tokens = []
for word, pos in tokens:
if word == "go" and pos == "VB":
corrected_tokens.append("gone")
elif word == "know" and pos == "VB":
corrected_tokens.append("known")
else:
corrected_tokens.append(word)
return ' '.join(corrected_tokens)
# Correct singular/plural errors (e.g., "There are many chocolate" -> "There are many chocolates")
def check_pluralization_error(text):
tokens = nltk.pos_tag(nltk.word_tokenize(text))
corrected_tokens = []
for word, pos in tokens:
if word == "chocolate" and pos == "NN":
corrected_tokens.append("chocolates")
elif word == "kids" and pos == "NNS":
corrected_tokens.append("kid")
else:
corrected_tokens.append(word)
return ' '.join(corrected_tokens)
# Combined function to correct grammar, tense, and singular/plural errors
def correct_grammar_tense_plural(text):
text = check_article_error(text)
text = check_tense_error(text)
text = check_pluralization_error(text)
return text
# 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() 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)
# 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)
# Join the words back into a sentence
paraphrased_sentence = ' '.join(paraphrased_words)
# Capitalize sentences and proper nouns
corrected_text = capitalize_sentences_and_nouns(paraphrased_sentence)
return corrected_text
# Combined function: Paraphrase -> Capitalization -> Grammar Correction
def paraphrase_and_correct(text):
# Step 1: Paraphrase the text
paraphrased_text = paraphrase_with_spacy_nltk(text)
# Step 2: Capitalize sentences and proper nouns
capitalized_text = capitalize_sentences_and_nouns(paraphrased_text)
# Step 3: Correct grammar, tense, and pluralization
final_text = correct_grammar_tense_plural(capitalized_text)
return final_text
# Gradio app setup with three 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)
with gr.Tab("Grammar Correction"):
grammar_input = gr.Textbox(lines=5, label="Input Text")
grammar_button = gr.Button("Correct Grammar")
grammar_output = gr.Textbox(label="Corrected Text")
# Connect the custom grammar, tense, and plural correction function to the button
grammar_button.click(correct_grammar_tense_plural, inputs=grammar_input, outputs=grammar_output)
# Launch the app with all functionalities
demo.launch()
|