nif_server.py 4.18 KB
Newer Older
J. Fernando Sánchez's avatar
J. Fernando Sánchez committed
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#!/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"],
J. Fernando Sánchez's avatar
J. Fernando Sánchez committed
27
                    "required": True,
J. Fernando Sánchez's avatar
J. Fernando Sánchez committed
28
29
30
                    "help": "Input text"
                    },
          "informat": {"aliases": ["f", "informat"],
J. Fernando Sánchez's avatar
J. Fernando Sánchez committed
31
                       "required": False,
J. Fernando Sánchez's avatar
J. Fernando Sánchez committed
32
33
34
35
                       "default": "text",
                       "options": ["turtle", "text"],
                       },
          "intype": {"aliases": ["intype", "t"],
J. Fernando Sánchez's avatar
J. Fernando Sánchez committed
36
                     "required": False,
J. Fernando Sánchez's avatar
J. Fernando Sánchez committed
37
38
39
40
41
                     "default": "direct",
                     "options": ["direct", "url", "file"],
                     },
          "outformat": {"aliases": ["outformat", "o"],
                        "default": "json-ld",
J. Fernando Sánchez's avatar
J. Fernando Sánchez committed
42
                        "required": False,
J. Fernando Sánchez's avatar
J. Fernando Sánchez committed
43
44
45
                        "options": ["json-ld"],
                        },
          "language": {"aliases": ["language", "l"],
J. Fernando Sánchez's avatar
J. Fernando Sánchez committed
46
47
48
49
                       "default": None,
                       "required": False,
                       "options": ["es", "en"],
                       },
J. Fernando Sánchez's avatar
J. Fernando Sánchez committed
50
          "urischeme": {"aliases": ["urischeme", "u"],
J. Fernando Sánchez's avatar
J. Fernando Sánchez committed
51
                        "required": False,
J. Fernando Sánchez's avatar
J. Fernando Sánchez committed
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
                        "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 = {}
J. Fernando Sánchez's avatar
J. Fernando Sánchez committed
68
    wrongParams = {}
J. Fernando Sánchez's avatar
J. Fernando Sánchez committed
69
70
71
72
73
    for param, options in PARAMS.iteritems():
        for alias in options["aliases"]:
            if alias in indict:
                outdict[param] = indict[alias]
        if param not in outdict:
J. Fernando Sánchez's avatar
J. Fernando Sánchez committed
74
75
            if options.get("required", False):
                wrongParams[param] = PARAMS[param]
J. Fernando Sánchez's avatar
J. Fernando Sánchez committed
76
            else:
J. Fernando Sánchez's avatar
J. Fernando Sánchez committed
77
78
79
80
81
82
83
84
85
86
                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()}
J. Fernando Sánchez's avatar
J. Fernando Sánchez committed
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
        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()