POSNEGPRETRAINED / inference.py
chaosbringerc's picture
Create inference.py
8ecde07 verified
Raw
History Blame Contribute Delete
4.29 kB
#!/usr/bin/env python3
"""
Inference script for POSNEG sentiment classification model
"""
import torch
from transformers import AutoTokenizer, AutoModelForSequenceClassification
import argparse
import json
class POSNEGInference:
def __init__(self, model_path):
"""
Initialize the POSNEG sentiment classifier
Args:
model_path (str): Path to the trained model
"""
self.device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
# Load tokenizer and model
self.tokenizer = AutoTokenizer.from_pretrained(model_path)
self.model = AutoModelForSequenceClassification.from_pretrained(model_path)
self.model.to(self.device)
self.model.eval()
# Label mapping
self.id2label = {0: "NEGATIVE", 1: "POSITIVE"}
self.label2id = {"NEGATIVE": 0, "POSITIVE": 1}
def predict(self, text, return_probabilities=False):
"""
Predict sentiment for given text
Args:
text (str): Input text to classify
return_probabilities (bool): Whether to return class probabilities
Returns:
dict: Prediction results
"""
# Tokenize input
inputs = self.tokenizer(
text,
return_tensors="pt",
truncation=True,
padding=True,
max_length=512
)
# Move to device
inputs = {k: v.to(self.device) for k, v in inputs.items()}
# Get predictions
with torch.no_grad():
outputs = self.model(**inputs)
logits = outputs.logits
probabilities = torch.nn.functional.softmax(logits, dim=-1)
predicted_class = torch.argmax(logits, dim=-1).item()
result = {
'text': text,
'predicted_label': self.id2label[predicted_class],
'predicted_class': predicted_class,
'confidence': probabilities[0][predicted_class].item()
}
if return_probabilities:
result['probabilities'] = {
'NEGATIVE': probabilities[0][0].item(),
'POSITIVE': probabilities[0][1].item()
}
return result
def predict_batch(self, texts, return_probabilities=False):
"""
Predict sentiment for multiple texts
Args:
texts (list): List of input texts
return_probabilities (bool): Whether to return class probabilities
Returns:
list: List of prediction results
"""
results = []
for text in texts:
result = self.predict(text, return_probabilities)
results.append(result)
return results
def main():
parser = argparse.ArgumentParser(description='POSNEG Sentiment Classification Inference')
parser.add_argument('--model_path', type=str, required=True, help='Path to the trained model')
parser.add_argument('--text', type=str, help='Single text to classify')
parser.add_argument('--input_file', type=str, help='JSON file with texts to classify')
parser.add_argument('--output_file', type=str, help='Output file for results')
parser.add_argument('--probabilities', action='store_true', help='Include class probabilities')
args = parser.parse_args()
# Initialize classifier
classifier = POSNEGInference(args.model_path)
if args.text:
# Single text prediction
result = classifier.predict(args.text, args.probabilities)
print(json.dumps(result, indent=2))
elif args.input_file:
# Batch prediction
with open(args.input_file, 'r') as f:
data = json.load(f)
texts = data if isinstance(data, list) else data['texts']
results = classifier.predict_batch(texts, args.probabilities)
if args.output_file:
with open(args.output_file, 'w') as f:
json.dump(results, f, indent=2)
else:
print(json.dumps(results, indent=2))
else:
print("Please provide either --text or --input_file argument")
if __name__ == "__main__":
main()