Tanor commited on
Commit
f5e9dbc
·
1 Parent(s): 016174a

Add pipeline file

Browse files
Files changed (1) hide show
  1. sentiwordnet_calculator.py +64 -0
sentiwordnet_calculator.py ADDED
@@ -0,0 +1,64 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from transformers import pipeline
2
+
3
+ class SentimentPipeline:
4
+ """
5
+ This class defines a custom sentiment analysis pipeline using Hugging Face's Transformers.
6
+
7
+ The pipeline uses two separate models for predicting positive/non-positive and
8
+ negative/non-negative sentiment respectively.
9
+
10
+ Inputs:
11
+ Single text string or a list of text strings for sentiment analysis.
12
+
13
+ Returns:
14
+ If a single text string is provided, a single dictionary is returned with POS, NEG, and OBJ scores.
15
+ If a list of text strings is provided, a list of dictionaries is returned with each dictionary
16
+ representing POS, NEG, and OBJ scores for the corresponding text.
17
+
18
+ Usage:
19
+ sentiment_pipeline = SentimentPipeline(YOUR_POS_MODEL, YOUR_NEG_MODEL)
20
+ result = sentiment_pipeline("Your glossed text here")
21
+ results = sentiment_pipeline(["Your first glossed text here", "Your second glossed text here"])
22
+ """
23
+
24
+ def __init__(self, model_path_positive, model_path_negative):
25
+ """
26
+ Constructor for the SentimentPipeline class.
27
+ Initializes two pipelines using Hugging Face's Transformers, one for positive and one for negative sentiment.
28
+ """
29
+ self.pos_pipeline = pipeline('text-classification', model=model_path_positive)
30
+ self.neg_pipeline = pipeline('text-classification', model=model_path_negative)
31
+
32
+ def __call__(self, texts):
33
+ """
34
+ Callable method for the SentimentPipeline class. Processes the given text(s) and returns sentiment scores.
35
+ """
36
+
37
+ # Check if input is a single string. If it is, convert it into a list.
38
+ if isinstance(texts, str):
39
+ texts = [texts]
40
+
41
+ results = []
42
+ for text in texts:
43
+ # Run the text through the pipelines
44
+ pos_result = self.pos_pipeline(text)[0]
45
+ neg_result = self.neg_pipeline(text)[0]
46
+
47
+ # Calculate probabilities for positive/non-positive and negative/non-negative.
48
+ # If the label is POSITIVE/NEGATIVE, the score for positive/negative is the score returned by the model,
49
+ # and the score for non-positive/non-negative is 1 - the score returned by the model.
50
+ # If the label is NON-POSITIVE/NON-NEGATIVE, the score for non-positive/non-negative is the score returned by the model,
51
+ # and the score for positive/negative is 1 - the score returned by the model.
52
+ Pt, Pn = (pos_result['score'], 1 - pos_result['score']) if pos_result['label'] == 'POSITIVE' else (1 - pos_result['score'], pos_result['score'])
53
+ Nt, Nn = (neg_result['score'], 1 - neg_result['score']) if neg_result['label'] == 'NEGATIVE' else (1 - neg_result['score'], neg_result['score'])
54
+
55
+ # Calculate POS, NEG, OBJ scores using the formulas provided
56
+ POS = Pt * Nn
57
+ NEG = Nt * Pn
58
+ OBJ = 1 - POS - NEG
59
+
60
+ # Append the scores to the results
61
+ results.append({"POS": POS, "NEG": NEG, "OBJ": OBJ})
62
+
63
+ # If the input was a single string, return a single dictionary. Otherwise, return a list of dictionaries.
64
+ return results if len(results) > 1 else results[0]