Introduction
Paraphrasing and summarizing are vital so that you essay doesn’t become one long quote of other academics’ work. To paraphrase a piece of text is to write it in your own words. In this article, I will show you how I make an app that will help me rephrase the sentence I need.
Quickstart
Create desktop applications with Flask and flaskwebgui.
pip install flaskwebgui
Load the libraries we need.
import os
import torch
from transformers import PegasusForConditionalGeneration
from transformers import PegasusTokenizer
from flask import Flask, request, render_template
from flaskwebgui import FlaskUI
Paraphrase NLP
I use a pre-trained model called PEGASUS, proposed by Google in 2020. It uses self-supervised objective Gap Sentences Generation (GSG) to train a transformer encoder-decoder model.
Also, I use huggingface library to get the fine-tuned model trained by tuner007.
model_name = 'tuner007/pegasus_paraphrase'
torch_device = 'cuda' if torch.cuda.is_available() else 'cpu'
def load_model():
global model
global tokenizer
tokenizer = PegasusTokenizer.from_pretrained(model_name)
model = PegasusForConditionalGeneration.from_pretrained(model_name).to(torch_device)
def get_response(input_text, num_return_sequences, num_beams):
batch = tokenizer([input_text],
truncation=True,
padding='longest',
max_length=60,
return_tensors="pt").to(torch_device)
translated = model.generate(**batch,
max_length=60,
num_beams=num_beams,
num_return_sequences=num_return_sequences,
temperature=1.5)
tgt_text = tokenizer.batch_decode(translated,
skip_special_tokens=True)
return tgt_text
Python App GUI
Next, create a file named app.py.
touch app.py
Put the following code inside of it.
import os
import torch
from transformers import PegasusForConditionalGeneration
from transformers import PegasusTokenizer
from flask import Flask, request, render_template
from flaskwebgui import FlaskUI
app = Flask(__name__)
ui = FlaskUI(app, width=800, height=1000)
model_name = 'tuner007/pegasus_paraphrase'
torch_device = 'cuda' if torch.cuda.is_available() else 'cpu'
@app.route("/", methods=["GET", "POST"])
def index():
if request.method == "GET":
return render_template('index.html')
elif request.method == "POST":
context = request.form["paragraph"]
num_beams = 10
num_return_sequences = 10
tgt_text = get_response(context, num_return_sequences, num_beams)
return render_template('index.html', src_text=context, tgt_text=tgt_text)
@app.before_first_request
def load_model():
global model
global tokenizer
tokenizer = PegasusTokenizer.from_pretrained(model_name)
model = PegasusForConditionalGeneration.from_pretrained(model_name).to(torch_device)
def get_response(input_text, num_return_sequences, num_beams):
batch = tokenizer([input_text],
truncation=True,
padding='longest',
max_length=60,
return_tensors="pt").to(torch_device)
translated = model.generate(**batch,
max_length=60,
num_beams=num_beams,
num_return_sequences=num_return_sequences,
temperature=1.5)
tgt_text = tokenizer.batch_decode(translated,
skip_special_tokens=True)
return tgt_text
if __name__ == '__main__':
ui.run()
Frontend Interface
Create two folders, static/css and templates, and create style.css in static/css folder, and create html files base.html and index.html in templates folder.
base.html
<!doctype html>
<html lang="en">
<head>
<!-- Required meta tags -->
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<!-- Bootstrap CSS -->
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous">
<!-- Semantic UI -->
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/semantic-ui@2.4.2/dist/semantic.min.css">
<script src="https://cdn.jsdelivr.net/npm/semantic-ui@2.4.2/dist/semantic.min.js"></script>
<title>{% block title %} {% endblock %}</title>
</head>
<body>
<nav class="navbar navbar-expand-md navbar-light bg-light">
<a class="navbar-brand" href="{{ url_for('index')}}">Paraphraser</a>
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarNav" aria-controls="navbarNav" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarNav">
<ul class="navbar-nav">
<li class="nav-item active">
<a class="nav-link" href="#">About</a>
</li>
</ul>
</div>
</nav>
<div class="container">
{% block content %} {% endblock %}
</div>
<!-- Optional JavaScript -->
<!-- jQuery first, then Popper.js, then Bootstrap JS -->
<script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js" integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1" crossorigin="anonymous"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous"></script>
</body>
</html>
index.html
{% extends 'base.html' %}
{% block content %}
<h1>Welcome to Paraphraser!</h1>
<div class="form-group green-border-focus">
<form method="POST">
<div class="form-group">
<textarea class="form-control" id="exampleFormControlTextarea5" placeholder="Your sentence here..." value=" " rows="10" cols="50" name="paragraph"></textarea>
</div>
<div class="form-group">
<input class="btn btn-primary" type="submit" name="Submit" value="Submit">
</div>
</form>
</div>
<div>
{% if src_text is not none %}
<h3>Original Sentence: </h3>
<p>{{ src_text }}</p>
<br>
{% endif %}
</div>
<div>
{% if tgt_text is not none %}
<h3>Paraphrased Sentences: </h3>
<ul>
{% for text in tgt_text %}
<li>{{ text }}</li>
{% endfor %}
</ul>
{% endif %}
</div>
{% endblock %}
style.css
h1 {
border: 2px #eee solid;
color: brown;
text-align: center;
padding: 30px;
}
textarea {
border: 1px solid #ba68c8;
}
.form-control:focus {
border: 1px solid #ba68c8;
box-shadow: 0 0 0 0.2rem rgba(186, 104, 200, .25);
}
.green-border-focus .form-control:focus {
border: 1px solid #8bc34a;
box-shadow: 0 0 0 0.2rem rgba(139, 195, 74, .25);
}
Run the code!
python app.py
Conclusion
Check your paraphrasing for grammar and plagiarism. It’s fast and easy!