import numpy as np import torch from model.load_model import tokenizer, bert_model # Lexicon แบบง่าย custom_words = { "อร่อยมาก", "ให้เยอะมาก", "รสชาติดี", "รสชาติเยี่ยม", "อร่อยเด็ด", "อร่อยเว่อร์", "อร่อยสุดๆ", "คุ้มค่า", "คุ้มราคามาก", "ถูกและดี", "ราคาดี", "คุณภาพดี", "คุ้มสุดๆ", "ถูกมาก", "บริการดี", "บริการเยี่ยม", "บริการเป็นกันเอง", "พนักงานน่ารัก", "พนักงานเป็นกันเอง", "สะอาดมาก", "ร้านสะอาด", "บรรยากาศดี", "นั่งสบาย", "เหมาะกับครอบครัว", "เหมาะกับเพื่อน", "อาหารสด", "สดใหม่", "คุณภาพเยี่ยม", "ชิ้นใหญ่", "เนื้อนุ่ม", "หอมมาก", "กลิ่นหอม", "ฟินสุดๆ", "ห้ามพลาด", "ต้องลอง", "ประทับใจมาก", "ไม่อร่อย", "รสชาติแย่", "รสชาติไม่ดี", "รสชาติเผ็ดเกินไป", "รสชาติหวานไป", "รสชาติไม่ถูกปาก", "แพงเกินไป", "ไม่คุ้มค่า", "ราคาแพง", "แพงเว่อร์", "ไม่คุ้มราคา", "ถูกแต่ไม่ดี", "บริการแย่", "พนักงานหงุดหงิด", "พนักงานพูดไม่ดี", "พนักงานช้า", "พนักงานหน้าบึ้ง", "ร้านสกปรก", "อาหารเก่า", "อาหารเหม็น", "อาหารไม่สด", "ชิ้นเล็ก", "เนื้อเหนียว", "เค็มไป", "หวานไป", "มันไป", "จืดสนิท", "รอนาน", "รอนานมาก", "เสิร์ฟช้า", "ผิดหวัง", "ไม่เหมือนรีวิว", "ไม่สมราคา", "ห่วยแตก", "อย่ามา", "แย่มาก" } positive = {word for word in custom_words if word not in { "ไม่อร่อย", "รสชาติแย่", "รสชาติไม่ดี", "รสชาติเผ็ดเกินไป", "รสชาติหวานไป", "รสชาติไม่ถูกปาก", "แพงเกินไป", "ไม่คุ้มค่า", "ราคาแพง", "แพงเว่อร์", "ไม่คุ้มราคา", "ถูกแต่ไม่ดี", "บริการแย่", "พนักงานหงุดหงิด", "พนักงานพูดไม่ดี", "พนักงานช้า", "พนักงานหน้าบึ้ง", "ร้านสกปรก", "อาหารเก่า", "อาหารเหม็น", "อาหารไม่สด", "ชิ้นเล็ก", "เนื้อเหนียว", "เค็มไป", "หวานไป", "มันไป", "จืดสนิท", "รอนาน", "รอนานมาก", "เสิร์ฟช้า", "ผิดหวัง", "ไม่เหมือนรีวิว", "ไม่สมราคา", "ห่วยแตก", "อย่ามา", "แย่มาก" }} def get_sentiment_score(text): return sum(1 if w in positive else -1 if w in custom_words else 0 for w in text.split()) def get_bert_features(text): inputs = tokenizer(text, return_tensors="pt", truncation=True, padding=True, max_length=512) with torch.no_grad(): outputs = bert_model(**inputs) bert_embedding = outputs.last_hidden_state[:, 0, :].cpu().numpy() sentiment_score = np.array([[get_sentiment_score(text)]]) return np.concatenate([bert_embedding, sentiment_score], axis=1)