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.
|
|
|
|
'''
|
|
|
|
Simple Sentiment Analysis server for EUROSENTIMENT
|
|
|
|
'''
|
|
|
|
from flask import Blueprint, render_template, request, jsonify, current_app
|
|
|
|
import config
|
|
|
|
import json
|
|
|
|
|
|
|
|
nif_server = Blueprint("NIF Sentiment Analysis Server", __name__)
|
|
|
|
|
|
|
|
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"],
|
|
|
|
},
|
|
|
|
"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"
|
|
|
|
},
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
def get_params(req):
|
|
|
|
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-07-13 13:36:47 +00:00
|
|
|
for param, options in PARAMS.iteritems():
|
|
|
|
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):
|
|
|
|
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:
|
|
|
|
if "options" in PARAMS[param] and \
|
|
|
|
outdict[param] not in PARAMS[param]["options"]:
|
|
|
|
wrongParams[param] = PARAMS[param]
|
|
|
|
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
|
|
|
|
|
|
|
|
@nif_server.route('/', methods=['POST', 'GET'])
|
|
|
|
def home(entries=None):
|
|
|
|
try:
|
|
|
|
params = get_params(request)
|
|
|
|
except ValueError as ex:
|
|
|
|
return ex.message
|
|
|
|
response = current_app.analyse(params)
|
|
|
|
return jsonify(response)
|
|
|
|
|
|
|
|
if __name__ == '__main__':
|
|
|
|
from flask import Flask
|
|
|
|
app = Flask(__name__)
|
|
|
|
app.register_blueprint(nif_server)
|
|
|
|
app.debug = config.DEBUG
|
|
|
|
app.run()
|