diff --git a/Procfile b/Procfile new file mode 100644 index 0000000..244c130 --- /dev/null +++ b/Procfile @@ -0,0 +1 @@ +web: gunicorn app:app --log-file=- diff --git a/app.py b/app.py new file mode 100644 index 0000000..35c0ec1 --- /dev/null +++ b/app.py @@ -0,0 +1,49 @@ +#!/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 Flask +from random import random +from nif_server import * +import config + +app = Flask(__name__) + +def hard_analysis(params): + response = basic_analysis(params) + response["analysis"][0]["marl:algorithm"] = "SimpleAlgorithm" + for i in response["entries"]: + polValue = random() + if polValue > 0.5: + pol = "marl:Positive" + elif polValue == 0.5: + pol = "marl:Neutral" + else: + pol = "marl:Negative" + i["opinions"] = [{"marl:polarityValue": polValue, + "marl:hasPolarity": pol + + }] + return response + +app.analyse = hard_analysis +app.register_blueprint(nif_server) + +if __name__ == '__main__': + app.debug = config.DEBUG + app.run() diff --git a/config.py b/config.py new file mode 100644 index 0000000..902892f --- /dev/null +++ b/config.py @@ -0,0 +1,4 @@ +import os + +SERVER_PORT = os.environ.get("SERVER_PORT", 5000) +DEBUG = os.environ.get("DEBUG", True) diff --git a/nif_server.py b/nif_server.py new file mode 100644 index 0000000..c11a907 --- /dev/null +++ b/nif_server.py @@ -0,0 +1,108 @@ +#!/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"], + "help": "Input text" + }, + "informat": {"aliases": ["f", "informat"], + "default": "text", + "options": ["turtle", "text"], + }, + "intype": {"aliases": ["intype", "t"], + "default": "direct", + "options": ["direct", "url", "file"], + }, + "outformat": {"aliases": ["outformat", "o"], + "default": "json-ld", + "options": ["json-ld"], + }, + "language": {"aliases": ["language", "l"], + "default": None, + "options": ["es", "en"], + }, + "urischeme": {"aliases": ["urischeme", "u"], + "default": "RFC5147String", + "options": "RFC5147String" + }, + } + + +def get_params(req): + indict = None + if req.method == 'POST': + indict = req.form + if req.method == 'GET': + indict = req.args + else: + raise ValueError("Invalid data") + + outdict = {} + missingParams = [] + for param, options in PARAMS.iteritems(): + for alias in options["aliases"]: + if alias in indict: + outdict[param] = indict[alias] + if param not in outdict: + if "default" in options: + if options["default"]: + outdict[param] = options["default"] + else: + missingParams.append(param) + if missingParams: + message = {"status": "failed", "message": "Missing parameters"} + message["parameters"] = {param:PARAMS[param] for param in missingParams} + raise ValueError(json.dumps(message)) + return outdict + +def basic_analysis(params): + response = {"@context": "http://demos.gsi.dit.upm.es/eurosentiment/static/context.jsonld", + "analysis": [{ + "@type": "marl:SentimentAnalysis" + }], + "entries": [] + } + if "language" in params: + response["language"] = params["language"] + for sentence in params["input"].split("."): + response["entries"].append({ + "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() diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..46e40a0 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,2 @@ +Flask==0.10.1 +gunicorn==19.0.0