| --- |
| license: apache-2.0 |
| base_model: textcnn |
| tags: |
| - vietnamese |
| - aspect-based-sentiment-analysis |
| - VLSP-ABSA |
| datasets: |
| - visolex/VLSP2018-ABSA-Restaurant |
| metrics: |
| - accuracy |
| - macro-f1 |
| model-index: |
| - name: textcnn-absa-restaurant |
| results: |
| - task: |
| type: text-classification |
| name: Aspect-based Sentiment Analysis |
| dataset: |
| name: VLSP2018-ABSA-Restaurant |
| type: VLSP-ABSA |
| metrics: |
| - type: accuracy |
| value: 0.8236 |
| - type: macro-f1 |
| value: 0.2332 |
| - type: macro_precision |
| value: 0.4583 |
| - type: macro_recall |
| value: 0.1918 |
| --- |
| |
| # textcnn-absa-restaurant: Aspect-based Sentiment Analysis for Vietnamese Reviews |
|
|
| This model is a fine-tuned version of [textcnn](https://huggingface.co/textcnn) |
| on the **VLSP2018-ABSA-Restaurant** dataset for aspect-based sentiment analysis in Vietnamese reviews. |
|
|
| ## Model Details |
|
|
| * **Base Model**: textcnn |
| * **Description**: TextCNN for Vietnamese ABSA |
| * **Dataset**: VLSP2018-ABSA-Restaurant |
| * **Fine-tuning Framework**: HuggingFace Transformers |
| * **Task**: Aspect-based Sentiment Classification (3 classes) |
|
|
| ### Hyperparameters |
|
|
| * Batch size: `32` |
| * Learning rate: `3e-5` |
| * Epochs: `100` |
| * Max sequence length: `256` |
| * Weight decay: `0.01` |
| * Warmup steps: `500` |
| * Optimizer: AdamW |
|
|
| ## Dataset |
|
|
| Model was trained on **VLSP2018 ABSA Restaurant dataset** for aspect-based sentiment analysis. |
|
|
| ### Sentiment Labels: |
|
|
| * **0 - Negative** (Tiêu cực): Negative opinions |
| * **1 - Neutral** (Trung lập): Neutral, objective opinions |
| * **2 - Positive** (Tích cực): Positive opinions |
|
|
| ### Aspect Categories: |
|
|
| Model được train để phân tích sentiment cho các aspects sau: |
|
|
| - **AMBIENCE#GENERAL** |
| - **DRINKS#PRICES** |
| - **DRINKS#QUALITY** |
| - **DRINKS#STYLE&OPTIONS** |
| - **FOOD#PRICES** |
| - **FOOD#QUALITY** |
| - **FOOD#STYLE&OPTIONS** |
| - **LOCATION#GENERAL** |
| - **RESTAURANT#GENERAL** |
| - **RESTAURANT#MISCELLANEOUS** |
| - **RESTAURANT#PRICES** |
| - **SERVICE#GENERAL** |
|
|
| ## Evaluation Results |
|
|
| The model was evaluated on test set with the following metrics: |
|
|
| * **Accuracy**: `0.8236` |
| * **Macro-F1**: `0.2332` |
| * **Weighted-F1**: `0.5063` |
| * **Macro-Precision**: `0.4583` |
| * **Macro-Recall**: `0.1918` |
|
|
| ## Usage Example |
|
|
| ```python |
| import torch |
| from transformers import AutoTokenizer, AutoModel |
| |
| # Load model and tokenizer |
| repo = "visolex/textcnn-absa-restaurant" |
| tokenizer = AutoTokenizer.from_pretrained(repo, trust_remote_code=True) |
| model = AutoModel.from_pretrained(repo, trust_remote_code=True) |
| model.eval() |
| |
| # Aspect labels for VLSP2018-ABSA-Restaurant |
| aspect_labels = [ |
| "AMBIENCE#GENERAL", |
| "DRINKS#PRICES", |
| "DRINKS#QUALITY", |
| "DRINKS#STYLE&OPTIONS", |
| "FOOD#PRICES", |
| "FOOD#QUALITY", |
| "FOOD#STYLE&OPTIONS", |
| "LOCATION#GENERAL", |
| "RESTAURANT#GENERAL", |
| "RESTAURANT#MISCELLANEOUS", |
| "RESTAURANT#PRICES", |
| "SERVICE#GENERAL" |
| ] |
| |
| # Sentiment labels |
| sentiment_labels = ["POSITIVE", "NEGATIVE", "NEUTRAL"] |
| |
| # Example review text |
| text = "Nhà hàng có không gian đẹp, đồ ăn ngon nhưng giá hơi đắt." |
| |
| # Tokenize |
| inputs = tokenizer( |
| text, |
| return_tensors="pt", |
| padding=True, |
| truncation=True, |
| max_length=256 |
| ) |
| inputs.pop("token_type_ids", None) |
| |
| # Predict |
| with torch.no_grad(): |
| outputs = model(**inputs) |
| |
| # Get logits: shape [1, num_aspects, num_sentiments + 1] |
| logits = outputs.logits.squeeze(0) # [num_aspects, num_sentiments + 1] |
| probs = torch.softmax(logits, dim=-1) |
| |
| # Predict for each aspect |
| none_id = probs.size(-1) - 1 # Index of "none" class |
| results = [] |
| |
| for i, aspect in enumerate(aspect_labels): |
| prob_i = probs[i] |
| pred_id = int(prob_i.argmax().item()) |
| |
| if pred_id != none_id and pred_id < len(sentiment_labels): |
| score = prob_i[pred_id].item() |
| if score >= 0.5: # threshold |
| results.append((aspect, sentiment_labels[pred_id].lower())) |
| |
| print(f"Text: {text}") |
| print(f"Predicted aspects: {results}") |
| # Output example: [('aspects', 'positive'), ('aspects', 'positive'), ('aspects', 'negative')] |
| ``` |
|
|
| ## Citation |
|
|
| If you use this model, please cite: |
|
|
| ```bibtex |
| @misc{visolex_absa_textcnn_absa_restaurant, |
| title={TextCNN for Vietnamese ABSA for Vietnamese Aspect-based Sentiment Analysis}, |
| author={ViSoLex Team}, |
| year={2025}, |
| url={https://huggingface.co/visolex/textcnn-absa-restaurant} |
| } |
| ``` |
|
|
| ## License |
|
|
| This model is released under the Apache-2.0 license. |
|
|
| ## Acknowledgments |
|
|
| * Base model: [textcnn](https://huggingface.co/textcnn) |
| * Dataset: VLSP2018-ABSA-Restaurant |
| * ViSoLex Toolkit |
|
|
| --- |
|
|