File size: 2,422 Bytes
cd85011
 
 
2debc3e
cd85011
 
 
 
 
 
2debc3e
 
 
cd85011
 
 
 
 
 
 
 
 
 
2debc3e
cd85011
2debc3e
cd85011
2debc3e
cd85011
08d98c4
2debc3e
 
08d98c4
cd85011
 
 
 
2debc3e
cd85011
2debc3e
cd85011
2debc3e
cd85011
2debc3e
 
cd85011
 
 
 
2debc3e
11fa374
2debc3e
cd85011
 
 
2debc3e
cd85011
2debc3e
cd85011
2debc3e
 
cd85011
2debc3e
 
cd85011
2debc3e
 
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
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