|
import time |
|
import openai |
|
import random |
|
from transformers import pipeline |
|
|
|
|
|
class RandomAnalyser: |
|
def __init__(self): |
|
self.LABELS = ['negative', 'neutral', 'positive'] |
|
|
|
def predict(self, X: list): |
|
return [random.choice(self.LABELS) for x in X] |
|
|
|
|
|
class RoBERTaAnalyser: |
|
def __init__(self): |
|
self.analyser = pipeline(task="sentiment-analysis", model="Cloudy1225/stackoverflow-roberta-base-sentiment") |
|
|
|
def predict(self, X: list): |
|
sentiments = [] |
|
for x in X: |
|
x = RoBERTaAnalyser.preprocess(x) |
|
prediction = self.analyser(x) |
|
sentiments.append(prediction[0]['label']) |
|
return sentiments |
|
|
|
@staticmethod |
|
def preprocess(text): |
|
"""Preprocess text (username and link placeholders, remove line breaks)""" |
|
new_text = [] |
|
for t in text.split(' '): |
|
t = '@user' if t.startswith('@') and len(t) > 1 else t |
|
t = 'http' if t.startswith('http') else t |
|
new_text.append(t) |
|
return ' '.join(new_text).strip() |
|
|
|
|
|
class ChatGPTAnalyser: |
|
def __init__(self): |
|
|
|
|
|
|
|
self.MODEL = "gpt-3.5-turbo" |
|
self.KEYs = [ |
|
"key1", |
|
"key2", |
|
] |
|
self.TASK_NAME = 'Sentiment Classification' |
|
self.TASK_DEFINITION = 'Given the sentence, assign a sentiment label from [negative, neutral, positive].' |
|
self.OUT_FORMAT = 'Return label only without any other text.' |
|
self.PROMPT_PREFIX = f"Please perform {self.TASK_NAME} task.{self.TASK_DEFINITION}{self.OUT_FORMAT}\nSentence:\n{{}}\nLabel:" |
|
|
|
def predict(self, X: list): |
|
sentiments = [] |
|
for i in range(len(X)): |
|
prompt = self.PROMPT_PREFIX.format(X[i]) |
|
messages = [{"role": "user", "content": prompt}] |
|
|
|
openai.api_key = random.choice(self.KEYs) |
|
while True: |
|
try: |
|
response = openai.ChatCompletion.create( |
|
model=self.MODEL, |
|
messages=messages, |
|
temperature=0, |
|
n=1, |
|
stop=None |
|
) |
|
sentiment = response.choices[0].message.content |
|
sentiments.append(sentiment.strip().lower()) |
|
break |
|
except openai.RateLimitError: |
|
sleep_snds = 60 |
|
time.sleep(sleep_snds) |
|
continue |
|
except openai.APIError: |
|
sleep_snds = 60 |
|
time.sleep(sleep_snds) |
|
continue |
|
return sentiments |