blueprints.py 5.54 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
'''
from flask import Blueprint, render_template, request, jsonify, current_app
import json

23
nif_blueprint = Blueprint("NIF Sentiment Analysis Server", __name__)
J. Fernando Sánchez's avatar
J. Fernando Sánchez committed
24
25

PARAMS = {"input": {"aliases": ["i", "input"],
J. Fernando Sánchez's avatar
J. Fernando Sánchez committed
26
                    "required": True,
J. Fernando Sánchez's avatar
J. Fernando Sánchez committed
27
28
29
                    "help": "Input text"
                    },
          "informat": {"aliases": ["f", "informat"],
J. Fernando Sánchez's avatar
J. Fernando Sánchez committed
30
                       "required": False,
J. Fernando Sánchez's avatar
J. Fernando Sánchez committed
31
32
33
34
                       "default": "text",
                       "options": ["turtle", "text"],
                       },
          "intype": {"aliases": ["intype", "t"],
J. Fernando Sánchez's avatar
J. Fernando Sánchez committed
35
                     "required": False,
J. Fernando Sánchez's avatar
J. Fernando Sánchez committed
36
37
38
39
40
                     "default": "direct",
                     "options": ["direct", "url", "file"],
                     },
          "outformat": {"aliases": ["outformat", "o"],
                        "default": "json-ld",
J. Fernando Sánchez's avatar
J. Fernando Sánchez committed
41
                        "required": False,
J. Fernando Sánchez's avatar
J. Fernando Sánchez committed
42
43
                        "options": ["json-ld"],
                        },
44
          "algorithm": {"aliases": ["algorithm", "a", "algo"],
J. Fernando Sánchez's avatar
J. Fernando Sánchez committed
45
46
                        "required": False,
                        },
J. Fernando Sánchez's avatar
J. Fernando Sánchez committed
47
          "language": {"aliases": ["language", "l"],
J. Fernando Sánchez's avatar
J. Fernando Sánchez committed
48
49
50
                       "required": False,
                       "options": ["es", "en"],
                       },
J. Fernando Sánchez's avatar
J. Fernando Sánchez committed
51
          "urischeme": {"aliases": ["urischeme", "u"],
J. Fernando Sánchez's avatar
J. Fernando Sánchez committed
52
                        "required": False,
J. Fernando Sánchez's avatar
J. Fernando Sánchez committed
53
54
55
56
57
                        "default": "RFC5147String",
                        "options": "RFC5147String"
                        },
          }

58
59
def get_algorithm(req):
    return get_params(req, params={"algorithm": PARAMS["algorithm"]})
J. Fernando Sánchez's avatar
J. Fernando Sánchez committed
60

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

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

def basic_analysis(params):
94
95
96
97
98
    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
99
100
101
102
103
104
105
                "analysis": [{
                    "@type": "marl:SentimentAnalysis"
                }],
                "entries": []
                }
    if "language" in params:
        response["language"] = params["language"]
106
    for idx, sentence in enumerate(params["input"].split(".")):
J. Fernando Sánchez's avatar
J. Fernando Sánchez committed
107
        response["entries"].append({
108
            "@id": "Sentence{}".format(idx),
J. Fernando Sánchez's avatar
J. Fernando Sánchez committed
109
110
111
112
            "nif:isString": sentence
        })
    return response

113
@nif_blueprint.route('/', methods=['POST', 'GET'])
J. Fernando Sánchez's avatar
J. Fernando Sánchez committed
114
115
def home(entries=None):
    try:
116
117
118
119
        algo = get_algorithm(request)["algorithm"]
        specific_params = PARAMS.copy()
        specific_params.update(current_app.senpy.parameters(algo))
        params = get_params(request, specific_params)
J. Fernando Sánchez's avatar
J. Fernando Sánchez committed
120
121
    except ValueError as ex:
        return ex.message
122
    response = current_app.senpy.analyse(**params)
J. Fernando Sánchez's avatar
J. Fernando Sánchez committed
123
124
    return jsonify(response)

125
126
127
128
129
130
131
132
133
134
@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":
135
        dic = {plug:plugs[plug].jsonable(True) for plug in plugs}
136
137
138
139
140
141
142
143
144
145
        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

J. Fernando Sánchez's avatar
J. Fernando Sánchez committed
146
if __name__ == '__main__':
147
    import config
J. Fernando Sánchez's avatar
J. Fernando Sánchez committed
148
149
    from flask import Flask
    app = Flask(__name__)
150
    app.register_blueprint(nif_blueprint)
J. Fernando Sánchez's avatar
J. Fernando Sánchez committed
151
152
    app.debug = config.DEBUG
    app.run()