diff --git a/sentiment-taiger/README.md b/sentiment-taiger/README.md index 7199d4f..cc1f175 100644 --- a/sentiment-taiger/README.md +++ b/sentiment-taiger/README.md @@ -1,6 +1,9 @@ # Senpy Plugin Taiger -Service that analyzes sentiments from social posts written in Spanish or English. +Proxy for two of Taiger's sentiment analysis services for social media posts: + +* taiger-plugin: proxy for a service that normalizes the text, and gives both a polarity and a polarity value for the text. It works for Spanish and English text. +* taiger3c-plugin: it uses a simpler service that only returns a polarity (positive, negative or none). It only works for Spanish. ## Usage @@ -8,18 +11,19 @@ Service that analyzes sentiments from social posts written in Spanish or English To use this plugin, you should use a GET Requests with the following possible params: Params: - Input: text to analyse.(required) -- Endpoint: Enpoint to the Taiger service. ## Example of Usage Example request: ``` -http://senpy.cluster.gsi.dit.upm.es/api/?algo=sentiment-taiger&inputText=This%20is%20amazing +curl http://senpy.cluster.gsi.dit.upm.es/api/?algo=sentiment-taiger&inputText=This%20is%20amazing + +#Or, for the taiger3c plugin: +curl http://senpy.cluster.gsi.dit.upm.es/api/?algo=sentiment-taiger3c&inputText=Me%20encanta ``` -Example respond: This plugin follows the standard for the senpy plugin response. For more information, please visit [senpy documentation](http://senpy.readthedocs.io). Specifically, NIF API section. - -For example, this would be the example respond for the request done. +This plugin follows the senpy schema and vocabularies, please visit [senpy documentation](http://senpy.readthedocs.io). Specifically, the NIF API section. +It should look like this: ``` { @@ -53,7 +57,8 @@ For example, this would be the example respond for the request done. } ``` -As it can be seen, this plugin analyzes sentiment givin three categories or tags: `marl:Positive`, `marl:Neutral` or `marl:Negative`, that will be held in the `marl:hasPolarity` field. Moreover, the plugin retrieves a `marl:polarityValue`. +As can be seen, this plugin analyzes sentiment giving three categories or tags: `marl:Positive`, `marl:Neutral` or `marl:Negative`, that will be held in the `marl:hasPolarity` field. +Moreover, the plugin retrieves a `marl:polarityValue` (a value between -1 and 1). This plugin supports **python2.7** and **python3**. ![alt GSI Logo][logoGSI] diff --git a/sentiment-taiger/docker-compose.yml b/sentiment-taiger/docker-compose.yml index fbcaf03..3d53c10 100644 --- a/sentiment-taiger/docker-compose.yml +++ b/sentiment-taiger/docker-compose.yml @@ -8,4 +8,4 @@ services: volumes: - ".:/senpy-plugins" environment: - TAIGER_ENDPOINT: 'http://34.244.91.7:8080/sentiment/classifyPositivity' + TAIGER_ENDPOINT: "${TAIGER_ENDPOINT:-http://somedi-taiger.hopto.org:5406/es_sentiment_analyzer_3classes}" diff --git a/sentiment-taiger/taiger3c_plugin.py b/sentiment-taiger/taiger3c_plugin.py new file mode 100644 index 0000000..2c0d790 --- /dev/null +++ b/sentiment-taiger/taiger3c_plugin.py @@ -0,0 +1,164 @@ +# -*- coding: utf-8 -*- + +import time +import requests +import json +import string +import os +from os import path +import time +from senpy.plugins import SentimentPlugin +from senpy.models import Results, Entry, Entity, Topic, Sentiment, Error + + +TAIGER_ENDPOINT = os.environ.get("TAIGER3C_ENDPOINT", 'http://somedi-taiger.hopto.org:5406/es_sentiment_analyzer_3classes') + + +class TaigerPlugin3cats(SentimentPlugin): + ''' + Service that analyzes sentiments from social posts written in Spanish or English. + + Example request: + + http://senpy.cluster.gsi.dit.upm.es/api/?algo=sentiment-taiger3c&inputText=This%20is%20amazing + ''' + name = 'sentiment-taiger3c' + author = 'GSI UPM' + version = "0.1" + maxPolarityValue = -1 + minPolarityValue = 1 + + def _polarity(self, value): + + if 'NONE' == value: + polarity = 'marl:Neutral' + value = 0 + elif 'N' == value: + polarity = 'marl:Negative' + value = -1 + elif 'P' == value: + polarity = 'marl:Positive' + value = 1 + else: + raise ValueError('unknown polarity: {}'.format(value)) + print(value, 'whatsup') + return polarity, value + + def analyse_entry(self, entry, params): + + txt = entry['nif:isString'] + api = TAIGER_ENDPOINT + parameters = { + 'text': txt + } + try: + r = requests.get( + api, params=parameters, timeout=3) + agg_polarity, value = self._polarity(r.text.strip()) + except requests.exceptions.Timeout: + raise Error("No response from the API") + except Exception as ex: + raise Error("There was a problem with the endpoint: {}".format(ex)) + if not agg_polarity: + raise Error('No category in response: {}'.format(ar.text)) + self.log.debug(agg_polarity) + agg_opinion = Sentiment( + id="Opinion0", + marl__hasPolarity=agg_polarity, + marl__polarityValue=value, + ) + agg_opinion.prov(self) + entry.sentiments.append(agg_opinion) + + yield entry + + test_cases = [ + { + 'params': { + 'algo': 'sentiment-taiger', + 'intype': 'direct', + 'expanded-jsonld': 0, + 'informat': 'text', + 'prefix': '', + 'plugin_type': 'analysisPlugin', + 'urischeme': 'RFC5147String', + 'outformat': 'json-ld', + 'conversion': 'full', + 'language': 'en', + 'apikey': '00000', + 'algorithm': 'sentiment-taiger' + }, + 'input': 'I hate to say this', + 'expected': { + 'sentiments': [ + {'marl:hasPolarity': 'marl:Negative'}], + }, + 'responses': [ + { + 'url': TAIGER_ENDPOINT, + 'body': 'N', + } + ] + }, + { + 'params': { + 'algo': 'sentiment-taiger', + 'intype': 'direct', + 'expanded-jsonld': 0, + 'informat': 'text', + 'prefix': '', + 'plugin_type': 'analysisPlugin', + 'urischeme': 'RFC5147String', + 'outformat': 'json-ld', + 'conversion': 'full', + 'language': 'en', + 'apikey': '00000', + 'algorithm': 'sentiment-taiger' + }, + 'input': 'This is amazing', + 'expected': { + 'sentiments': [ + {'marl:hasPolarity': 'marl:Positive'}], + }, + 'responses': [ + { + 'url': TAIGER_ENDPOINT, + 'body': 'P', + } + ] + }, + { + 'params': { + 'algo': 'sentiment-taiger', + 'intype': 'direct', + 'expanded-jsonld': 0, + 'informat': 'text', + 'prefix': '', + 'plugin_type': 'analysisPlugin', + 'urischeme': 'RFC5147String', + 'outformat': 'json-ld', + 'conversion': 'full', + 'language': 'en', + 'apikey': '00000', + 'algorithm': 'sentiment-taiger' + }, + 'input': 'The pillow is in the wardrobe', + 'expected': { + 'sentiments': [ + {'marl:hasPolarity': 'marl:Neutral'}], + }, + 'responses': [ + { + 'url': TAIGER_ENDPOINT, + 'body': 'NONE', + } + ] + } + + + ] + + +if __name__ == '__main__': + from senpy import easy_test + easy_test(debug=False) diff --git a/sentiment-taiger/taiger_plugin.py b/sentiment-taiger/taiger_plugin.py index 14be1ae..7395d5a 100644 --- a/sentiment-taiger/taiger_plugin.py +++ b/sentiment-taiger/taiger_plugin.py @@ -25,8 +25,8 @@ class TaigerPlugin(SentimentPlugin): name = 'sentiment-taiger' author = 'GSI UPM' version = "0.1" - maxPolarityValue = 0 - minPolarityValue = -10 + maxPolarityValue = -1 + minPolarityValue = 1 def _polarity(self, value):