From 6858a139ed54782997fd770c706a587e698ed9e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=2E=20Fernando=20S=C3=A1nchez?= Date: Thu, 4 Apr 2019 13:10:27 +0200 Subject: [PATCH] Move Taiger to a separate repository --- sentiment-taiger/Dockerfile | 1 - sentiment-taiger/README.md | 67 ----------- sentiment-taiger/docker-compose.yml | 11 -- sentiment-taiger/taiger3c_plugin.py | 164 -------------------------- sentiment-taiger/taiger_plugin.py | 174 ---------------------------- 5 files changed, 417 deletions(-) delete mode 100644 sentiment-taiger/Dockerfile delete mode 100644 sentiment-taiger/README.md delete mode 100644 sentiment-taiger/docker-compose.yml delete mode 100644 sentiment-taiger/taiger3c_plugin.py delete mode 100644 sentiment-taiger/taiger_plugin.py diff --git a/sentiment-taiger/Dockerfile b/sentiment-taiger/Dockerfile deleted file mode 100644 index 5a9deba..0000000 --- a/sentiment-taiger/Dockerfile +++ /dev/null @@ -1 +0,0 @@ -from gsiupm/senpy:0.11.4 diff --git a/sentiment-taiger/README.md b/sentiment-taiger/README.md deleted file mode 100644 index cc1f175..0000000 --- a/sentiment-taiger/README.md +++ /dev/null @@ -1,67 +0,0 @@ -# Senpy Plugin Taiger - -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 - -To use this plugin, you should use a GET Requests with the following possible params: -Params: -- Input: text to analyse.(required) - -## Example of Usage - -Example request: -``` -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 -``` - -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: - -``` -{ - "@context": "http://localhost:5005/api/contexts/Results.jsonld", - "@id": "_:Results_1532449339.5887764", - "@type": "results", - "analysis": [ - "endpoint:plugins/sentiment-taiger_0.1" - ], - "entries": [ - { - "@id": "#", - "@type": "entry", - "emotions": [], - "entities": [], - "nif:isString": "This is amazing", - "sentiments": [ - { - "@id": "Opinion0", - "@type": "sentiment", - "marl:hasPolarity": "marl:Positive", - "marl:polarityValue": -1.4646806570973374, - "normalizedText": "This is amazing", - "prov:wasGeneratedBy": "endpoint:plugins/sentiment-taiger_0.1" - } - ], - "suggestions": [], - "topics": [] - } - ] -} -``` - -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] - -[logoGSI]: http://www.gsi.dit.upm.es/images/stories/logos/gsi.png "GSI Logo" - diff --git a/sentiment-taiger/docker-compose.yml b/sentiment-taiger/docker-compose.yml deleted file mode 100644 index c8a889a..0000000 --- a/sentiment-taiger/docker-compose.yml +++ /dev/null @@ -1,11 +0,0 @@ -version: '3' -services: - dev: - image: "gsiupm/senpy-taiger:${VERSION:-dev}" - working_dir: "/senpy-plugins" - ports: - - "127.0.0.1:5005:5000" - volumes: - - ".:/senpy-plugins" - environment: - 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 deleted file mode 100644 index 8f0d2cd..0000000 --- a/sentiment-taiger/taiger3c_plugin.py +++ /dev/null @@ -1,164 +0,0 @@ -# -*- 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)) - return polarity, value - - def analyse_entry(self, entry, activity): - params = activity.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': { - 'marl:hasOpinion': [ - {'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': { - 'marl:hasOpinion': [ - {'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': { - 'marl:hasOpinion': [ - {'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 deleted file mode 100644 index d3168e8..0000000 --- a/sentiment-taiger/taiger_plugin.py +++ /dev/null @@ -1,174 +0,0 @@ -# -*- 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("TAIGER_ENDPOINT", 'http://34.244.91.7:8080/sentiment/classifyPositivity') - - -class TaigerPlugin(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-taiger&inputText=This%20is%20amazing - ''' - name = 'sentiment-taiger' - author = 'GSI UPM' - version = "0.1" - maxPolarityValue = -1 - minPolarityValue = 1 - - def _polarity(self, value): - - if 'neu' in value: - polarity = 'marl:Neutral' - elif 'neg' in value: - polarity = 'marl:Negative' - elif 'pos' in value: - polarity = 'marl:Positive' - return polarity - - def analyse_entry(self, entry, activity): - params = activity.params - - txt = entry['nif:isString'] - api = TAIGER_ENDPOINT - parameters = { - 'inputText': txt - } - try: - r = requests.get( - api, params=parameters, timeout=3) - api_response = r.json() - 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 api_response.get('positivityCategory'): - raise Error('No positive category in response: {}'.format(r.json())) - self.log.debug(api_response) - agg_polarity = self._polarity(api_response.get('positivityCategory')) - normalized_text = api_response.get('normalizedText', None) - agg_opinion = Sentiment( - id="Opinion0", - marl__hasPolarity=agg_polarity, - marl__polarityValue=api_response['positivityScore'] - ) - agg_opinion["normalizedText"] = api_response['normalizedText'] - 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': '', - 'urischeme': 'RFC5147String', - 'outformat': 'json-ld', - 'conversion': 'full', - 'language': 'en', - 'apikey': '00000', - 'algorithm': 'sentiment-taiger' - }, - 'input': 'I hate to say this', - 'expected': { - 'marl:hasOpinion': [ - {'marl:hasPolarity': 'marl:Negative'}], - }, - 'responses': [ - { - 'url': TAIGER_ENDPOINT, - 'json': { - "inputText": "I hate to say this", - "normalizedText": "I hate to say this", - "positivityScore": -1.8951251587831475, - "positivityCategory": "neg" - } - } - ] - }, - { - 'params': { - 'algo': 'sentiment-taiger', - 'intype': 'direct', - 'expanded-jsonld': 0, - 'informat': 'text', - 'prefix': '', - 'urischeme': 'RFC5147String', - 'outformat': 'json-ld', - 'conversion': 'full', - 'language': 'en', - 'apikey': '00000', - 'algorithm': 'sentiment-taiger' - }, - 'input': 'This is amazing', - 'expected': { - 'marl:hasOpinion': [ - {'marl:hasPolarity': 'marl:Positive'}], - }, - 'responses': [ - { - 'url': TAIGER_ENDPOINT, - 'json': { - "inputText": "This is amazing ", - "normalizedText": "This is amazing", - "positivityScore": -1.4646806570973374, - "positivityCategory": "pos" - } - } - ] - }, - { - 'params': { - 'algo': 'sentiment-taiger', - 'intype': 'direct', - 'expanded-jsonld': 0, - 'informat': 'text', - 'prefix': '', - 'urischeme': 'RFC5147String', - 'outformat': 'json-ld', - 'conversion': 'full', - 'language': 'en', - 'apikey': '00000', - 'algorithm': 'sentiment-taiger' - }, - 'input': 'The pillow is in the wardrobe', - 'expected': { - 'marl:hasOpinion': [ - {'marl:hasPolarity': 'marl:Neutral'}], - }, - 'responses': [ - { - 'url': TAIGER_ENDPOINT, - 'json': { - "inputText": "The pillow is in the wardrobe", - "normalizedText": "The pillow is in the wardrobe", - "positivityScore": -2.723999097522657, - "positivityCategory": "neu" - } - } - ] - } - - - ] - - -if __name__ == '__main__': - from senpy import easy_test - easy_test()