Views
No views yet
323e-51002560.015000.87950.16580.35510.28490.11691import torch
2from transformers import AutoTokenizer, AutoModel
3
4# Load model and tokenizer
5repo = "visolex/textcnn-absa-hotel"
6tokenizer = AutoTokenizer.from_pretrained(repo, trust_remote_code=True)
7model = AutoModel.from_pretrained(repo, trust_remote_code=True)
8model.eval()
9
10# Aspect labels for VLSP2018-ABSA-Hotel
11aspect_labels = [
12 "FACILITIES#CLEANLINESS",
13 "FACILITIES#COMFORT",
14 "FACILITIES#DESIGN&FEATURES",
15 "FACILITIES#GENERAL",
16 "FACILITIES#MISCELLANEOUS",
17 "FACILITIES#PRICES",
18 "FACILITIES#QUALITY",
19 "FOOD&DRINKS#MISCELLANEOUS",
20 "FOOD&DRINKS#PRICES",
21 "FOOD&DRINKS#QUALITY",
22 "FOOD&DRINKS#STYLE&OPTIONS",
23 "HOTEL#CLEANLINESS",
24 "HOTEL#COMFORT",
25 "HOTEL#DESIGN&FEATURES",
26 "HOTEL#GENERAL",
27 "HOTEL#MISCELLANEOUS",
28 "HOTEL#PRICES",
29 "HOTEL#QUALITY",
30 "LOCATION#GENERAL",
31 "ROOMS#CLEANLINESS",
32 "ROOMS#COMFORT",
33 "ROOMS#DESIGN&FEATURES",
34 "ROOMS#GENERAL",
35 "ROOMS#MISCELLANEOUS",
36 "ROOMS#PRICES",
37 "ROOMS#QUALITY",
38 "ROOM_AMENITIES#CLEANLINESS",
39 "ROOM_AMENITIES#COMFORT",
40 "ROOM_AMENITIES#DESIGN&FEATURES",
41 "ROOM_AMENITIES#GENERAL",
42 "ROOM_AMENITIES#MISCELLANEOUS",
43 "ROOM_AMENITIES#PRICES",
44 "ROOM_AMENITIES#QUALITY",
45 "SERVICE#GENERAL"
46]
47
48# Sentiment labels
49sentiment_labels = ["POSITIVE", "NEGATIVE", "NEUTRAL"]
50
51# Example review text
52text = "Khách sạn rất sạch sẽ, phòng ốc thoải mái nhưng giá hơi cao."
53
54# Tokenize
55inputs = tokenizer(
56 text,
57 return_tensors="pt",
58 padding=True,
59 truncation=True,
60 max_length=256
61)
62inputs.pop("token_type_ids", None)
63
64# Predict
65with torch.no_grad():
66 outputs = model(**inputs)
67
68# Get logits: shape [1, num_aspects, num_sentiments + 1]
69logits = outputs.logits.squeeze(0) # [num_aspects, num_sentiments + 1]
70probs = torch.softmax(logits, dim=-1)
71
72# Predict for each aspect
73none_id = probs.size(-1) - 1 # Index of "none" class
74results = []
75
76for i, aspect in enumerate(aspect_labels):
77 prob_i = probs[i]
78 pred_id = int(prob_i.argmax().item())
79
80 if pred_id != none_id and pred_id < len(sentiment_labels):
81 score = prob_i[pred_id].item()
82 if score >= 0.5: # threshold
83 results.append((aspect, sentiment_labels[pred_id].lower()))
84
85print(f"Text: {text}")
86print(f"Predicted aspects: {results}")
87# Output example: [('aspects', 'positive'), ('aspects', 'positive'), ('aspects', 'negative')]1@misc{visolex_absa_textcnn_absa_hotel,
2 title={TextCNN for Vietnamese ABSA for Vietnamese Aspect-based Sentiment Analysis},
3 author={ViSoLex Team},
4 year={2025},
5 url={https://huggingface.co/visolex/textcnn-absa-hotel}
6}