Aspect-based Sentiment Analysis
Collection
6 items
•
Updated
Fine-tuned from vinai/phobert-base on visolex/VLSP2018-ABSA-Hotel for joint aspect detection + sentiment classification (shared heads).
Model Details
vinai/phobert-basevisolex/VLSP2018-ABSA-HotelAspect Labels:
FACILITIES#CLEANLINESSFACILITIES#COMFORTFACILITIES#DESIGN&FEATURESFACILITIES#GENERALFACILITIES#MISCELLANEOUSFACILITIES#PRICESFACILITIES#QUALITYFOOD&DRINKS#MISCELLANEOUSFOOD&DRINKS#PRICESFOOD&DRINKS#QUALITYFOOD&DRINKS#STYLE&OPTIONSHOTEL#CLEANLINESSHOTEL#COMFORTHOTEL#DESIGN&FEATURESHOTEL#GENERALHOTEL#MISCELLANEOUSHOTEL#PRICESHOTEL#QUALITYLOCATION#GENERALROOMS#CLEANLINESSROOMS#COMFORTROOMS#DESIGN&FEATURESROOMS#GENERALROOMS#MISCELLANEOUSROOMS#PRICESROOMS#QUALITYROOM_AMENITIES#CLEANLINESSROOM_AMENITIES#COMFORTROOM_AMENITIES#DESIGN&FEATURESROOM_AMENITIES#GENERALROOM_AMENITIES#MISCELLANEOUSROOM_AMENITIES#PRICESROOM_AMENITIES#QUALITYSERVICE#GENERALSentiment Labels:
POSITIVENEGATIVENEUTRALHyperparameters
Usage
import torch
from transformers import AutoTokenizer, AutoModel
# Danh sách aspect và sentiment labels
aspect_labels = [
"FACILITIES#CLEANLINESS", "FACILITIES#COMFORT", "FACILITIES#DESIGN&FEATURES",
"FACILITIES#GENERAL", "FACILITIES#MISCELLANEOUS", "FACILITIES#PRICES",
"FACILITIES#QUALITY", "FOOD&DRINKS#MISCELLANEOUS", "FOOD&DRINKS#PRICES",
"FOOD&DRINKS#QUALITY", "FOOD&DRINKS#STYLE&OPTIONS", "HOTEL#CLEANLINESS",
"HOTEL#COMFORT", "HOTEL#DESIGN&FEATURES", "HOTEL#GENERAL",
"HOTEL#MISCELLANEOUS", "HOTEL#PRICES", "HOTEL#QUALITY", "LOCATION#GENERAL",
"ROOMS#CLEANLINESS", "ROOMS#COMFORT", "ROOMS#DESIGN&FEATURES",
"ROOMS#GENERAL", "ROOMS#MISCELLANEOUS", "ROOMS#PRICES", "ROOMS#QUALITY",
"ROOM_AMENITIES#CLEANLINESS", "ROOM_AMENITIES#COMFORT",
"ROOM_AMENITIES#DESIGN&FEATURES", "ROOM_AMENITIES#GENERAL",
"ROOM_AMENITIES#MISCELLANEOUS", "ROOM_AMENITIES#PRICES",
"ROOM_AMENITIES#QUALITY", "SERVICE#GENERAL"
]
sentiment_labels = ["POSITIVE", "NEGATIVE", "NEUTRAL"]
# Load tokenizer và model (phải về đúng class TransformerForABSA)
repo = "visolex/phobert-absa-hotel"
tokenizer = AutoTokenizer.from_pretrained(repo, trust_remote_code=True)
model = AutoModel.from_pretrained(repo, trust_remote_code=True)
model.eval()
def predict_absa_multi(
text: str,
aspect_labels: list[str],
sentiment_labels: list[str],
threshold: float = 0.5
) -> list[tuple[str,str]]:
inputs = tokenizer(
text,
return_tensors="pt",
padding=True,
truncation=True,
max_length=256
)
inputs.pop("token_type_ids", None)
with torch.no_grad():
out = model(**inputs)
# out.logits có shape [1, A, S+1]
logits = out.logits.squeeze(0)
probs = torch.softmax(logits, dim=-1)
num_s = len(sentiment_labels)
none_id = probs.size(-1) - 1
results = []
for i, asp in enumerate(aspect_labels):
prob_i = probs[i]
pred_id = int(prob_i.argmax().item())
if pred_id != none_id and pred_id < num_s:
score = prob_i[pred_id].item()
if score >= threshold:
results.append((asp, sentiment_labels[pred_id].lower()))
return results
# Example usage
text = "Khách sạn này sạch sẽ nhưng phòng lại hơi nhỏ và dịch vụ chưa tốt lắm."
preds = predict_absa_multi(text, aspect_labels, sentiment_labels, threshold=0.2)
print(preds)
# Expected output similar to: [('HOTEL#CLEANLINESS', 'positive'), ('ROOMS#COMFORT', 'negative'), ('SERVICE#GENERAL', 'negative')]
Base model
vinai/phobert-base