blueprints.py 5.26 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
58
59
60
61
62
                        "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
63
    elif req.method == 'GET':
J. Fernando Sánchez's avatar
J. Fernando Sánchez committed
64
65
66
67
68
        indict = req.args
    else:
        raise ValueError("Invalid data")

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

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

111
@nif_blueprint.route('/', methods=['POST', 'GET'])
J. Fernando Sánchez's avatar
J. Fernando Sánchez committed
112
113
114
115
116
def home(entries=None):
    try:
        params = get_params(request)
    except ValueError as ex:
        return ex.message
117
    response = current_app.senpy.analyse(**params)
J. Fernando Sánchez's avatar
J. Fernando Sánchez committed
118
119
    return jsonify(response)

120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
@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":
        dic = {plug:plugs[plug].enabled for plug in plugs}
        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
141
if __name__ == '__main__':
142
    import config
J. Fernando Sánchez's avatar
J. Fernando Sánchez committed
143
144
    from flask import Flask
    app = Flask(__name__)
145
    app.register_blueprint(nif_blueprint)
J. Fernando Sánchez's avatar
J. Fernando Sánchez committed
146
147
    app.debug = config.DEBUG
    app.run()