File size: 2,429 Bytes
4b75840
 
 
 
 
 
e99a699
a00f9ba
 
620af8b
 
59fcc9f
 
 
620af8b
 
7b8b2a7
4b75840
 
 
 
 
 
620af8b
a00f9ba
620af8b
 
a00f9ba
620af8b
 
a00f9ba
620af8b
4b75840
 
 
 
 
 
 
620af8b
a00f9ba
620af8b
 
a00f9ba
620af8b
 
a00f9ba
620af8b
4b75840
 
 
 
 
 
 
 
 
 
 
620af8b
a00f9ba
620af8b
 
a00f9ba
620af8b
 
a00f9ba
 
620af8b
4b75840
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
from transformers import AutoTokenizer, AutoModelForSequenceClassification
from transformers_interpret import SequenceClassificationExplainer
import torch
import pandas as pd


class EmotionDetection:
    """
    Emotion Detection on text data.

    Attributes:
        tokenizer: An instance of Hugging Face Tokenizer
        model: An instance of Hugging Face Model
        explainer: An instance of SequenceClassificationExplainer from Transformers interpret
    """

    def __init__(self):
        hub_location = 'cardiffnlp/twitter-roberta-base-emotion'
        self.tokenizer = AutoTokenizer.from_pretrained(hub_location)
        self.model = AutoModelForSequenceClassification.from_pretrained(hub_location)
        self.explainer = SequenceClassificationExplainer(self.model, self.tokenizer)

    def justify(self, text):
        """
        Get html annotation for displaying emotion justification over text.

        Parameters:
            text (str): The user input string to emotion justification

        Returns:
            html (hmtl): html object for plotting emotion prediction justification
        """

        word_attributions = self.explainer(text)
        html = self.explainer.visualize("example.html")

        return html

    def classify(self, text):
        """
        Recognize Emotion in text.

        Parameters:
            text (str): The user input string to perform emotion classification on

        Returns:
            predictions (str): The predicted probabilities for emotion classes
        """

        tokens = self.tokenizer.encode_plus(text, add_special_tokens=False, return_tensors='pt')
        outputs = self.model(**tokens)
        probs = torch.nn.functional.softmax(outputs[0], dim=-1)
        probs = probs.mean(dim=0).detach().numpy()
        labels = list(self.model.config.id2label.values())
        preds = pd.Series(probs, index=labels, name='Predicted Probability')

        return preds

    def run(self, text):
        """
        Classify and Justify Emotion in text.

        Parameters:
            text (str): The user input string to perform emotion classification on

        Returns:
            predictions (str): The predicted probabilities for emotion classes
            html (hmtl): html object for plotting emotion prediction justification
        """

        preds = self.classify(text)
        html = self.justify(text)

        return preds, html