thak123's picture
Upload 8 files
cdb159e
import flask
import torch
from flask import Flask, render_template, request
from utils import label_full_decoder
import sys
import config
import dataset
import engine
from model import BERTBaseUncased
from tokenizer import tokenizer
from werkzeug.serving import run_simple
# from werkzeug.wsgi import DispatcherMiddleware
T = tokenizer.TweetTokenizer(
preserve_handles=True, preserve_hashes=True, preserve_case=False, preserve_url=False)
app = Flask(__name__,
static_folder='app_resources/static',
static_url_path='/sentimentanalyzer',
instance_relative_config=True,
template_folder='app_resources/templates/public')
MODEL = None
DEVICE = config.device
def preprocess(text):
tokens = T.tokenize(text)
print(tokens, file=sys.stderr)
ptokens = []
for index, token in enumerate(tokens):
if "@" in token:
if index > 0:
# check if previous token was mention
if "@" in tokens[index-1]:
pass
else:
ptokens.append("mention_0")
else:
ptokens.append("mention_0")
else:
ptokens.append(token)
print(ptokens, file=sys.stderr)
return " ".join(ptokens)
def sentence_prediction(sentence):
sentence = preprocess(sentence)
model_path = config.MODEL_PATH
test_dataset = dataset.BERTDataset(
review=[sentence],
target=[0]
)
test_data_loader = torch.utils.data.DataLoader(
test_dataset,
batch_size=config.VALID_BATCH_SIZE,
num_workers=3
)
device = config.device
model = BERTBaseUncased()
model.load_state_dict(torch.load(
model_path, map_location=torch.device(device)))
model.to(device)
outputs, [] = engine.predict_fn(test_data_loader, model, device)
print(outputs)
return outputs[0]
@app.route("/sentimentanalyzer/predict", methods=['POST'])
def predict():
print(request.form, file=sys.stderr)
# print([(x) for x in request.get_json()],file=sys.stderr)
# sentence = request.get_json().get("sentence","")
sentence = request.form['sentence']
if sentence:
print(sentence, file=sys.stderr)
prediction = sentence_prediction(sentence)
response = {}
response["response"] = {
'sentence': sentence,
'prediction': label_full_decoder(prediction),
}
return flask.jsonify(response)
else:
return flask.jsonify({"error": "empty text"})
@app.route("/sentimentanalyzer/")
def index():
return render_template("index.html")
@app.route("/sentimentanalyzer/demo")
def demo():
return render_template("demo.html")
@app.route("/sentimentanalyzer/models")
def models():
return render_template("models.html")
@app.route("/sentimentanalyzer/about")
def about():
return render_template("about.html")
if __name__ == "__main__":
MODEL = BERTBaseUncased()
MODEL.load_state_dict(torch.load(
config.MODEL_PATH, map_location=torch.device(DEVICE)))
MODEL.eval()
app.run("127.0.0.1", port=1095, debug=True)
# host="http://cleopatra.ijs.si/sentimentanalyzer"