Spaces:
Running
Running
Commit
Β·
a9b4a28
1
Parent(s):
c2eb158
auth humanizer
Browse files- __pycache__/universal_humanizer.cpython-310.pyc +0 -0
- app.py +162 -211
- authentic_humanizer.py +759 -0
__pycache__/universal_humanizer.cpython-310.pyc
ADDED
|
Binary file (15.8 kB). View file
|
|
|
app.py
CHANGED
|
@@ -1,72 +1,27 @@
|
|
| 1 |
-
#
|
| 2 |
-
#
|
| 3 |
|
| 4 |
import gradio as gr
|
| 5 |
import time
|
| 6 |
import os
|
| 7 |
-
import nltk
|
| 8 |
|
| 9 |
-
|
| 10 |
-
|
| 11 |
-
resources = {
|
| 12 |
-
'punkt': 'tokenizers/punkt',
|
| 13 |
-
'punkt_tab': 'tokenizers/punkt_tab',
|
| 14 |
-
'wordnet': 'corpora/wordnet',
|
| 15 |
-
'omw-1.4': 'corpora/omw-1.4'
|
| 16 |
-
}
|
| 17 |
-
for name, path in resources.items():
|
| 18 |
-
try:
|
| 19 |
-
nltk.data.find(path)
|
| 20 |
-
print(f"β
Resource already present: {name}")
|
| 21 |
-
except LookupError:
|
| 22 |
-
print(f"π Downloading {name} β¦")
|
| 23 |
-
try:
|
| 24 |
-
nltk.download(name, quiet=True)
|
| 25 |
-
print(f"β
Downloaded {name}")
|
| 26 |
-
except Exception as e:
|
| 27 |
-
print(f"β Failed to download {name}: {e}")
|
| 28 |
-
|
| 29 |
-
def test_nltk_setup():
|
| 30 |
-
"""Test basic tokenization & lemmatization to verify setup."""
|
| 31 |
-
from nltk.tokenize import word_tokenize, sent_tokenize
|
| 32 |
-
from nltk.stem import WordNetLemmatizer
|
| 33 |
-
|
| 34 |
-
text = "This is a test. Testing tokenization and lemmatization."
|
| 35 |
-
# Test sentence splitting
|
| 36 |
-
sentences = sent_tokenize(text)
|
| 37 |
-
print(f"Sentence tokenize works: {len(sentences)} sentences: {sentences}")
|
| 38 |
-
# Test word tokenization
|
| 39 |
-
words = word_tokenize(text)
|
| 40 |
-
print(f"Word tokenize works: {len(words)} words: {words}")
|
| 41 |
-
# Test lemmatization
|
| 42 |
-
lemmatizer = WordNetLemmatizer()
|
| 43 |
-
lem = [lemmatizer.lemmatize(w) for w in words]
|
| 44 |
-
print(f"Lemmatization works: {lem}")
|
| 45 |
-
|
| 46 |
-
# In startup part of your app
|
| 47 |
-
print("π Ensuring NLTK minimal resources β¦")
|
| 48 |
-
ensure_nltk_resources()
|
| 49 |
-
print("π§ Testing NLTK setup β¦")
|
| 50 |
-
test_nltk_setup()
|
| 51 |
-
|
| 52 |
-
|
| 53 |
-
# Import our universal humanizer
|
| 54 |
-
from universal_humanizer import UniversalAITextHumanizer
|
| 55 |
|
| 56 |
# Global variables
|
| 57 |
humanizer = None
|
| 58 |
initialization_status = {}
|
| 59 |
|
| 60 |
-
def
|
| 61 |
-
"""Initialize the
|
| 62 |
global humanizer, initialization_status
|
| 63 |
|
| 64 |
-
print("
|
| 65 |
-
print("π―
|
| 66 |
|
| 67 |
try:
|
| 68 |
-
# Initialize with
|
| 69 |
-
humanizer =
|
| 70 |
|
| 71 |
initialization_status = {
|
| 72 |
"humanizer_loaded": True,
|
|
@@ -74,44 +29,46 @@ def initialize_universal_humanizer():
|
|
| 74 |
"ai_paraphrasing": humanizer.paraphraser is not None,
|
| 75 |
"tfidf_fallback": humanizer.tfidf_vectorizer is not None,
|
| 76 |
"structure_preservation": True,
|
| 77 |
-
"
|
|
|
|
| 78 |
"quality_control": True,
|
| 79 |
-
"total_features":
|
| 80 |
"enabled_features": sum([
|
| 81 |
bool(humanizer.similarity_model),
|
| 82 |
bool(humanizer.paraphraser),
|
| 83 |
bool(humanizer.tfidf_vectorizer),
|
| 84 |
True, # Structure preservation
|
| 85 |
-
True, #
|
|
|
|
| 86 |
True # Quality control
|
| 87 |
])
|
| 88 |
}
|
| 89 |
|
| 90 |
-
print("β
|
| 91 |
print(f"π― System completeness: {(initialization_status['enabled_features']/initialization_status['total_features'])*100:.1f}%")
|
| 92 |
|
| 93 |
return True
|
| 94 |
|
| 95 |
except Exception as e:
|
| 96 |
-
print(f"β Error initializing
|
| 97 |
initialization_status = {"error": str(e), "humanizer_loaded": False}
|
| 98 |
return False
|
| 99 |
|
| 100 |
-
def
|
| 101 |
"""
|
| 102 |
-
|
| 103 |
"""
|
| 104 |
if not text.strip():
|
| 105 |
return "β οΈ Please enter some text to humanize.", "", ""
|
| 106 |
|
| 107 |
if humanizer is None:
|
| 108 |
-
return "β Error:
|
| 109 |
|
| 110 |
try:
|
| 111 |
start_time = time.time()
|
| 112 |
|
| 113 |
-
# Use
|
| 114 |
-
result = humanizer.
|
| 115 |
text=text,
|
| 116 |
style=style.lower(),
|
| 117 |
intensity=intensity
|
|
@@ -120,7 +77,7 @@ def humanize_text_universal_hf(text, style, intensity):
|
|
| 120 |
processing_time = (time.time() - start_time) * 1000
|
| 121 |
|
| 122 |
# Format results for display
|
| 123 |
-
stats = f"""
|
| 124 |
- **Similarity Score**: {result['similarity_score']:.3f} (Meaning preserved)
|
| 125 |
- **Processing Time**: {processing_time:.1f}ms
|
| 126 |
- **Style**: {result['style'].title()}
|
|
@@ -128,16 +85,18 @@ def humanize_text_universal_hf(text, style, intensity):
|
|
| 128 |
- **Structure Preserved**: β
Yes
|
| 129 |
- **Word Count**: {result['word_count_original']} β {result['word_count_humanized']}
|
| 130 |
|
| 131 |
-
|
| 132 |
-
{chr(10).join([f'β’ {change}' for change in result['changes_made']]) if result['changes_made'] else 'β’
|
| 133 |
|
| 134 |
-
# Status based on quality
|
| 135 |
if result['similarity_score'] > 0.85:
|
| 136 |
-
status = "π Excellent -
|
| 137 |
elif result['similarity_score'] > 0.75:
|
| 138 |
-
status = "β
Good -
|
|
|
|
|
|
|
| 139 |
else:
|
| 140 |
-
status = "
|
| 141 |
|
| 142 |
return result['humanized_text'], stats, status
|
| 143 |
|
|
@@ -151,7 +110,7 @@ def get_system_status():
|
|
| 151 |
return "β System Not Ready", "red"
|
| 152 |
|
| 153 |
enabled = initialization_status.get('enabled_features', 0)
|
| 154 |
-
total = initialization_status.get('total_features',
|
| 155 |
completeness = (enabled / total) * 100
|
| 156 |
|
| 157 |
if completeness >= 90:
|
|
@@ -163,25 +122,25 @@ def get_system_status():
|
|
| 163 |
else:
|
| 164 |
return f"β Limited Features ({completeness:.0f}%)", "red"
|
| 165 |
|
| 166 |
-
# Initialize the
|
| 167 |
-
initialization_success =
|
| 168 |
|
| 169 |
-
# Create the
|
| 170 |
with gr.Blocks(
|
| 171 |
-
title="
|
| 172 |
theme=gr.themes.Soft(),
|
| 173 |
css="""
|
| 174 |
.main-header {
|
| 175 |
text-align: center;
|
| 176 |
-
background: linear-gradient(135deg, #
|
| 177 |
color: white;
|
| 178 |
padding: 30px;
|
| 179 |
border-radius: 15px;
|
| 180 |
margin-bottom: 30px;
|
| 181 |
box-shadow: 0 8px 25px rgba(0,0,0,0.15);
|
| 182 |
}
|
| 183 |
-
.
|
| 184 |
-
background: linear-gradient(135deg, #
|
| 185 |
color: white;
|
| 186 |
padding: 8px 16px;
|
| 187 |
border-radius: 20px;
|
|
@@ -200,26 +159,26 @@ with gr.Blocks(
|
|
| 200 |
.status-green { background-color: #d5f4e6; border: 2px solid #27ae60; color: #1e8449; }
|
| 201 |
.status-orange { background-color: #fdeaa7; border: 2px solid #f39c12; color: #b7950b; }
|
| 202 |
.status-red { background-color: #fadbd8; border: 2px solid #e74c3c; color: #c0392b; }
|
| 203 |
-
.
|
| 204 |
-
background: linear-gradient(135deg, #
|
| 205 |
color: white;
|
| 206 |
padding: 20px;
|
| 207 |
border-radius: 15px;
|
| 208 |
margin: 15px 0;
|
| 209 |
}
|
| 210 |
-
.
|
| 211 |
background: #f8f9fa;
|
| 212 |
padding: 15px;
|
| 213 |
border-radius: 10px;
|
| 214 |
-
border-left: 5px solid #
|
| 215 |
margin: 10px 0;
|
| 216 |
}
|
| 217 |
-
.
|
| 218 |
-
background: linear-gradient(135deg, #
|
| 219 |
padding: 15px;
|
| 220 |
border-radius: 10px;
|
| 221 |
margin: 10px 0;
|
| 222 |
-
border: 2px solid #
|
| 223 |
}
|
| 224 |
.control-panel {
|
| 225 |
background: #f1f3f4;
|
|
@@ -232,14 +191,13 @@ with gr.Blocks(
|
|
| 232 |
|
| 233 |
gr.HTML(f"""
|
| 234 |
<div class="main-header">
|
| 235 |
-
<h1
|
| 236 |
-
<p><strong>
|
| 237 |
-
<p><em>
|
| 238 |
<div style="margin-top: 15px;">
|
| 239 |
-
<span class="
|
| 240 |
-
<span class="
|
| 241 |
-
<span class="
|
| 242 |
-
<span class="use-case-badge">Business</span>
|
| 243 |
</div>
|
| 244 |
</div>
|
| 245 |
""")
|
|
@@ -259,14 +217,14 @@ with gr.Blocks(
|
|
| 259 |
</div>
|
| 260 |
""")
|
| 261 |
|
| 262 |
-
with gr.Tab("
|
| 263 |
with gr.Row():
|
| 264 |
with gr.Column(scale=1):
|
| 265 |
-
gr.HTML("<h3
|
| 266 |
|
| 267 |
input_text = gr.Textbox(
|
| 268 |
-
label="Paste Your AI Text Here",
|
| 269 |
-
placeholder="Enter your AI-generated content...\n\
|
| 270 |
lines=12,
|
| 271 |
max_lines=20
|
| 272 |
)
|
|
@@ -276,29 +234,42 @@ with gr.Blocks(
|
|
| 276 |
choices=["Natural", "Conversational"],
|
| 277 |
value="Natural",
|
| 278 |
label="β¨ Writing Style",
|
| 279 |
-
info="Natural: Professional
|
| 280 |
)
|
| 281 |
|
| 282 |
intensity_slider = gr.Slider(
|
| 283 |
-
minimum=0.
|
| 284 |
maximum=1.0,
|
| 285 |
-
value=0.
|
| 286 |
step=0.1,
|
| 287 |
-
label="ποΈ
|
| 288 |
-
info="
|
| 289 |
)
|
| 290 |
|
| 291 |
humanize_btn = gr.Button(
|
| 292 |
-
"
|
| 293 |
variant="primary",
|
| 294 |
size="lg"
|
| 295 |
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 296 |
|
| 297 |
with gr.Column(scale=1):
|
| 298 |
-
gr.HTML("<h3
|
| 299 |
|
| 300 |
output_text = gr.Textbox(
|
| 301 |
-
label="
|
| 302 |
lines=12,
|
| 303 |
max_lines=20,
|
| 304 |
show_copy_button=True
|
|
@@ -311,162 +282,142 @@ with gr.Blocks(
|
|
| 311 |
)
|
| 312 |
|
| 313 |
# Results display
|
| 314 |
-
gr.HTML("<h3>π
|
| 315 |
results_display = gr.Markdown(
|
| 316 |
-
label="Results &
|
| 317 |
-
value="
|
| 318 |
)
|
| 319 |
|
| 320 |
-
with gr.Tab("π―
|
| 321 |
-
gr.HTML("""
|
| 322 |
-
<div class="universal-box">
|
| 323 |
-
<h3>π Perfect for ALL Business Needs</h3>
|
| 324 |
-
<p>This universal humanizer is designed to work for every type of business content:</p>
|
| 325 |
-
</div>
|
| 326 |
-
""")
|
| 327 |
-
|
| 328 |
-
# Business use cases
|
| 329 |
gr.HTML("""
|
| 330 |
-
<div class="
|
| 331 |
-
<
|
| 332 |
-
<
|
| 333 |
-
<li><strong>Product Descriptions:</strong> Make AI product descriptions sound engaging and trustworthy</li>
|
| 334 |
-
<li><strong>Category Pages:</strong> Humanize SEO content for better rankings</li>
|
| 335 |
-
<li><strong>Customer Emails:</strong> Create natural-sounding automated emails</li>
|
| 336 |
-
<li><strong>Marketing Copy:</strong> Transform AI ads into persuasive, human content</li>
|
| 337 |
-
</ul>
|
| 338 |
-
</div>
|
| 339 |
-
|
| 340 |
-
<div class="business-box">
|
| 341 |
-
<h4>π’ Marketing & Advertising</h4>
|
| 342 |
-
<ul>
|
| 343 |
-
<li><strong>Social Media Posts:</strong> Make AI content engaging for your audience</li>
|
| 344 |
-
<li><strong>Blog Articles:</strong> Transform AI drafts into natural, readable posts</li>
|
| 345 |
-
<li><strong>Email Campaigns:</strong> Humanize automated marketing emails</li>
|
| 346 |
-
<li><strong>Ad Copy:</strong> Create compelling, natural-sounding advertisements</li>
|
| 347 |
-
</ul>
|
| 348 |
-
</div>
|
| 349 |
-
|
| 350 |
-
<div class="business-box">
|
| 351 |
-
<h4>π SEO & Content Marketing</h4>
|
| 352 |
-
<ul>
|
| 353 |
-
<li><strong>Website Content:</strong> Make AI content rank better and engage readers</li>
|
| 354 |
-
<li><strong>Blog Posts:</strong> Create natural content that Google loves</li>
|
| 355 |
-
<li><strong>Meta Descriptions:</strong> Write compelling, human-like meta descriptions</li>
|
| 356 |
-
<li><strong>Landing Pages:</strong> Convert AI content into persuasive pages</li>
|
| 357 |
-
</ul>
|
| 358 |
-
</div>
|
| 359 |
-
|
| 360 |
-
<div class="business-box">
|
| 361 |
-
<h4>π’ Business & Professional</h4>
|
| 362 |
-
<ul>
|
| 363 |
-
<li><strong>Business Reports:</strong> Make AI reports sound professional</li>
|
| 364 |
-
<li><strong>Presentations:</strong> Transform AI content into engaging presentations</li>
|
| 365 |
-
<li><strong>Proposals:</strong> Create compelling, human business proposals</li>
|
| 366 |
-
<li><strong>Internal Communications:</strong> Humanize automated business communications</li>
|
| 367 |
-
</ul>
|
| 368 |
</div>
|
| 369 |
""")
|
| 370 |
|
| 371 |
-
# Examples
|
| 372 |
-
gr.HTML("<h3>π‘
|
| 373 |
|
| 374 |
examples = gr.Examples(
|
| 375 |
examples=[
|
| 376 |
[
|
| 377 |
-
"Furthermore, this
|
| 378 |
"Natural",
|
| 379 |
-
0.
|
| 380 |
],
|
| 381 |
[
|
| 382 |
-
"Our comprehensive solution facilitates unprecedented optimization of business processes.
|
| 383 |
"Conversational",
|
| 384 |
0.8
|
| 385 |
],
|
| 386 |
[
|
| 387 |
-
"
|
| 388 |
"Natural",
|
| 389 |
-
0.
|
| 390 |
],
|
| 391 |
[
|
| 392 |
-
"
|
| 393 |
"Conversational",
|
| 394 |
-
0.
|
| 395 |
]
|
| 396 |
],
|
| 397 |
inputs=[input_text, style_dropdown, intensity_slider],
|
| 398 |
outputs=[output_text, results_display, status_output],
|
| 399 |
-
fn=
|
| 400 |
cache_examples=False,
|
| 401 |
-
label="π― Click any example to see
|
| 402 |
)
|
| 403 |
|
| 404 |
-
#
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 405 |
gr.HTML("""
|
| 406 |
-
<div class="
|
| 407 |
-
<h3
|
| 408 |
<div style="display: grid; grid-template-columns: 1fr 1fr; gap: 20px;">
|
| 409 |
<div>
|
| 410 |
-
<h4
|
| 411 |
<ul>
|
| 412 |
-
<li>
|
| 413 |
-
<li>
|
| 414 |
-
<li>
|
| 415 |
-
<li>
|
| 416 |
</ul>
|
| 417 |
</div>
|
| 418 |
<div>
|
| 419 |
-
<h4
|
| 420 |
<ul>
|
| 421 |
-
<li>
|
| 422 |
-
<li>
|
| 423 |
-
<li>
|
| 424 |
-
<li>
|
| 425 |
</ul>
|
| 426 |
</div>
|
| 427 |
</div>
|
| 428 |
</div>
|
| 429 |
""")
|
| 430 |
-
|
| 431 |
-
# Simple usage guide
|
| 432 |
-
gr.HTML("""
|
| 433 |
-
<div class="business-box">
|
| 434 |
-
<h3>π Simple Usage Guide</h3>
|
| 435 |
-
|
| 436 |
-
<h4>β¨ Choose Your Style:</h4>
|
| 437 |
-
<ul>
|
| 438 |
-
<li><strong>Natural (Recommended):</strong> Perfect for business content, e-commerce, and professional use</li>
|
| 439 |
-
<li><strong>Conversational:</strong> Great for social media, marketing, and engaging content</li>
|
| 440 |
-
</ul>
|
| 441 |
-
|
| 442 |
-
<h4>ποΈ Set Your Intensity:</h4>
|
| 443 |
-
<ul>
|
| 444 |
-
<li><strong>0.3-0.5:</strong> Subtle changes, keeps very professional tone</li>
|
| 445 |
-
<li><strong>0.6-0.8:</strong> Balanced humanization (recommended for most use cases)</li>
|
| 446 |
-
<li><strong>0.9-1.0:</strong> Maximum humanization, very natural and engaging</li>
|
| 447 |
-
</ul>
|
| 448 |
-
|
| 449 |
-
<h4>π― Best Practices:</h4>
|
| 450 |
-
<ul>
|
| 451 |
-
<li>Use <strong>Natural + 0.7</strong> for most business content</li>
|
| 452 |
-
<li>Use <strong>Conversational + 0.8</strong> for marketing and social media</li>
|
| 453 |
-
<li>Always review the output to ensure it matches your brand voice</li>
|
| 454 |
-
<li>The tool preserves structure, so your formatting stays intact</li>
|
| 455 |
-
</ul>
|
| 456 |
-
</div>
|
| 457 |
-
""")
|
| 458 |
|
| 459 |
# Event handlers
|
| 460 |
humanize_btn.click(
|
| 461 |
-
fn=
|
| 462 |
inputs=[input_text, style_dropdown, intensity_slider],
|
| 463 |
outputs=[output_text, results_display, status_output]
|
| 464 |
)
|
| 465 |
|
| 466 |
# Launch the interface
|
| 467 |
if __name__ == "__main__":
|
| 468 |
-
print("π Launching
|
| 469 |
-
print(f"
|
| 470 |
|
| 471 |
demo.launch(
|
| 472 |
share=False,
|
|
|
|
| 1 |
+
# Authentic AI Text Humanizer for Hugging Face Spaces
|
| 2 |
+
# Makes text truly sound human and authentic
|
| 3 |
|
| 4 |
import gradio as gr
|
| 5 |
import time
|
| 6 |
import os
|
|
|
|
| 7 |
|
| 8 |
+
# Import our authentic humanizer
|
| 9 |
+
from authentic_humanizer import AuthenticAITextHumanizer
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 10 |
|
| 11 |
# Global variables
|
| 12 |
humanizer = None
|
| 13 |
initialization_status = {}
|
| 14 |
|
| 15 |
+
def initialize_authentic_humanizer():
|
| 16 |
+
"""Initialize the authentic humanizer"""
|
| 17 |
global humanizer, initialization_status
|
| 18 |
|
| 19 |
+
print("β¨ Initializing Authentic AI Text Humanizer...")
|
| 20 |
+
print("π― Designed to write like a real human - natural & authentic")
|
| 21 |
|
| 22 |
try:
|
| 23 |
+
# Initialize with authentic settings
|
| 24 |
+
humanizer = AuthenticAITextHumanizer(enable_gpu=True)
|
| 25 |
|
| 26 |
initialization_status = {
|
| 27 |
"humanizer_loaded": True,
|
|
|
|
| 29 |
"ai_paraphrasing": humanizer.paraphraser is not None,
|
| 30 |
"tfidf_fallback": humanizer.tfidf_vectorizer is not None,
|
| 31 |
"structure_preservation": True,
|
| 32 |
+
"authentic_patterns": True,
|
| 33 |
+
"conversational_flow": True,
|
| 34 |
"quality_control": True,
|
| 35 |
+
"total_features": 7,
|
| 36 |
"enabled_features": sum([
|
| 37 |
bool(humanizer.similarity_model),
|
| 38 |
bool(humanizer.paraphraser),
|
| 39 |
bool(humanizer.tfidf_vectorizer),
|
| 40 |
True, # Structure preservation
|
| 41 |
+
True, # Authentic patterns
|
| 42 |
+
True, # Conversational flow
|
| 43 |
True # Quality control
|
| 44 |
])
|
| 45 |
}
|
| 46 |
|
| 47 |
+
print("β
Authentic humanizer ready for natural text transformation!")
|
| 48 |
print(f"π― System completeness: {(initialization_status['enabled_features']/initialization_status['total_features'])*100:.1f}%")
|
| 49 |
|
| 50 |
return True
|
| 51 |
|
| 52 |
except Exception as e:
|
| 53 |
+
print(f"β Error initializing authentic humanizer: {e}")
|
| 54 |
initialization_status = {"error": str(e), "humanizer_loaded": False}
|
| 55 |
return False
|
| 56 |
|
| 57 |
+
def humanize_text_authentic_hf(text, style, intensity):
|
| 58 |
"""
|
| 59 |
+
Authentic humanization interface for HF Spaces
|
| 60 |
"""
|
| 61 |
if not text.strip():
|
| 62 |
return "β οΈ Please enter some text to humanize.", "", ""
|
| 63 |
|
| 64 |
if humanizer is None:
|
| 65 |
+
return "β Error: Authentic humanizer not loaded. Please refresh the page.", "", ""
|
| 66 |
|
| 67 |
try:
|
| 68 |
start_time = time.time()
|
| 69 |
|
| 70 |
+
# Use authentic humanization
|
| 71 |
+
result = humanizer.humanize_text_authentic(
|
| 72 |
text=text,
|
| 73 |
style=style.lower(),
|
| 74 |
intensity=intensity
|
|
|
|
| 77 |
processing_time = (time.time() - start_time) * 1000
|
| 78 |
|
| 79 |
# Format results for display
|
| 80 |
+
stats = f"""**β¨ Authentic Results:**
|
| 81 |
- **Similarity Score**: {result['similarity_score']:.3f} (Meaning preserved)
|
| 82 |
- **Processing Time**: {processing_time:.1f}ms
|
| 83 |
- **Style**: {result['style'].title()}
|
|
|
|
| 85 |
- **Structure Preserved**: β
Yes
|
| 86 |
- **Word Count**: {result['word_count_original']} β {result['word_count_humanized']}
|
| 87 |
|
| 88 |
+
**π― Authentic Transformations Applied:**
|
| 89 |
+
{chr(10).join([f'β’ {change}' for change in result['changes_made']]) if result['changes_made'] else 'β’ Text was already natural - no changes needed'}"""
|
| 90 |
|
| 91 |
+
# Status based on quality and authenticity
|
| 92 |
if result['similarity_score'] > 0.85:
|
| 93 |
+
status = "π Excellent - Authentic and natural while preserving meaning"
|
| 94 |
elif result['similarity_score'] > 0.75:
|
| 95 |
+
status = "β
Good - Natural transformation with meaning preserved"
|
| 96 |
+
elif result['similarity_score'] > 0.65:
|
| 97 |
+
status = "β οΈ Moderate - Some meaning preserved with natural flow"
|
| 98 |
else:
|
| 99 |
+
status = "π Reverted to original to preserve meaning"
|
| 100 |
|
| 101 |
return result['humanized_text'], stats, status
|
| 102 |
|
|
|
|
| 110 |
return "β System Not Ready", "red"
|
| 111 |
|
| 112 |
enabled = initialization_status.get('enabled_features', 0)
|
| 113 |
+
total = initialization_status.get('total_features', 7)
|
| 114 |
completeness = (enabled / total) * 100
|
| 115 |
|
| 116 |
if completeness >= 90:
|
|
|
|
| 122 |
else:
|
| 123 |
return f"β Limited Features ({completeness:.0f}%)", "red"
|
| 124 |
|
| 125 |
+
# Initialize the authentic humanizer on startup
|
| 126 |
+
initialization_success = initialize_authentic_humanizer()
|
| 127 |
|
| 128 |
+
# Create the authentic Gradio interface
|
| 129 |
with gr.Blocks(
|
| 130 |
+
title="β¨ Authentic AI Text Humanizer - Writes Like a Real Human",
|
| 131 |
theme=gr.themes.Soft(),
|
| 132 |
css="""
|
| 133 |
.main-header {
|
| 134 |
text-align: center;
|
| 135 |
+
background: linear-gradient(135deg, #e74c3c 0%, #c0392b 100%);
|
| 136 |
color: white;
|
| 137 |
padding: 30px;
|
| 138 |
border-radius: 15px;
|
| 139 |
margin-bottom: 30px;
|
| 140 |
box-shadow: 0 8px 25px rgba(0,0,0,0.15);
|
| 141 |
}
|
| 142 |
+
.authentic-badge {
|
| 143 |
+
background: linear-gradient(135deg, #f39c12 0%, #e67e22 100%);
|
| 144 |
color: white;
|
| 145 |
padding: 8px 16px;
|
| 146 |
border-radius: 20px;
|
|
|
|
| 159 |
.status-green { background-color: #d5f4e6; border: 2px solid #27ae60; color: #1e8449; }
|
| 160 |
.status-orange { background-color: #fdeaa7; border: 2px solid #f39c12; color: #b7950b; }
|
| 161 |
.status-red { background-color: #fadbd8; border: 2px solid #e74c3c; color: #c0392b; }
|
| 162 |
+
.authentic-box {
|
| 163 |
+
background: linear-gradient(135deg, #e74c3c 0%, #c0392b 100%);
|
| 164 |
color: white;
|
| 165 |
padding: 20px;
|
| 166 |
border-radius: 15px;
|
| 167 |
margin: 15px 0;
|
| 168 |
}
|
| 169 |
+
.human-box {
|
| 170 |
background: #f8f9fa;
|
| 171 |
padding: 15px;
|
| 172 |
border-radius: 10px;
|
| 173 |
+
border-left: 5px solid #e74c3c;
|
| 174 |
margin: 10px 0;
|
| 175 |
}
|
| 176 |
+
.natural-highlight {
|
| 177 |
+
background: linear-gradient(135deg, #fdf2e9 0%, #fdeaa7 100%);
|
| 178 |
padding: 15px;
|
| 179 |
border-radius: 10px;
|
| 180 |
margin: 10px 0;
|
| 181 |
+
border: 2px solid #f39c12;
|
| 182 |
}
|
| 183 |
.control-panel {
|
| 184 |
background: #f1f3f4;
|
|
|
|
| 191 |
|
| 192 |
gr.HTML(f"""
|
| 193 |
<div class="main-header">
|
| 194 |
+
<h1>β¨ Authentic AI Text Humanizer</h1>
|
| 195 |
+
<p><strong>Makes AI Text Sound Like a Real Human Wrote It</strong></p>
|
| 196 |
+
<p><em>Natural, conversational, and authentic - not just word replacement</em></p>
|
| 197 |
<div style="margin-top: 15px;">
|
| 198 |
+
<span class="authentic-badge">Authentic Writing</span>
|
| 199 |
+
<span class="authentic-badge">Natural Flow</span>
|
| 200 |
+
<span class="authentic-badge">Real Human Voice</span>
|
|
|
|
| 201 |
</div>
|
| 202 |
</div>
|
| 203 |
""")
|
|
|
|
| 217 |
</div>
|
| 218 |
""")
|
| 219 |
|
| 220 |
+
with gr.Tab("β¨ Humanize Your Text"):
|
| 221 |
with gr.Row():
|
| 222 |
with gr.Column(scale=1):
|
| 223 |
+
gr.HTML("<h3>π€ Your AI Text</h3>")
|
| 224 |
|
| 225 |
input_text = gr.Textbox(
|
| 226 |
+
label="Paste Your Robotic AI Text Here",
|
| 227 |
+
placeholder="Enter your AI-generated content that sounds too formal or robotic...\n\nExample:\n'Furthermore, this revolutionary product demonstrates exceptional capabilities and utilizes advanced technology to ensure optimal performance. Subsequently, users will experience significant improvements in their daily activities.'\n\nThe humanizer will make it sound like a real person wrote it - natural, authentic, and engaging!",
|
| 228 |
lines=12,
|
| 229 |
max_lines=20
|
| 230 |
)
|
|
|
|
| 234 |
choices=["Natural", "Conversational"],
|
| 235 |
value="Natural",
|
| 236 |
label="β¨ Writing Style",
|
| 237 |
+
info="Natural: Professional but human | Conversational: Friendly & engaging"
|
| 238 |
)
|
| 239 |
|
| 240 |
intensity_slider = gr.Slider(
|
| 241 |
+
minimum=0.4,
|
| 242 |
maximum=1.0,
|
| 243 |
+
value=0.8,
|
| 244 |
step=0.1,
|
| 245 |
+
label="ποΈ Authenticity Level",
|
| 246 |
+
info="Higher = more human-like and natural (0.8 recommended)"
|
| 247 |
)
|
| 248 |
|
| 249 |
humanize_btn = gr.Button(
|
| 250 |
+
"β¨ Make It Sound Human",
|
| 251 |
variant="primary",
|
| 252 |
size="lg"
|
| 253 |
)
|
| 254 |
+
|
| 255 |
+
gr.HTML("""
|
| 256 |
+
<div class="natural-highlight">
|
| 257 |
+
<h4>π‘ What This Does Differently:</h4>
|
| 258 |
+
<ul>
|
| 259 |
+
<li><strong>Breaks up long sentences</strong> into natural, readable chunks</li>
|
| 260 |
+
<li><strong>Removes robotic phrases</strong> like "Furthermore", "Subsequently"</li>
|
| 261 |
+
<li><strong>Replaces business jargon</strong> with everyday language</li>
|
| 262 |
+
<li><strong>Adds conversational flow</strong> and natural transitions</li>
|
| 263 |
+
<li><strong>Makes it sound authentic</strong> like a real person wrote it</li>
|
| 264 |
+
</ul>
|
| 265 |
+
</div>
|
| 266 |
+
""")
|
| 267 |
|
| 268 |
with gr.Column(scale=1):
|
| 269 |
+
gr.HTML("<h3>π€ Your Human Text</h3>")
|
| 270 |
|
| 271 |
output_text = gr.Textbox(
|
| 272 |
+
label="Natural, Human-Sounding Content",
|
| 273 |
lines=12,
|
| 274 |
max_lines=20,
|
| 275 |
show_copy_button=True
|
|
|
|
| 282 |
)
|
| 283 |
|
| 284 |
# Results display
|
| 285 |
+
gr.HTML("<h3>π Transformation Details</h3>")
|
| 286 |
results_display = gr.Markdown(
|
| 287 |
+
label="Results & Authentic Changes",
|
| 288 |
+
value="Transformation details will appear here after humanization..."
|
| 289 |
)
|
| 290 |
|
| 291 |
+
with gr.Tab("π― Examples & How It Works"):
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 292 |
gr.HTML("""
|
| 293 |
+
<div class="authentic-box">
|
| 294 |
+
<h3>β¨ What Makes This Authentic Humanizer Different</h3>
|
| 295 |
+
<p>Unlike simple word replacement tools, this humanizer understands how real humans write and completely transforms robotic AI text into authentic, natural language.</p>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 296 |
</div>
|
| 297 |
""")
|
| 298 |
|
| 299 |
+
# Before/After Examples
|
| 300 |
+
gr.HTML("<h3>π‘ Before & After Examples</h3>")
|
| 301 |
|
| 302 |
examples = gr.Examples(
|
| 303 |
examples=[
|
| 304 |
[
|
| 305 |
+
"Furthermore, this revolutionary smartphone demonstrates exceptional technological capabilities and utilizes advanced processing architecture to ensure optimal performance across all applications. Subsequently, users will experience significant improvements in their daily productivity and entertainment consumption. Moreover, the comprehensive design facilitates seamless integration with existing ecosystems while maintaining superior battery efficiency.",
|
| 306 |
"Natural",
|
| 307 |
+
0.8
|
| 308 |
],
|
| 309 |
[
|
| 310 |
+
"Our comprehensive software solution facilitates unprecedented optimization of business processes and demonstrates significant improvements in operational efficiency. Furthermore, organizations that implement our platform will experience substantial cost reductions while obtaining optimal performance metrics. It is crucial to understand that systematic utilization of our advanced features enables companies to achieve remarkable competitive advantages.",
|
| 311 |
"Conversational",
|
| 312 |
0.8
|
| 313 |
],
|
| 314 |
[
|
| 315 |
+
"This exceptional garment utilizes premium materials and demonstrates sophisticated craftsmanship to ensure optimal comfort and style. Furthermore, the comprehensive design methodology facilitates versatile styling options while maintaining superior quality standards. Subsequently, customers will obtain significant value through enhanced wardrobe functionality.",
|
| 316 |
"Natural",
|
| 317 |
+
0.7
|
| 318 |
],
|
| 319 |
[
|
| 320 |
+
"It is important to note that search engine optimization requires systematic implementation of comprehensive strategies to ensure optimal website visibility. Furthermore, businesses must utilize advanced techniques and demonstrate consistent content creation to obtain significant improvements in their organic rankings. Subsequently, organizations will experience enhanced online presence.",
|
| 321 |
"Conversational",
|
| 322 |
+
0.9
|
| 323 |
]
|
| 324 |
],
|
| 325 |
inputs=[input_text, style_dropdown, intensity_slider],
|
| 326 |
outputs=[output_text, results_display, status_output],
|
| 327 |
+
fn=humanize_text_authentic_hf,
|
| 328 |
cache_examples=False,
|
| 329 |
+
label="π― Click any example to see authentic humanization!"
|
| 330 |
)
|
| 331 |
|
| 332 |
+
# How it works
|
| 333 |
+
gr.HTML("""
|
| 334 |
+
<div class="human-box">
|
| 335 |
+
<h4>π§ How Authentic Humanization Works:</h4>
|
| 336 |
+
<ol>
|
| 337 |
+
<li><strong>Removes Robotic Phrases:</strong> "Furthermore" β "Also", "Subsequently" β "Then"</li>
|
| 338 |
+
<li><strong>Breaks Long Sentences:</strong> Splits complex 30+ word sentences into natural chunks</li>
|
| 339 |
+
<li><strong>Replaces Business Jargon:</strong> "utilize" β "use", "facilitate" β "help"</li>
|
| 340 |
+
<li><strong>Adds Natural Flow:</strong> Uses conversational connectors and human-like transitions</li>
|
| 341 |
+
<li><strong>Includes Contractions:</strong> "do not" β "don't", "it is" β "it's"</li>
|
| 342 |
+
<li><strong>Adds Personality:</strong> Natural variety and authentic human writing patterns</li>
|
| 343 |
+
</ol>
|
| 344 |
+
</div>
|
| 345 |
+
|
| 346 |
+
<div class="human-box">
|
| 347 |
+
<h4>β¨ Style Guide:</h4>
|
| 348 |
+
<ul>
|
| 349 |
+
<li><strong>Natural (0.6-0.8):</strong> Professional but sounds human - perfect for business content</li>
|
| 350 |
+
<li><strong>Conversational (0.7-0.9):</strong> Friendly and engaging - great for marketing and social media</li>
|
| 351 |
+
</ul>
|
| 352 |
+
|
| 353 |
+
<h4>ποΈ Authenticity Levels:</h4>
|
| 354 |
+
<ul>
|
| 355 |
+
<li><strong>0.4-0.6:</strong> Subtle humanization, keeps professional tone</li>
|
| 356 |
+
<li><strong>0.7-0.8:</strong> Balanced approach - natural but not too casual (recommended)</li>
|
| 357 |
+
<li><strong>0.9-1.0:</strong> Maximum humanization - very conversational and authentic</li>
|
| 358 |
+
</ul>
|
| 359 |
+
</div>
|
| 360 |
+
""")
|
| 361 |
+
|
| 362 |
+
# Example transformations
|
| 363 |
+
gr.HTML("""
|
| 364 |
+
<div class="natural-highlight">
|
| 365 |
+
<h3>π Example Transformations</h3>
|
| 366 |
+
|
| 367 |
+
<h4>π€ AI Original:</h4>
|
| 368 |
+
<p><em>"Furthermore, this comprehensive solution demonstrates significant improvements in operational efficiency and utilizes advanced methodologies to ensure optimal performance outcomes."</em></p>
|
| 369 |
+
|
| 370 |
+
<h4>π€ Authentic Human Version:</h4>
|
| 371 |
+
<p><strong>"This complete solution shows major improvements in how efficiently things run. It uses advanced methods to make sure you get the best results."</strong></p>
|
| 372 |
+
|
| 373 |
+
<hr>
|
| 374 |
+
|
| 375 |
+
<h4>π€ AI Original:</h4>
|
| 376 |
+
<p><em>"Subsequently, organizations will experience enhanced productivity while obtaining substantial return on investment through systematic implementation of our proven frameworks."</em></p>
|
| 377 |
+
|
| 378 |
+
<h4>π€ Authentic Human Version:</h4>
|
| 379 |
+
<p><strong>"Then, companies will see better productivity and get great returns on their investment by using our proven systems."</strong></p>
|
| 380 |
+
</div>
|
| 381 |
+
""")
|
| 382 |
+
|
| 383 |
+
# Why it works better
|
| 384 |
gr.HTML("""
|
| 385 |
+
<div class="human-box">
|
| 386 |
+
<h3>π― Why This Works Better Than Other Humanizers</h3>
|
| 387 |
<div style="display: grid; grid-template-columns: 1fr 1fr; gap: 20px;">
|
| 388 |
<div>
|
| 389 |
+
<h4>β Other Tools:</h4>
|
| 390 |
<ul>
|
| 391 |
+
<li>Only replace individual words</li>
|
| 392 |
+
<li>Keep robotic sentence structure</li>
|
| 393 |
+
<li>Still sound formal and AI-like</li>
|
| 394 |
+
<li>Don't understand natural flow</li>
|
| 395 |
</ul>
|
| 396 |
</div>
|
| 397 |
<div>
|
| 398 |
+
<h4>β
This Authentic Humanizer:</h4>
|
| 399 |
<ul>
|
| 400 |
+
<li>Completely restructures sentences</li>
|
| 401 |
+
<li>Removes robotic patterns entirely</li>
|
| 402 |
+
<li>Adds authentic human personality</li>
|
| 403 |
+
<li>Creates natural conversational flow</li>
|
| 404 |
</ul>
|
| 405 |
</div>
|
| 406 |
</div>
|
| 407 |
</div>
|
| 408 |
""")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 409 |
|
| 410 |
# Event handlers
|
| 411 |
humanize_btn.click(
|
| 412 |
+
fn=humanize_text_authentic_hf,
|
| 413 |
inputs=[input_text, style_dropdown, intensity_slider],
|
| 414 |
outputs=[output_text, results_display, status_output]
|
| 415 |
)
|
| 416 |
|
| 417 |
# Launch the interface
|
| 418 |
if __name__ == "__main__":
|
| 419 |
+
print("π Launching Authentic AI Text Humanizer on Hugging Face Spaces...")
|
| 420 |
+
print(f"β¨ Initialization Status: {'β
SUCCESS' if initialization_success else 'β FAILED'}")
|
| 421 |
|
| 422 |
demo.launch(
|
| 423 |
share=False,
|
authentic_humanizer.py
ADDED
|
@@ -0,0 +1,759 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import re
|
| 2 |
+
import random
|
| 3 |
+
import nltk
|
| 4 |
+
import numpy as np
|
| 5 |
+
from typing import List, Dict, Optional
|
| 6 |
+
import time
|
| 7 |
+
from collections import Counter
|
| 8 |
+
import statistics
|
| 9 |
+
|
| 10 |
+
# Robust NLTK data downloader that handles version differences
|
| 11 |
+
def ensure_nltk_data():
|
| 12 |
+
"""Download required NLTK data with fallbacks for different versions"""
|
| 13 |
+
|
| 14 |
+
# Resources to download (try both old and new names)
|
| 15 |
+
resources_to_try = [
|
| 16 |
+
# Punkt tokenizer (try both versions)
|
| 17 |
+
[('punkt', 'tokenizers/punkt'), ('punkt_tab', 'tokenizers/punkt_tab')],
|
| 18 |
+
# Wordnet
|
| 19 |
+
[('wordnet', 'corpora/wordnet')],
|
| 20 |
+
# OMW data
|
| 21 |
+
[('omw-1.4', 'corpora/omw-1.4')]
|
| 22 |
+
]
|
| 23 |
+
|
| 24 |
+
for resource_group in resources_to_try:
|
| 25 |
+
downloaded = False
|
| 26 |
+
for resource_name, resource_path in resource_group:
|
| 27 |
+
try:
|
| 28 |
+
nltk.data.find(resource_path)
|
| 29 |
+
print(f"β
Found {resource_name}")
|
| 30 |
+
downloaded = True
|
| 31 |
+
break
|
| 32 |
+
except LookupError:
|
| 33 |
+
try:
|
| 34 |
+
print(f"π Downloading {resource_name}...")
|
| 35 |
+
nltk.download(resource_name, quiet=True)
|
| 36 |
+
print(f"β
Downloaded {resource_name}")
|
| 37 |
+
downloaded = True
|
| 38 |
+
break
|
| 39 |
+
except Exception as e:
|
| 40 |
+
print(f"β οΈ Failed to download {resource_name}: {e}")
|
| 41 |
+
continue
|
| 42 |
+
|
| 43 |
+
if not downloaded:
|
| 44 |
+
resource_names = [name for name, _ in resource_group]
|
| 45 |
+
print(f"β Could not download any of: {resource_names}")
|
| 46 |
+
|
| 47 |
+
# Alternative function that tries multiple approaches
|
| 48 |
+
def robust_nltk_setup():
|
| 49 |
+
"""More robust NLTK setup with multiple fallback strategies"""
|
| 50 |
+
|
| 51 |
+
print("π§ Setting up NLTK resources...")
|
| 52 |
+
|
| 53 |
+
# Strategy 1: Try standard downloads
|
| 54 |
+
try:
|
| 55 |
+
ensure_nltk_data()
|
| 56 |
+
except Exception as e:
|
| 57 |
+
print(f"β οΈ Standard setup failed: {e}")
|
| 58 |
+
|
| 59 |
+
# Strategy 2: Force download common resources
|
| 60 |
+
common_resources = ['punkt', 'punkt_tab', 'wordnet', 'omw-1.4', 'averaged_perceptron_tagger']
|
| 61 |
+
for resource in common_resources:
|
| 62 |
+
try:
|
| 63 |
+
nltk.download(resource, quiet=True)
|
| 64 |
+
print(f"β
Force downloaded {resource}")
|
| 65 |
+
except Exception as e:
|
| 66 |
+
print(f"β οΈ Could not force download {resource}: {e}")
|
| 67 |
+
|
| 68 |
+
# Strategy 3: Test if tokenization works
|
| 69 |
+
try:
|
| 70 |
+
from nltk.tokenize import sent_tokenize, word_tokenize
|
| 71 |
+
# Test with a simple sentence
|
| 72 |
+
test_sentences = sent_tokenize("This is a test. This is another test.")
|
| 73 |
+
test_words = word_tokenize("This is a test sentence.")
|
| 74 |
+
print(f"β
Tokenization test passed: {len(test_sentences)} sentences, {len(test_words)} words")
|
| 75 |
+
return True
|
| 76 |
+
except Exception as e:
|
| 77 |
+
print(f"β Tokenization test failed: {e}")
|
| 78 |
+
return False
|
| 79 |
+
|
| 80 |
+
# Run the robust setup
|
| 81 |
+
print("π Loading Authentic AI Text Humanizer...")
|
| 82 |
+
setup_success = robust_nltk_setup()
|
| 83 |
+
|
| 84 |
+
# Try importing NLTK functions with fallbacks
|
| 85 |
+
try:
|
| 86 |
+
from nltk.tokenize import sent_tokenize, word_tokenize
|
| 87 |
+
from nltk.corpus import wordnet
|
| 88 |
+
print("β
NLTK imports successful")
|
| 89 |
+
NLTK_AVAILABLE = True
|
| 90 |
+
except ImportError as e:
|
| 91 |
+
print(f"β NLTK imports failed: {e}")
|
| 92 |
+
print("π Trying alternative tokenization methods...")
|
| 93 |
+
NLTK_AVAILABLE = False
|
| 94 |
+
|
| 95 |
+
# Fallback tokenization functions
|
| 96 |
+
def sent_tokenize(text):
|
| 97 |
+
"""Fallback sentence tokenizer"""
|
| 98 |
+
import re
|
| 99 |
+
# Simple sentence splitting on periods, exclamation marks, question marks
|
| 100 |
+
sentences = re.split(r'[.!?]+', text)
|
| 101 |
+
return [s.strip() for s in sentences if s.strip()]
|
| 102 |
+
|
| 103 |
+
def word_tokenize(text):
|
| 104 |
+
"""Fallback word tokenizer"""
|
| 105 |
+
import re
|
| 106 |
+
# Simple word splitting on whitespace and punctuation
|
| 107 |
+
words = re.findall(r'\b\w+\b|[^\w\s]', text)
|
| 108 |
+
return words
|
| 109 |
+
|
| 110 |
+
# Mock wordnet for fallback
|
| 111 |
+
class MockWordNet:
|
| 112 |
+
def synsets(self, word):
|
| 113 |
+
return []
|
| 114 |
+
|
| 115 |
+
wordnet = MockWordNet()
|
| 116 |
+
|
| 117 |
+
# Advanced imports with fallbacks
|
| 118 |
+
def safe_import_with_fallback(module_name, component=None):
|
| 119 |
+
"""Safe import with fallback handling"""
|
| 120 |
+
try:
|
| 121 |
+
if component:
|
| 122 |
+
module = __import__(module_name, fromlist=[component])
|
| 123 |
+
return getattr(module, component), True
|
| 124 |
+
else:
|
| 125 |
+
return __import__(module_name), True
|
| 126 |
+
except ImportError:
|
| 127 |
+
return None, False
|
| 128 |
+
except Exception:
|
| 129 |
+
return None, False
|
| 130 |
+
|
| 131 |
+
# Load advanced models
|
| 132 |
+
SentenceTransformer, SENTENCE_TRANSFORMERS_AVAILABLE = safe_import_with_fallback('sentence_transformers', 'SentenceTransformer')
|
| 133 |
+
pipeline, TRANSFORMERS_AVAILABLE = safe_import_with_fallback('transformers', 'pipeline')
|
| 134 |
+
|
| 135 |
+
try:
|
| 136 |
+
from sklearn.feature_extraction.text import TfidfVectorizer
|
| 137 |
+
from sklearn.metrics.pairwise import cosine_similarity as sklearn_cosine_similarity
|
| 138 |
+
SKLEARN_AVAILABLE = True
|
| 139 |
+
except ImportError:
|
| 140 |
+
SKLEARN_AVAILABLE = False
|
| 141 |
+
|
| 142 |
+
try:
|
| 143 |
+
import torch
|
| 144 |
+
TORCH_AVAILABLE = True
|
| 145 |
+
except ImportError:
|
| 146 |
+
TORCH_AVAILABLE = False
|
| 147 |
+
|
| 148 |
+
class AuthenticAITextHumanizer:
|
| 149 |
+
"""
|
| 150 |
+
Authentic AI Text Humanizer - Makes text truly sound human and natural
|
| 151 |
+
Based on analysis of authentic human writing patterns
|
| 152 |
+
"""
|
| 153 |
+
|
| 154 |
+
def __init__(self, enable_gpu=True):
|
| 155 |
+
print("π― Initializing Authentic AI Text Humanizer...")
|
| 156 |
+
print("β¨ Designed to write like a real human - authentic & natural")
|
| 157 |
+
|
| 158 |
+
self.enable_gpu = enable_gpu and TORCH_AVAILABLE
|
| 159 |
+
self.nltk_available = NLTK_AVAILABLE
|
| 160 |
+
|
| 161 |
+
# Initialize models and authentic patterns
|
| 162 |
+
self._load_models()
|
| 163 |
+
self._initialize_authentic_patterns()
|
| 164 |
+
|
| 165 |
+
print("β
Authentic AI Text Humanizer ready!")
|
| 166 |
+
self._print_status()
|
| 167 |
+
|
| 168 |
+
def _load_models(self):
|
| 169 |
+
"""Load AI models with graceful fallbacks"""
|
| 170 |
+
self.similarity_model = None
|
| 171 |
+
self.paraphraser = None
|
| 172 |
+
|
| 173 |
+
# Load sentence transformer for quality control
|
| 174 |
+
if SENTENCE_TRANSFORMERS_AVAILABLE:
|
| 175 |
+
try:
|
| 176 |
+
device = 'cuda' if self.enable_gpu and TORCH_AVAILABLE and torch.cuda.is_available() else 'cpu'
|
| 177 |
+
self.similarity_model = SentenceTransformer('all-MiniLM-L6-v2', device=device)
|
| 178 |
+
print("β
Advanced similarity model loaded")
|
| 179 |
+
except Exception as e:
|
| 180 |
+
print(f"β οΈ Similarity model unavailable: {e}")
|
| 181 |
+
|
| 182 |
+
# Load paraphrasing model
|
| 183 |
+
if TRANSFORMERS_AVAILABLE:
|
| 184 |
+
try:
|
| 185 |
+
device = 0 if self.enable_gpu and TORCH_AVAILABLE and torch.cuda.is_available() else -1
|
| 186 |
+
self.paraphraser = pipeline(
|
| 187 |
+
"text2text-generation",
|
| 188 |
+
model="google/flan-t5-small",
|
| 189 |
+
device=device,
|
| 190 |
+
max_length=256
|
| 191 |
+
)
|
| 192 |
+
print("β
AI paraphrasing model loaded")
|
| 193 |
+
except Exception as e:
|
| 194 |
+
print(f"β οΈ Paraphrasing model unavailable: {e}")
|
| 195 |
+
|
| 196 |
+
# Fallback similarity using TF-IDF
|
| 197 |
+
if SKLEARN_AVAILABLE:
|
| 198 |
+
self.tfidf_vectorizer = TfidfVectorizer(stop_words='english', ngram_range=(1, 2), max_features=5000)
|
| 199 |
+
else:
|
| 200 |
+
self.tfidf_vectorizer = None
|
| 201 |
+
|
| 202 |
+
def _initialize_authentic_patterns(self):
|
| 203 |
+
"""Initialize authentic human writing patterns"""
|
| 204 |
+
|
| 205 |
+
# Authentic word replacements - how humans actually write
|
| 206 |
+
self.authentic_replacements = {
|
| 207 |
+
# Business jargon -> Natural language
|
| 208 |
+
"utilize": ["use", "work with", "employ"],
|
| 209 |
+
"facilitate": ["help", "make it easier to", "enable", "allow"],
|
| 210 |
+
"demonstrate": ["show", "prove", "reveal", "display"],
|
| 211 |
+
"implement": ["put in place", "start using", "set up", "roll out"],
|
| 212 |
+
"optimize": ["improve", "make better", "enhance"],
|
| 213 |
+
"leverage": ["use", "take advantage of", "make use of"],
|
| 214 |
+
"comprehensive": ["complete", "thorough", "full", "extensive"],
|
| 215 |
+
"substantial": ["significant", "major", "big", "considerable"],
|
| 216 |
+
"exceptional": ["outstanding", "remarkable", "impressive", "excellent"],
|
| 217 |
+
"systematic": ["structured", "organized", "methodical"],
|
| 218 |
+
"revolutionary": ["groundbreaking", "innovative", "cutting-edge", "game-changing"],
|
| 219 |
+
"unprecedented": ["never-before-seen", "unique", "extraordinary", "first-of-its-kind"],
|
| 220 |
+
"methodology": ["approach", "method", "way", "strategy"],
|
| 221 |
+
"enhancement": ["improvement", "upgrade", "boost"],
|
| 222 |
+
"acquisition": ["purchase", "buying", "getting"],
|
| 223 |
+
"transformation": ["change", "shift", "evolution"],
|
| 224 |
+
"optimization": ["improvement", "fine-tuning", "enhancement"],
|
| 225 |
+
"establishment": ["creation", "setup", "building"],
|
| 226 |
+
"implementation": ["rollout", "launch", "deployment"],
|
| 227 |
+
"operational": ["day-to-day", "working", "running"],
|
| 228 |
+
"capabilities": ["abilities", "features", "what it can do"],
|
| 229 |
+
"specifications": ["specs", "details", "features"],
|
| 230 |
+
"functionality": ["features", "what it does", "capabilities"],
|
| 231 |
+
"performance": ["how well it works", "results", "output"],
|
| 232 |
+
"architecture": ["design", "structure", "framework"],
|
| 233 |
+
"integration": ["bringing together", "combining", "merging"],
|
| 234 |
+
"sustainability": ["long-term viability", "lasting success"],
|
| 235 |
+
"competitive advantages": ["edge over competitors", "what sets us apart"]
|
| 236 |
+
}
|
| 237 |
+
|
| 238 |
+
# Remove robotic AI phrases completely
|
| 239 |
+
self.ai_phrase_removals = {
|
| 240 |
+
"furthermore,": ["Also,", "Plus,", "What's more,", "On top of that,", "Additionally,"],
|
| 241 |
+
"moreover,": ["Also,", "Plus,", "What's more,", "Besides,"],
|
| 242 |
+
"subsequently,": ["Then,", "Next,", "After that,", "Later,"],
|
| 243 |
+
"consequently,": ["So,", "As a result,", "Therefore,", "This means"],
|
| 244 |
+
"accordingly,": ["So,", "Therefore,", "As a result,"],
|
| 245 |
+
"nevertheless,": ["However,", "But,", "Still,", "Even so,"],
|
| 246 |
+
"nonetheless,": ["However,", "But,", "Still,", "Even so,"],
|
| 247 |
+
"it is important to note that": ["Worth noting:", "Importantly,", "Keep in mind that", "Remember that"],
|
| 248 |
+
"it is crucial to understand that": ["Here's what's important:", "You should know that", "The key thing is"],
|
| 249 |
+
"it should be emphasized that": ["Importantly,", "Key point:", "Worth highlighting:"],
|
| 250 |
+
"it is worth mentioning that": ["Also worth noting:", "By the way,", "Interestingly,"],
|
| 251 |
+
"from a practical standpoint": ["In practice,", "Realistically,", "In real terms"],
|
| 252 |
+
"in terms of implementation": ["When putting this into practice,", "For implementation,", "To make this work"],
|
| 253 |
+
"with respect to the aforementioned": ["Regarding what I mentioned,", "About that,", "On this point"],
|
| 254 |
+
"as previously mentioned": ["As I said earlier,", "Like I mentioned,", "As noted before"],
|
| 255 |
+
"in light of this": ["Because of this,", "Given this,", "With this in mind"],
|
| 256 |
+
"upon careful consideration": ["After thinking about it,", "Looking at this closely,", "When you consider"],
|
| 257 |
+
"in the final analysis": ["Ultimately,", "When it comes down to it,", "In the end"],
|
| 258 |
+
"one must consider": ["You should think about", "Consider", "Keep in mind"],
|
| 259 |
+
"it is evident that": ["Clearly,", "Obviously,", "You can see that"],
|
| 260 |
+
"it can be observed that": ["You can see", "It's clear that", "Obviously"]
|
| 261 |
+
}
|
| 262 |
+
|
| 263 |
+
# Natural sentence starters for conversational flow
|
| 264 |
+
self.natural_starters = [
|
| 265 |
+
"Here's the thing:", "Look,", "The reality is", "What's interesting is", "The truth is",
|
| 266 |
+
"Think about it:", "Consider this:", "Here's what happens:", "What this means is",
|
| 267 |
+
"The bottom line is", "Simply put,", "In other words,", "To put it another way,",
|
| 268 |
+
"What you'll find is", "The key insight is", "What stands out is"
|
| 269 |
+
]
|
| 270 |
+
|
| 271 |
+
# Conversational connectors
|
| 272 |
+
self.conversational_connectors = [
|
| 273 |
+
"And here's why:", "Plus,", "On top of that,", "What's more,", "Beyond that,",
|
| 274 |
+
"Here's another thing:", "But wait, there's more:", "And that's not all:",
|
| 275 |
+
"Speaking of which,", "Along those lines,", "In the same vein,"
|
| 276 |
+
]
|
| 277 |
+
|
| 278 |
+
# Sentence ending variations
|
| 279 |
+
self.authentic_endings = [
|
| 280 |
+
"which is pretty impressive", "and that's significant", "which makes sense",
|
| 281 |
+
"and that matters", "which is key", "and this is important"
|
| 282 |
+
]
|
| 283 |
+
|
| 284 |
+
# Professional contractions
|
| 285 |
+
self.contractions = {
|
| 286 |
+
"do not": "don't", "does not": "doesn't", "did not": "didn't", "will not": "won't",
|
| 287 |
+
"would not": "wouldn't", "should not": "shouldn't", "could not": "couldn't",
|
| 288 |
+
"cannot": "can't", "is not": "isn't", "are not": "aren't", "was not": "wasn't",
|
| 289 |
+
"were not": "weren't", "have not": "haven't", "has not": "hasn't", "had not": "hadn't",
|
| 290 |
+
"I am": "I'm", "you are": "you're", "he is": "he's", "she is": "she's", "it is": "it's",
|
| 291 |
+
"we are": "we're", "they are": "they're", "I have": "I've", "you have": "you've",
|
| 292 |
+
"we have": "we've", "they have": "they've", "I will": "I'll", "you will": "you'll",
|
| 293 |
+
"we will": "we'll", "they will": "they'll", "that is": "that's", "there is": "there's",
|
| 294 |
+
"here is": "here's", "what is": "what's", "where is": "where's", "who is": "who's"
|
| 295 |
+
}
|
| 296 |
+
|
| 297 |
+
def preserve_structure(self, original: str, processed: str) -> str:
|
| 298 |
+
"""Preserve original text structure (paragraphs, formatting)"""
|
| 299 |
+
# Split by double newlines (paragraphs)
|
| 300 |
+
original_paragraphs = re.split(r'\n\s*\n', original)
|
| 301 |
+
if len(original_paragraphs) <= 1:
|
| 302 |
+
return processed
|
| 303 |
+
|
| 304 |
+
# Split processed text into sentences
|
| 305 |
+
try:
|
| 306 |
+
processed_sentences = sent_tokenize(processed)
|
| 307 |
+
except Exception as e:
|
| 308 |
+
print(f"β οΈ Sentence tokenization failed, using fallback: {e}")
|
| 309 |
+
processed_sentences = re.split(r'[.!?]+', processed)
|
| 310 |
+
processed_sentences = [s.strip() for s in processed_sentences if s.strip()]
|
| 311 |
+
|
| 312 |
+
# Try to maintain paragraph structure
|
| 313 |
+
result_paragraphs = []
|
| 314 |
+
sentence_idx = 0
|
| 315 |
+
|
| 316 |
+
for para in original_paragraphs:
|
| 317 |
+
try:
|
| 318 |
+
para_sentences = sent_tokenize(para)
|
| 319 |
+
except Exception:
|
| 320 |
+
para_sentences = re.split(r'[.!?]+', para)
|
| 321 |
+
para_sentences = [s.strip() for s in para_sentences if s.strip()]
|
| 322 |
+
|
| 323 |
+
para_sentence_count = len(para_sentences)
|
| 324 |
+
|
| 325 |
+
if sentence_idx + para_sentence_count <= len(processed_sentences):
|
| 326 |
+
para_processed = ' '.join(processed_sentences[sentence_idx:sentence_idx + para_sentence_count])
|
| 327 |
+
result_paragraphs.append(para_processed)
|
| 328 |
+
sentence_idx += para_sentence_count
|
| 329 |
+
else:
|
| 330 |
+
# Add remaining sentences to this paragraph
|
| 331 |
+
remaining = ' '.join(processed_sentences[sentence_idx:])
|
| 332 |
+
if remaining:
|
| 333 |
+
result_paragraphs.append(remaining)
|
| 334 |
+
break
|
| 335 |
+
|
| 336 |
+
return '\n\n'.join(result_paragraphs)
|
| 337 |
+
|
| 338 |
+
def break_long_sentences(self, text: str) -> str:
|
| 339 |
+
"""Break overly long sentences into natural, shorter ones"""
|
| 340 |
+
try:
|
| 341 |
+
sentences = sent_tokenize(text)
|
| 342 |
+
except Exception:
|
| 343 |
+
sentences = re.split(r'[.!?]+', text)
|
| 344 |
+
sentences = [s.strip() for s in sentences if s.strip()]
|
| 345 |
+
|
| 346 |
+
processed_sentences = []
|
| 347 |
+
|
| 348 |
+
for sentence in sentences:
|
| 349 |
+
words = sentence.split()
|
| 350 |
+
|
| 351 |
+
# Break sentences longer than 20 words
|
| 352 |
+
if len(words) > 20:
|
| 353 |
+
# Find natural break points
|
| 354 |
+
break_words = ['and', 'but', 'while', 'because', 'since', 'when', 'where', 'which', 'that', 'as']
|
| 355 |
+
|
| 356 |
+
for break_word in break_words:
|
| 357 |
+
break_positions = [i for i, word in enumerate(words) if word.lower() == break_word]
|
| 358 |
+
|
| 359 |
+
for pos in break_positions:
|
| 360 |
+
# Only break if it creates reasonable sentence lengths
|
| 361 |
+
if 8 <= pos <= len(words) - 8:
|
| 362 |
+
first_part = ' '.join(words[:pos]).strip()
|
| 363 |
+
second_part = ' '.join(words[pos:]).strip()
|
| 364 |
+
|
| 365 |
+
if first_part and second_part:
|
| 366 |
+
# Ensure proper capitalization
|
| 367 |
+
if not first_part.endswith('.'):
|
| 368 |
+
first_part += '.'
|
| 369 |
+
second_part = second_part[0].upper() + second_part[1:] if len(second_part) > 1 else second_part.upper()
|
| 370 |
+
|
| 371 |
+
processed_sentences.extend([first_part, second_part])
|
| 372 |
+
break
|
| 373 |
+
else:
|
| 374 |
+
continue
|
| 375 |
+
break
|
| 376 |
+
else:
|
| 377 |
+
# No good break point found, keep original
|
| 378 |
+
processed_sentences.append(sentence)
|
| 379 |
+
else:
|
| 380 |
+
processed_sentences.append(sentence)
|
| 381 |
+
|
| 382 |
+
return ' '.join(processed_sentences)
|
| 383 |
+
|
| 384 |
+
def apply_authentic_word_replacements(self, text: str, intensity: float = 0.8) -> str:
|
| 385 |
+
"""Replace business jargon with authentic, natural language"""
|
| 386 |
+
try:
|
| 387 |
+
words = word_tokenize(text)
|
| 388 |
+
except Exception:
|
| 389 |
+
words = re.findall(r'\b\w+\b|[^\w\s]', text)
|
| 390 |
+
|
| 391 |
+
modified_words = []
|
| 392 |
+
|
| 393 |
+
for word in words:
|
| 394 |
+
word_clean = word.lower().strip('.,!?;:"')
|
| 395 |
+
|
| 396 |
+
if word_clean in self.authentic_replacements and random.random() < intensity:
|
| 397 |
+
replacements = self.authentic_replacements[word_clean]
|
| 398 |
+
replacement = random.choice(replacements)
|
| 399 |
+
|
| 400 |
+
# Preserve case
|
| 401 |
+
if word.isupper():
|
| 402 |
+
replacement = replacement.upper()
|
| 403 |
+
elif word.istitle():
|
| 404 |
+
replacement = replacement.title()
|
| 405 |
+
|
| 406 |
+
modified_words.append(replacement)
|
| 407 |
+
else:
|
| 408 |
+
modified_words.append(word)
|
| 409 |
+
|
| 410 |
+
# Reconstruct with proper spacing
|
| 411 |
+
result = ""
|
| 412 |
+
for i, word in enumerate(modified_words):
|
| 413 |
+
if i > 0 and word not in ".,!?;:\"')":
|
| 414 |
+
result += " "
|
| 415 |
+
result += word
|
| 416 |
+
|
| 417 |
+
return result
|
| 418 |
+
|
| 419 |
+
def remove_ai_phrases(self, text: str, intensity: float = 0.9) -> str:
|
| 420 |
+
"""Remove robotic AI phrases and replace with natural alternatives"""
|
| 421 |
+
|
| 422 |
+
# Sort by length (longest first) to avoid partial replacements
|
| 423 |
+
sorted_phrases = sorted(self.ai_phrase_removals.items(), key=lambda x: len(x[0]), reverse=True)
|
| 424 |
+
|
| 425 |
+
for ai_phrase, natural_alternatives in sorted_phrases:
|
| 426 |
+
# Case-insensitive search
|
| 427 |
+
pattern = re.compile(re.escape(ai_phrase), re.IGNORECASE)
|
| 428 |
+
|
| 429 |
+
if pattern.search(text) and random.random() < intensity:
|
| 430 |
+
replacement = random.choice(natural_alternatives)
|
| 431 |
+
|
| 432 |
+
# Preserve original case style
|
| 433 |
+
if ai_phrase[0].isupper():
|
| 434 |
+
replacement = replacement.capitalize()
|
| 435 |
+
|
| 436 |
+
text = pattern.sub(replacement, text)
|
| 437 |
+
|
| 438 |
+
return text
|
| 439 |
+
|
| 440 |
+
def add_conversational_flow(self, text: str, style: str, intensity: float = 0.6) -> str:
|
| 441 |
+
"""Add natural, conversational flow to the text"""
|
| 442 |
+
try:
|
| 443 |
+
sentences = sent_tokenize(text)
|
| 444 |
+
except Exception:
|
| 445 |
+
sentences = re.split(r'[.!?]+', text)
|
| 446 |
+
sentences = [s.strip() for s in sentences if s.strip()]
|
| 447 |
+
|
| 448 |
+
if len(sentences) < 2:
|
| 449 |
+
return text
|
| 450 |
+
|
| 451 |
+
enhanced_sentences = []
|
| 452 |
+
|
| 453 |
+
for i, sentence in enumerate(sentences):
|
| 454 |
+
# Add conversational starters occasionally
|
| 455 |
+
if (i == 0 or (i > 0 and random.random() < intensity * 0.3)) and style == "conversational":
|
| 456 |
+
if random.random() < 0.4:
|
| 457 |
+
starter = random.choice(self.natural_starters)
|
| 458 |
+
sentence = starter + " " + sentence.lower()
|
| 459 |
+
|
| 460 |
+
# Add conversational connectors between sentences
|
| 461 |
+
elif i > 0 and random.random() < intensity * 0.2 and style == "conversational":
|
| 462 |
+
connector = random.choice(self.conversational_connectors)
|
| 463 |
+
sentence = connector + " " + sentence.lower()
|
| 464 |
+
|
| 465 |
+
# Occasionally add authentic endings to sentences
|
| 466 |
+
if random.random() < intensity * 0.1 and len(sentence.split()) > 8:
|
| 467 |
+
if not sentence.endswith(('.', '!', '?')):
|
| 468 |
+
sentence += '.'
|
| 469 |
+
ending = random.choice(self.authentic_endings)
|
| 470 |
+
sentence = sentence[:-1] + ", " + ending + "."
|
| 471 |
+
|
| 472 |
+
enhanced_sentences.append(sentence)
|
| 473 |
+
|
| 474 |
+
return ' '.join(enhanced_sentences)
|
| 475 |
+
|
| 476 |
+
def apply_natural_contractions(self, text: str, intensity: float = 0.7) -> str:
|
| 477 |
+
"""Apply contractions for natural flow"""
|
| 478 |
+
|
| 479 |
+
# Sort by length (longest first) to avoid partial replacements
|
| 480 |
+
sorted_contractions = sorted(self.contractions.items(), key=lambda x: len(x[0]), reverse=True)
|
| 481 |
+
|
| 482 |
+
for formal, contracted in sorted_contractions:
|
| 483 |
+
if random.random() < intensity:
|
| 484 |
+
pattern = r'\b' + re.escape(formal) + r'\b'
|
| 485 |
+
text = re.sub(pattern, contracted, text, flags=re.IGNORECASE)
|
| 486 |
+
|
| 487 |
+
return text
|
| 488 |
+
|
| 489 |
+
def add_human_variety(self, text: str, intensity: float = 0.4) -> str:
|
| 490 |
+
"""Add natural human writing variety and personality"""
|
| 491 |
+
try:
|
| 492 |
+
sentences = sent_tokenize(text)
|
| 493 |
+
except Exception:
|
| 494 |
+
sentences = re.split(r'[.!?]+', text)
|
| 495 |
+
sentences = [s.strip() for s in sentences if s.strip()]
|
| 496 |
+
|
| 497 |
+
varied_sentences = []
|
| 498 |
+
|
| 499 |
+
for sentence in sentences:
|
| 500 |
+
# Vary sentence structure
|
| 501 |
+
if len(sentence.split()) > 12 and random.random() < intensity:
|
| 502 |
+
# Sometimes start with a dependent clause
|
| 503 |
+
if random.random() < 0.3:
|
| 504 |
+
# Move a prepositional phrase to the beginning
|
| 505 |
+
words = sentence.split()
|
| 506 |
+
prep_words = ['with', 'through', 'by', 'using', 'for', 'in', 'on', 'at']
|
| 507 |
+
|
| 508 |
+
for j, word in enumerate(words):
|
| 509 |
+
if word.lower() in prep_words and j > 3:
|
| 510 |
+
# Find the end of the prepositional phrase
|
| 511 |
+
end_j = min(j + 4, len(words))
|
| 512 |
+
prep_phrase = ' '.join(words[j:end_j])
|
| 513 |
+
remaining = ' '.join(words[:j] + words[end_j:])
|
| 514 |
+
|
| 515 |
+
if remaining:
|
| 516 |
+
sentence = prep_phrase.capitalize() + ', ' + remaining.lower()
|
| 517 |
+
break
|
| 518 |
+
|
| 519 |
+
# Sometimes add emphasis with "really", "actually", "definitely"
|
| 520 |
+
elif random.random() < 0.2:
|
| 521 |
+
emphasis_words = ['really', 'actually', 'definitely', 'truly', 'genuinely']
|
| 522 |
+
emphasis = random.choice(emphasis_words)
|
| 523 |
+
words = sentence.split()
|
| 524 |
+
|
| 525 |
+
# Insert emphasis word after first few words
|
| 526 |
+
insert_pos = random.randint(2, min(5, len(words)-1))
|
| 527 |
+
words.insert(insert_pos, emphasis)
|
| 528 |
+
sentence = ' '.join(words)
|
| 529 |
+
|
| 530 |
+
varied_sentences.append(sentence)
|
| 531 |
+
|
| 532 |
+
return ' '.join(varied_sentences)
|
| 533 |
+
|
| 534 |
+
def calculate_similarity(self, text1: str, text2: str) -> float:
|
| 535 |
+
"""Calculate semantic similarity"""
|
| 536 |
+
if self.similarity_model:
|
| 537 |
+
try:
|
| 538 |
+
embeddings1 = self.similarity_model.encode([text1])
|
| 539 |
+
embeddings2 = self.similarity_model.encode([text2])
|
| 540 |
+
similarity = np.dot(embeddings1[0], embeddings2[0]) / (
|
| 541 |
+
np.linalg.norm(embeddings1[0]) * np.linalg.norm(embeddings2[0])
|
| 542 |
+
)
|
| 543 |
+
return float(similarity)
|
| 544 |
+
except Exception:
|
| 545 |
+
pass
|
| 546 |
+
|
| 547 |
+
# Fallback to TF-IDF
|
| 548 |
+
if self.tfidf_vectorizer and SKLEARN_AVAILABLE:
|
| 549 |
+
try:
|
| 550 |
+
tfidf_matrix = self.tfidf_vectorizer.fit_transform([text1, text2])
|
| 551 |
+
similarity = sklearn_cosine_similarity(tfidf_matrix[0:1], tfidf_matrix[1:2])[0][0]
|
| 552 |
+
return float(similarity)
|
| 553 |
+
except Exception:
|
| 554 |
+
pass
|
| 555 |
+
|
| 556 |
+
# Basic word overlap fallback
|
| 557 |
+
try:
|
| 558 |
+
words1 = set(word_tokenize(text1.lower()))
|
| 559 |
+
words2 = set(word_tokenize(text2.lower()))
|
| 560 |
+
except Exception:
|
| 561 |
+
words1 = set(re.findall(r'\b\w+\b', text1.lower()))
|
| 562 |
+
words2 = set(re.findall(r'\b\w+\b', text2.lower()))
|
| 563 |
+
|
| 564 |
+
if not words1 or not words2:
|
| 565 |
+
return 1.0 if text1 == text2 else 0.0
|
| 566 |
+
|
| 567 |
+
intersection = words1.intersection(words2)
|
| 568 |
+
union = words1.union(words2)
|
| 569 |
+
return len(intersection) / len(union) if union else 1.0
|
| 570 |
+
|
| 571 |
+
def humanize_text_authentic(self,
|
| 572 |
+
text: str,
|
| 573 |
+
style: str = "natural",
|
| 574 |
+
intensity: float = 0.7) -> Dict:
|
| 575 |
+
"""
|
| 576 |
+
Authentic text humanization that makes text truly sound human
|
| 577 |
+
|
| 578 |
+
Args:
|
| 579 |
+
text: Input text to humanize
|
| 580 |
+
style: 'natural' or 'conversational'
|
| 581 |
+
intensity: Transformation intensity (0.0 to 1.0)
|
| 582 |
+
|
| 583 |
+
Returns:
|
| 584 |
+
Dictionary with results and metrics
|
| 585 |
+
"""
|
| 586 |
+
if not text.strip():
|
| 587 |
+
return {
|
| 588 |
+
"original_text": text,
|
| 589 |
+
"humanized_text": text,
|
| 590 |
+
"similarity_score": 1.0,
|
| 591 |
+
"changes_made": [],
|
| 592 |
+
"processing_time_ms": 0.0,
|
| 593 |
+
"style": style,
|
| 594 |
+
"intensity": intensity,
|
| 595 |
+
"structure_preserved": True
|
| 596 |
+
}
|
| 597 |
+
|
| 598 |
+
start_time = time.time()
|
| 599 |
+
original_text = text
|
| 600 |
+
humanized_text = text
|
| 601 |
+
changes_made = []
|
| 602 |
+
|
| 603 |
+
try:
|
| 604 |
+
# Phase 1: Remove AI phrases and replace with natural alternatives
|
| 605 |
+
if intensity > 0.2:
|
| 606 |
+
before = humanized_text
|
| 607 |
+
humanized_text = self.remove_ai_phrases(humanized_text, intensity * 0.95)
|
| 608 |
+
if humanized_text != before:
|
| 609 |
+
changes_made.append("Replaced robotic phrases with natural language")
|
| 610 |
+
|
| 611 |
+
# Phase 2: Break up long, complex sentences
|
| 612 |
+
if intensity > 0.3:
|
| 613 |
+
before = humanized_text
|
| 614 |
+
humanized_text = self.break_long_sentences(humanized_text)
|
| 615 |
+
if humanized_text != before:
|
| 616 |
+
changes_made.append("Broke up complex sentences for better flow")
|
| 617 |
+
|
| 618 |
+
# Phase 3: Replace business jargon with authentic language
|
| 619 |
+
if intensity > 0.4:
|
| 620 |
+
before = humanized_text
|
| 621 |
+
humanized_text = self.apply_authentic_word_replacements(humanized_text, intensity * 0.8)
|
| 622 |
+
if humanized_text != before:
|
| 623 |
+
changes_made.append("Replaced jargon with natural, everyday language")
|
| 624 |
+
|
| 625 |
+
# Phase 4: Add conversational flow and personality
|
| 626 |
+
if intensity > 0.5:
|
| 627 |
+
before = humanized_text
|
| 628 |
+
humanized_text = self.add_conversational_flow(humanized_text, style, intensity * 0.6)
|
| 629 |
+
if humanized_text != before:
|
| 630 |
+
changes_made.append("Added conversational flow and personality")
|
| 631 |
+
|
| 632 |
+
# Phase 5: Apply natural contractions
|
| 633 |
+
if intensity > 0.6:
|
| 634 |
+
before = humanized_text
|
| 635 |
+
humanized_text = self.apply_natural_contractions(humanized_text, intensity * 0.7)
|
| 636 |
+
if humanized_text != before:
|
| 637 |
+
changes_made.append("Added natural contractions")
|
| 638 |
+
|
| 639 |
+
# Phase 6: Add human variety and natural patterns
|
| 640 |
+
if intensity > 0.7:
|
| 641 |
+
before = humanized_text
|
| 642 |
+
humanized_text = self.add_human_variety(humanized_text, intensity * 0.4)
|
| 643 |
+
if humanized_text != before:
|
| 644 |
+
changes_made.append("Added natural human writing variety")
|
| 645 |
+
|
| 646 |
+
# Phase 7: Preserve original structure
|
| 647 |
+
humanized_text = self.preserve_structure(original_text, humanized_text)
|
| 648 |
+
|
| 649 |
+
# Calculate quality metrics
|
| 650 |
+
similarity_score = self.calculate_similarity(original_text, humanized_text)
|
| 651 |
+
processing_time = (time.time() - start_time) * 1000
|
| 652 |
+
|
| 653 |
+
# Quality control - revert if too different
|
| 654 |
+
if similarity_score < 0.65:
|
| 655 |
+
print(f"β οΈ Similarity too low ({similarity_score:.3f}), reverting changes")
|
| 656 |
+
humanized_text = original_text
|
| 657 |
+
similarity_score = 1.0
|
| 658 |
+
changes_made = ["Reverted - maintained original meaning"]
|
| 659 |
+
|
| 660 |
+
except Exception as e:
|
| 661 |
+
print(f"β Error during authentic humanization: {e}")
|
| 662 |
+
humanized_text = original_text
|
| 663 |
+
similarity_score = 1.0
|
| 664 |
+
changes_made = [f"Processing error - returned original: {str(e)[:100]}"]
|
| 665 |
+
|
| 666 |
+
return {
|
| 667 |
+
"original_text": original_text,
|
| 668 |
+
"humanized_text": humanized_text,
|
| 669 |
+
"similarity_score": similarity_score,
|
| 670 |
+
"changes_made": changes_made,
|
| 671 |
+
"processing_time_ms": (time.time() - start_time) * 1000,
|
| 672 |
+
"style": style,
|
| 673 |
+
"intensity": intensity,
|
| 674 |
+
"structure_preserved": True,
|
| 675 |
+
"word_count_original": len(original_text.split()),
|
| 676 |
+
"word_count_humanized": len(humanized_text.split()),
|
| 677 |
+
"character_count_original": len(original_text),
|
| 678 |
+
"character_count_humanized": len(humanized_text)
|
| 679 |
+
}
|
| 680 |
+
|
| 681 |
+
def _print_status(self):
|
| 682 |
+
"""Print current status"""
|
| 683 |
+
print("\nπ AUTHENTIC AI TEXT HUMANIZER STATUS:")
|
| 684 |
+
print("-" * 50)
|
| 685 |
+
print(f"π§ Advanced Similarity: {'β
' if self.similarity_model else 'β'}")
|
| 686 |
+
print(f"π€ AI Paraphrasing: {'β
' if self.paraphraser else 'β'}")
|
| 687 |
+
print(f"π TF-IDF Fallback: {'β
' if self.tfidf_vectorizer else 'β'}")
|
| 688 |
+
print(f"π GPU Acceleration: {'β
' if self.enable_gpu else 'β'}")
|
| 689 |
+
print(f"π NLTK Available: {'β
' if self.nltk_available else 'β (using fallbacks)'}")
|
| 690 |
+
print(f"β¨ Authentic Patterns: β
LOADED")
|
| 691 |
+
print(f"π Authentic Replacements: β
{len(self.authentic_replacements)} mappings")
|
| 692 |
+
print(f"π« AI Phrase Removals: β
{len(self.ai_phrase_removals)} patterns")
|
| 693 |
+
print(f"π¬ Natural Contractions: β
{len(self.contractions)} patterns")
|
| 694 |
+
print(f"π£οΈ Conversational Elements: β
{len(self.natural_starters)} starters")
|
| 695 |
+
print(f"ποΈ Structure Preservation: β
ENABLED")
|
| 696 |
+
|
| 697 |
+
# Calculate feature completeness
|
| 698 |
+
features = [
|
| 699 |
+
bool(self.similarity_model),
|
| 700 |
+
bool(self.paraphraser),
|
| 701 |
+
bool(self.tfidf_vectorizer),
|
| 702 |
+
True, # Authentic patterns
|
| 703 |
+
True, # Sentence breaking
|
| 704 |
+
True, # Conversational flow
|
| 705 |
+
True, # Structure preservation
|
| 706 |
+
True # Quality control
|
| 707 |
+
]
|
| 708 |
+
completeness = (sum(features) / len(features)) * 100
|
| 709 |
+
print(f"π― Authentic System Completeness: {completeness:.1f}%")
|
| 710 |
+
|
| 711 |
+
if completeness >= 80:
|
| 712 |
+
print("π READY FOR AUTHENTIC HUMANIZATION!")
|
| 713 |
+
elif completeness >= 60:
|
| 714 |
+
print("β
Core features ready - some advanced features may be limited")
|
| 715 |
+
else:
|
| 716 |
+
print("β οΈ Basic mode - install additional dependencies for full features")
|
| 717 |
+
|
| 718 |
+
# For backward compatibility, use the same method name
|
| 719 |
+
UniversalAITextHumanizer = AuthenticAITextHumanizer
|
| 720 |
+
|
| 721 |
+
# Test function
|
| 722 |
+
if __name__ == "__main__":
|
| 723 |
+
humanizer = AuthenticAITextHumanizer()
|
| 724 |
+
|
| 725 |
+
# Test with your examples
|
| 726 |
+
test_cases = [
|
| 727 |
+
{
|
| 728 |
+
"name": "Smartphone Description",
|
| 729 |
+
"text": "Furthermore, this revolutionary smartphone demonstrates exceptional technological capabilities and utilizes advanced processing architecture to ensure optimal performance across all applications. Subsequently, users will experience significant improvements in their daily productivity and entertainment consumption. Moreover, the comprehensive design facilitates seamless integration with existing ecosystems while maintaining superior battery efficiency.",
|
| 730 |
+
"style": "natural"
|
| 731 |
+
},
|
| 732 |
+
{
|
| 733 |
+
"name": "Business Proposal",
|
| 734 |
+
"text": "Our comprehensive proposal demonstrates significant value proposition and utilizes proven methodologies to ensure optimal project outcomes. Furthermore, the systematic implementation of our advanced framework will facilitate substantial improvements in your operational efficiency. It is important to note that our experienced team possesses exceptional expertise and demonstrates remarkable track record in delivering complex solutions.",
|
| 735 |
+
"style": "conversational"
|
| 736 |
+
}
|
| 737 |
+
]
|
| 738 |
+
|
| 739 |
+
print(f"\nπ§ͺ TESTING AUTHENTIC HUMANIZER")
|
| 740 |
+
print("=" * 45)
|
| 741 |
+
|
| 742 |
+
for i, test_case in enumerate(test_cases, 1):
|
| 743 |
+
print(f"\n㪠Test {i}: {test_case['name']}")
|
| 744 |
+
print("-" * 50)
|
| 745 |
+
print(f"π Original: {test_case['text']}")
|
| 746 |
+
|
| 747 |
+
result = humanizer.humanize_text_authentic(
|
| 748 |
+
text=test_case['text'],
|
| 749 |
+
style=test_case['style'],
|
| 750 |
+
intensity=0.8
|
| 751 |
+
)
|
| 752 |
+
|
| 753 |
+
print(f"β¨ Authentic: {result['humanized_text']}")
|
| 754 |
+
print(f"π Similarity: {result['similarity_score']:.3f}")
|
| 755 |
+
print(f"β‘ Processing: {result['processing_time_ms']:.1f}ms")
|
| 756 |
+
print(f"π§ Changes: {', '.join(result['changes_made'])}")
|
| 757 |
+
|
| 758 |
+
print(f"\nπ Authentic testing completed!")
|
| 759 |
+
print(f"β¨ Ready for truly human-like text transformation!")
|