Completed
Push — master ( d242d8...16b8b8 )
by Gus
01:27
created

SentimentAnalyzer.score()   B

Complexity

Conditions 5

Size

Total Lines 16

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 5
dl 0
loc 16
rs 8.5454
c 1
b 0
f 0
1
#!/usr/bin/env python
2
# -*- coding: utf-8 -*-
3
from __future__ import unicode_literals
4
from .utils import post_json
5
from .ds import Sentence, Document
6
from .processors import Message, SentencesMessage
7
import json
8
import six
9
10
11
class SentimentAnalysisAPI(object):
12
    """
13
    API for performing sentiment analysis
14
    """
15
    def __init__(self, address):
16
        self._service = address
17
        self.corenlp = CoreNLPSentimentAnalyzer(self._service)
18
19
20
class SentimentAnalyzer(object):
21
22
    def __init__(self, address):
23
        self._service = "{}/sentiment/score".format(address)
24
        self._text_service = self._service
25
        self._segmented_service = self._service
26
        self._sentence_service = self._service
27
        self._document_service = self._service
28
29
    def score_document(self, doc):
30
        """
31
        Sends a Document to the server for sentiment scoring
32
        Returns a list of scores (one for each sentence)
33
        """
34
        try:
35
            sentiment_scores = post_json(self._document_service, doc.to_JSON())
36
            return sentiment_scores["scores"]
37
38
        except Exception as e:
39
            #print(e)
40
            return None
41
42
    def score_sentence(self, sentence):
43
        """
44
        Sends a Sentence to the server for sentiment scoring
45
        Returns a single score
46
        """
47
        try:
48
            sentiment_scores = post_json(self._sentence_service, sentence.to_JSON())
49
            return sentiment_scores["scores"][0]
50
51
        except Exception as e:
52
            print(e)
53
            return None
54
55
    def score_segmented_text(self, sentences):
56
        """
57
        Sends segmented text to the server for sentiment scoring
58
        Returns a score for each sentence
59
        """
60
        try:
61
            msg = SentencesMessage(sentences)
62
            sentiment_scores = post_json(self._segmented_service, msg.to_JSON())
63
            return sentiment_scores["scores"]
64
65
        except Exception as e:
66
            #print(e)
67
            return None
68
69
    def score_text(self, text):
70
        """
71
        Sends text to the server for sentiment scoring
72
        Returns a list of scores (one for each sentence)
73
        """
74
        service = self._text_service
75
        try:
76
            msg = Message(text)
77
            sentiment_scores = post_json(self._text_service, msg.to_JSON())
78
            return sentiment_scores["scores"]
79
80
        except Exception as e:
81
            #print(e)
82
            return None
83
84
    def score(self, data):
85
        """
86
        Sniff out data type and to properly send to the server for sentiment scoring
87
        """
88
        if isinstance(data, six.text_type):
89
            return self.score_text(data)
90
        elif isinstance(data, Sentence):
91
            return self.score_sentence(data)
92
        elif isinstance(data, Document):
93
            return self.score_document(data)
94
        # a list of pre segmented sentences
95
        elif isinstance(data, list):
96
            return self.score_segmented_text(data)
97
        else:
98
            #print("Type of data: {}".format(type(data)))
99
            return None
100
101
102
class CoreNLPSentimentAnalyzer(SentimentAnalyzer):
103
    """
104
    Bridge to CoreNLP's tree-based sentiment analysis
105
    """
106
    def __init__(self, address):
107
        self._service = "{}/sentiment/corenlp/score".format(address)
108
        self._text_service = self._service
109
        self._segmented_service = "{}/segmented".format(self._service)
110
        self._sentence_service = self._service
111
        self._document_service = self._service
112