nif_server.py 4.48 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
#!/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.
'''
J. Fernando Sánchez's avatar
J. Fernando Sánchez committed
18
Simple Sentiment Analysis server
J. Fernando Sánchez's avatar
J. Fernando Sánchez committed
19
20
21
22
23
24
25
26
'''
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
                        "options": ["json-ld"],
                        },
J. Fernando Sánchez's avatar
J. Fernando Sánchez committed
45
46
47
          "algorithm": {"aliases": ["algorithm", "a"],
                        "required": False,
                        },
J. Fernando Sánchez's avatar
J. Fernando Sánchez committed
48
          "language": {"aliases": ["language", "l"],
J. Fernando Sánchez's avatar
J. Fernando Sánchez committed
49
50
51
                       "required": False,
                       "options": ["es", "en"],
                       },
J. Fernando Sánchez's avatar
J. Fernando Sánchez committed
52
          "urischeme": {"aliases": ["urischeme", "u"],
J. Fernando Sánchez's avatar
J. Fernando Sánchez committed
53
                        "required": False,
J. Fernando Sánchez's avatar
J. Fernando Sánchez committed
54
55
56
57
58
59
60
61
62
63
                        "default": "RFC5147String",
                        "options": "RFC5147String"
                        },
          }


def get_params(req):
    indict = None
    if req.method == 'POST':
        indict = req.form
J. Fernando Sánchez's avatar
Oups    
J. Fernando Sánchez committed
64
    elif req.method == 'GET':
J. Fernando Sánchez's avatar
J. Fernando Sánchez committed
65
66
67
68
69
        indict = req.args
    else:
        raise ValueError("Invalid data")

    outdict = {}
J. Fernando Sánchez's avatar
J. Fernando Sánchez committed
70
    wrongParams = {}
J. Fernando Sánchez's avatar
J. Fernando Sánchez committed
71
72
73
74
75
    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
76
77
            if options.get("required", False):
                wrongParams[param] = PARAMS[param]
J. Fernando Sánchez's avatar
J. Fernando Sánchez committed
78
            else:
J. Fernando Sánchez's avatar
J. Fernando Sánchez committed
79
80
81
82
83
84
85
86
87
88
                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
89
90
91
92
        raise ValueError(json.dumps(message))
    return outdict

def basic_analysis(params):
93
94
95
96
97
    response = {"@context": ["http://demos.gsi.dit.upm.es/eurosentiment/static/context.jsonld",
                             {
                                 "@base": "{}#".format(request.url.encode('utf-8'))
                             }
                             ],
J. Fernando Sánchez's avatar
J. Fernando Sánchez committed
98
99
100
101
102
103
104
                "analysis": [{
                    "@type": "marl:SentimentAnalysis"
                }],
                "entries": []
                }
    if "language" in params:
        response["language"] = params["language"]
105
    for idx, sentence in enumerate(params["input"].split(".")):
J. Fernando Sánchez's avatar
J. Fernando Sánchez committed
106
        response["entries"].append({
107
            "@id": "Sentence{}".format(idx),
J. Fernando Sánchez's avatar
J. Fernando Sánchez committed
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
            "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()