Spaces:
Runtime error
Runtime error
from transformers import pipeline | |
class SentimentPipeline: | |
""" | |
This class defines a custom sentiment analysis pipeline using Hugging Face's Transformers. | |
The pipeline uses two separate models for predicting positive/non-positive and | |
negative/non-negative sentiment respectively. | |
Inputs: | |
Single text string or a list of text strings for sentiment analysis. | |
Returns: | |
If a single text string is provided, a single dictionary is returned with POS, NEG, and OBJ scores. | |
If a list of text strings is provided, a list of dictionaries is returned with each dictionary | |
representing POS, NEG, and OBJ scores for the corresponding text. | |
Usage: | |
sentiment_pipeline = SentimentPipeline(YOUR_POS_MODEL, YOUR_NEG_MODEL) | |
result = sentiment_pipeline("Your glossed text here") | |
results = sentiment_pipeline(["Your first glossed text here", "Your second glossed text here"]) | |
""" | |
def __init__(self, model_path_positive, model_path_negative): | |
""" | |
Constructor for the SentimentPipeline class. | |
Initializes two pipelines using Hugging Face's Transformers, one for positive and one for negative sentiment. | |
""" | |
self.pos_pipeline = pipeline('text-classification', model=model_path_positive) | |
self.neg_pipeline = pipeline('text-classification', model=model_path_negative) | |
def __call__(self, texts): | |
""" | |
Callable method for the SentimentPipeline class. Processes the given text(s) and returns sentiment scores. | |
""" | |
# Check if input is a single string. If it is, convert it into a list. | |
if isinstance(texts, str): | |
texts = [texts] | |
results = [] | |
for text in texts: | |
# Run the text through the pipelines | |
pos_result = self.pos_pipeline(text)[0] | |
neg_result = self.neg_pipeline(text)[0] | |
# Calculate probabilities for positive/non-positive and negative/non-negative. | |
# If the label is POSITIVE/NEGATIVE, the score for positive/negative is the score returned by the model, | |
# and the score for non-positive/non-negative is 1 - the score returned by the model. | |
# If the label is NON-POSITIVE/NON-NEGATIVE, the score for non-positive/non-negative is the score returned by the model, | |
# and the score for positive/negative is 1 - the score returned by the model. | |
Pt, Pn = (pos_result['score'], 1 - pos_result['score']) if pos_result['label'] == 'POSITIVE' else (1 - pos_result['score'], pos_result['score']) | |
Nt, Nn = (neg_result['score'], 1 - neg_result['score']) if neg_result['label'] == 'NEGATIVE' else (1 - neg_result['score'], neg_result['score']) | |
# Calculate POS, NEG, OBJ scores using the formulas provided | |
POS = Pt * Nn | |
NEG = Nt * Pn | |
OBJ = 1 - POS - NEG | |
# Append the scores to the results | |
results.append({"POS": POS, "NEG": NEG, "OBJ": OBJ}) | |
# If the input was a single string, return a single dictionary. Otherwise, return a list of dictionaries. | |
return results if len(results) > 1 else results[0] | |