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-base
visolex/VLSP2018-ABSA-Hotel
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
Hyperparameters
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