1
0
mirror of https://github.com/gsi-upm/senpy synced 2024-09-28 17:01:43 +00:00
senpy/senpy/blueprints.py

153 lines
5.5 KiB
Python
Raw Normal View History

2014-07-13 13:36:47 +00:00
#!/usr/bin/python
# -*- coding: utf-8 -*-
# Copyright 2014 J. Fernando Sánchez Rada - Grupo de Sistemas Inteligentes
# DIT, UPM
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
'''
2014-09-23 10:33:34 +00:00
Simple Sentiment Analysis server
2014-07-13 13:36:47 +00:00
'''
from flask import Blueprint, render_template, request, jsonify, current_app
import json
2014-10-17 10:47:17 +00:00
nif_blueprint = Blueprint("NIF Sentiment Analysis Server", __name__)
2014-07-13 13:36:47 +00:00
PARAMS = {"input": {"aliases": ["i", "input"],
2014-07-13 13:57:42 +00:00
"required": True,
2014-07-13 13:36:47 +00:00
"help": "Input text"
},
"informat": {"aliases": ["f", "informat"],
2014-07-13 13:57:42 +00:00
"required": False,
2014-07-13 13:36:47 +00:00
"default": "text",
"options": ["turtle", "text"],
},
"intype": {"aliases": ["intype", "t"],
2014-07-13 13:57:42 +00:00
"required": False,
2014-07-13 13:36:47 +00:00
"default": "direct",
"options": ["direct", "url", "file"],
},
"outformat": {"aliases": ["outformat", "o"],
"default": "json-ld",
2014-07-13 13:57:42 +00:00
"required": False,
2014-07-13 13:36:47 +00:00
"options": ["json-ld"],
},
2014-10-17 10:47:17 +00:00
"algorithm": {"aliases": ["algorithm", "a", "algo"],
2014-09-23 10:33:34 +00:00
"required": False,
},
2014-07-13 13:36:47 +00:00
"language": {"aliases": ["language", "l"],
2014-07-13 13:57:42 +00:00
"required": False,
"options": ["es", "en"],
},
2014-07-13 13:36:47 +00:00
"urischeme": {"aliases": ["urischeme", "u"],
2014-07-13 13:57:42 +00:00
"required": False,
2014-07-13 13:36:47 +00:00
"default": "RFC5147String",
"options": "RFC5147String"
},
}
2014-10-17 17:06:19 +00:00
def get_algorithm(req):
return get_params(req, params={"algorithm": PARAMS["algorithm"]})
2014-07-13 13:36:47 +00:00
2014-10-17 17:06:19 +00:00
def get_params(req, params=PARAMS):
2014-07-13 13:36:47 +00:00
indict = None
if req.method == 'POST':
indict = req.form
2014-07-13 14:38:13 +00:00
elif req.method == 'GET':
2014-07-13 13:36:47 +00:00
indict = req.args
else:
raise ValueError("Invalid data")
outdict = {}
2014-07-13 13:57:42 +00:00
wrongParams = {}
2014-10-17 17:06:19 +00:00
for param, options in params.iteritems():
2014-07-13 13:36:47 +00:00
for alias in options["aliases"]:
if alias in indict:
outdict[param] = indict[alias]
if param not in outdict:
2014-07-13 13:57:42 +00:00
if options.get("required", False):
2014-10-17 17:06:19 +00:00
wrongParams[param] = params[param]
2014-07-13 13:36:47 +00:00
else:
2014-07-13 13:57:42 +00:00
if "default" in options:
outdict[param] = options["default"]
else:
2014-10-17 17:06:19 +00:00
if "options" in params[param] and \
outdict[param] not in params[param]["options"]:
wrongParams[param] = params[param]
2014-07-13 13:57:42 +00:00
if wrongParams:
message = {"status": "failed", "message": "Missing or invalid parameters"}
message["parameters"] = outdict
message["errors"] = {param:error for param, error in wrongParams.iteritems()}
2014-07-13 13:36:47 +00:00
raise ValueError(json.dumps(message))
return outdict
def basic_analysis(params):
2014-07-13 14:28:01 +00:00
response = {"@context": ["http://demos.gsi.dit.upm.es/eurosentiment/static/context.jsonld",
{
"@base": "{}#".format(request.url.encode('utf-8'))
}
],
2014-07-13 13:36:47 +00:00
"analysis": [{
"@type": "marl:SentimentAnalysis"
}],
"entries": []
}
if "language" in params:
response["language"] = params["language"]
2014-07-13 14:28:01 +00:00
for idx, sentence in enumerate(params["input"].split(".")):
2014-07-13 13:36:47 +00:00
response["entries"].append({
2014-07-13 14:28:01 +00:00
"@id": "Sentence{}".format(idx),
2014-07-13 13:36:47 +00:00
"nif:isString": sentence
})
return response
2014-10-17 10:47:17 +00:00
@nif_blueprint.route('/', methods=['POST', 'GET'])
2014-07-13 13:36:47 +00:00
def home(entries=None):
try:
2014-10-17 17:06:19 +00:00
algo = get_algorithm(request)["algorithm"]
specific_params = PARAMS.copy()
specific_params.update(current_app.senpy.parameters(algo))
params = get_params(request, specific_params)
2014-07-13 13:36:47 +00:00
except ValueError as ex:
return ex.message
2014-10-17 10:47:17 +00:00
response = current_app.senpy.analyse(**params)
2014-07-13 13:36:47 +00:00
return jsonify(response)
2014-10-17 10:47:17 +00:00
@nif_blueprint.route('/plugins/', methods=['POST', 'GET'])
@nif_blueprint.route('/plugins/<plugin>', methods=['POST', 'GET'])
@nif_blueprint.route('/plugins/<plugin>/<action>', methods=['POST', 'GET'])
def plugins(plugin=None, action="list"):
print current_app.senpy.plugins.keys()
if plugin:
plugs = {plugin:current_app.senpy.plugins[plugin]}
else:
plugs = current_app.senpy.plugins
if action == "list":
2014-10-17 17:06:19 +00:00
dic = {plug:plugs[plug].jsonable(True) for plug in plugs}
2014-10-17 10:47:17 +00:00
return jsonify(dic)
elif action == "disable":
plugs[plugin].enabled = False
return "Ok"
elif action == "enable":
plugs[plugin].enabled = True
return "Ok"
else:
return "action '{}' not allowed".format(action), 404
2014-07-13 13:36:47 +00:00
if __name__ == '__main__':
2014-10-17 10:47:17 +00:00
import config
2014-07-13 13:36:47 +00:00
from flask import Flask
app = Flask(__name__)
2014-10-17 10:47:17 +00:00
app.register_blueprint(nif_blueprint)
2014-07-13 13:36:47 +00:00
app.debug = config.DEBUG
app.run()