File size: 2,998 Bytes
136a2c7 | 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 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 | from flask import Flask, request, jsonify
from transformers import AutoTokenizer, AutoModelForSequenceClassification
import torch
import os
# Flask 앱 초기화
app = Flask(__name__)
# Load the BERTweet model and tokenizer
tokenizer = AutoTokenizer.from_pretrained("finiteautomata/bertweet-base-sentiment-analysis")
model = AutoModelForSequenceClassification.from_pretrained("finiteautomata/bertweet-base-sentiment-analysis")
LABELS = ['Negative', 'Neutral', 'Positive']
def analyze_sentiment(text):
# Converts text into tokens that the model can process
# return_tensors="pt": Returns PyTorch tensors
# truncation=True: Cuts text if it's too long
# padding=True: Adds padding to make sequences uniform length
inputs = tokenizer(text, return_tensors="pt", truncation=True, padding=True)
# Predict with the model
# Passes tokenized input through the model
# Extracts logits (raw prediction scores) from model output
outputs = model(**inputs)
logits = outputs.logits
# Sentiment Classification:
# torch.argmax(): Finds index of highest score 가장 높은 값의 인덱스를 추출하여 감성 레이블을 선택
# Maps this index to a sentiment label using LABELS dictionary
# dim=1: Operates along rows, .item(): Converts tensor to Python scalar
predicted_class = torch.argmax(logits, dim=1).item()
sentiment = LABELS[predicted_class]
return sentiment
# API endpoint to analyze a text
@app.route('/analyze', methods=['POST'])
def analyze():
data = request.get_json()
if 'text' not in data:
return jsonify({'error': 'No text provided'}), 400
# call 감성 분석 function for 입력 텍스트
text = data['text']
sentiment = analyze_sentiment(text)
return jsonify({'text': text, 'sentiment': sentiment})
# API endpoint to analyze a list of texts
@app.route('/analyze_texts', methods=['POST'])
def analyze_texts():
data = request.get_json()
if 'texts' not in data:
return jsonify({'error': 'No texts provided'}), 400
# Perform analysis on each text in the list, process each one, and return a list of sentiment responses
texts = data['texts']
results = [{'text': text, 'sentiment': analyze_sentiment(text)} for text in texts]
# Count negative sentiments
negative_count = sum(1 for result in results if result['sentiment'] == 'Negative')
# Determine if it's a risk (more than half are negative)
risk = negative_count > (len(texts) / 2)
# Return the results as a JSON response
# return jsonify(results)
# Return the results and risk status as a JSON response
return jsonify({
'results': results,
'Negative Sentiment?': risk
})
# run
if __name__ == '__main__':
# 환경 변수 PORT를 우선 사용, 없으면 기본값 5000 사용
#port = int(os.getenv('PORT', 5001))
app.run(host='0.0.0.0', port=7860)
|