--- language: vi tags: - ner - sequence-labeling - bilstm-crf - pytorch - vietnamese - food-order - cs221 metrics: - f1 - precision - recall - accuracy --- # BiLSTM-CRF-FoodNER: Deep Sequence Labeling Baseline for Vietnamese Food Orders #### Table of contents 1. [Introduction](#introduction) 2. [Dataset Overview](#dataset) 3. [Entity Label Space](#labels) 4. [Empirical Evaluation](#evaluation) 5. [Architecture Characteristics](#characteristics) 6. [Using BiLSTM-CRF-FoodNER with PyTorch](#usage) 7. [Authors & Citation](#citation) --- ## 1. Introduction **`CS221DoAn/Do_an_group_BiLSTM_CRF`** is a deep learning model based on the **Bidirectional LSTM + Conditional Random Field (BiLSTM-CRF)** architecture. It is specifically trained for **Named Entity Recognition (NER)** on domain-specific Vietnamese unstructured text: **Online Food Delivery Orders and Messages**. In our research project for the CS221.Q21 course (Natural Language Processing), this model serves as a deep-learning sequence baseline. It was developed to overcome the limitations of traditional CRF (which relies heavily on manual feature engineering) by automating non-linear feature extraction through recurrent neural networks. ## 2. Dataset Overview The model was trained on a custom, manually annotated dataset consisting of **2,325 real-world food ordering messages** extracted from Facebook comments (specifically from Sơn Nguyễn vegetarian restaurant). * **Train Set:** 1,860 samples (80%) * **Validation Set:** 232 samples (10%) * **Test Set:** 233 samples (10%) ## 3. Entity Label Space The model utilizes the standard **BIO (Begin - Inside - Outside)** tagging scheme across **15 distinct entity labels**, mapping to **7 core information classes**: | Tag | Entity Class | Description | Examples | | :--- | :--- | :--- | :--- | | `B-FOOD`, `I-FOOD` | **FOOD** | Names of dishes, drinks, toppings | *cơm sườn, trà sữa, trân châu* | | `B-QUANTITY`, `I-QUANTITY` | **QUANTITY** | Portions, servings, item counts | *1p, 2 ly, một hộp, 3 suất* | | `B-NOTE`, `I-NOTE` | **NOTE** | Special requests, flavor modifications | *không, ít ngọt, nhiều* | | `B-PLACE`, `I-PLACE` | **PLACE** | Delivery location, addresses | *Ký túc xá khu A, tòa D6, rào b4* | | `B-PHONE`, `I-PHONE` | **PHONE** | Receiver's contact number | *0794987xxx, 0903123xxx* | | `B-TIME`, `I-TIME` | **TIME** | Expected/requested delivery time | *lúc 11h30, trưa nay, 18h* | | `B-PRICE`, `I-PRICE` | **PRICE** | Monetary cost, item prices | *35k, 40000, 25 ngàn* | | `O` | **OUTSIDE** | Non-entity words, syntax connecting words | *cho em, giao qua, với, ạ, nhé* | ## 4. Empirical Evaluation The model was evaluated on an unseen Test Set using strict **Entity-level F1-Scores** via the `seqeval` framework. * **BiLSTM-CRF Macro F1-Score:** `0.9771` * **Comparison:** While the BiLSTM-CRF automates feature extraction, it achieved the lowest Macro F1-score (0.9771) among our tested baselines (CRF: 0.9889, mBERT: 0.9880, PhoBERT: 0.9913). ## 5. Architecture Characteristics The data flows through 3 main layers in this architecture: 1. **Embedding Layer:** Converts numerical vocabulary identifiers into continuous mathematical vectors. 2. **BiLSTM Layer:** Processes the sequence in both directions (left-to-right and right-to-left). At each time step $t$, the hidden state is a concatenation of both directions: $h_{t}=[\vec{h}_{t};\vec{h_{t}}]$. 3. **CRF Layer:** Receives emission scores from the BiLSTM and applies a transition matrix to find the most valid sequence of tags via Viterbi Decoding. **Limitation:** Our analysis showed that BiLSTM-CRF suffers from *Information Decay* when dealing with long food orders where related entities are far apart (e.g., `QUANTITY` at the beginning and `FOOD` at the end). The Self-Attention mechanism in Transformer models (like PhoBERT) resolves this limitation efficiently. ## 6. Using BiLSTM-CRF-FoodNER with PyTorch Because this is a custom PyTorch model, you must define the model architecture class in your local environment before loading the `.pth` weights. ### Installation ```bash pip install torch huggingface_hub ``` ### Example usage (Inference Pipeline) > **⚠️ IMPORTANT:** You MUST replace the `BiLSTM_CRF` class placeholder below with the exact PyTorch class definition you used during the training phase. ```python import torch import torch.nn as nn from huggingface_hub import hf_hub_download # 1. DEFINE YOUR MODEL ARCHITECTURE (MUST MATCH TRAINING CODE) class BiLSTM_CRF(nn.Module): def __init__(self, vocab_size, tagset_size, embedding_dim, hidden_dim): super(BiLSTM_CRF, self).__init__() # --- PASTE YOUR ACTUAL PYTORCH INIT CODE HERE --- pass def forward(self, sentence): # --- PASTE YOUR ACTUAL FORWARD PASS HERE --- pass def decode(self, sentence): # --- PASTE YOUR VITERBI DECODING HERE --- pass # Initialize the model with your original hyperparameters # model = BiLSTM_CRF(vocab_size=..., tagset_size=15, embedding_dim=..., hidden_dim=...) # 2. DOWNLOAD AND LOAD WEIGHTS REPO_ID = "CS221DoAn/Do_an_group_BiLSTM_CRF" FILENAME = "bilstm_crf.pth" print("Downloading BiLSTM-CRF weights...") model_path = hf_hub_download(repo_id=REPO_ID, filename=FILENAME) # Load state dict # model.load_state_dict(torch.load(model_path, map_location=torch.device('cpu'))) # model.eval() print("Model loaded successfully! Ready for inference.") # 3. PREDICT (Replace with your actual text processing pipeline) def predict_food_order(raw_text): print(f"\nInput: {raw_text}") # 1. Preprocess & Tokenize text # 2. Convert to Tensor # 3. Pass through model.decode() # 4. Map ID to Label pass ``` ## 7. Authors & Citation This project was developed for the **Natural Language Processing (CS221.Q21)** course at the University of Information Technology (UIT) - VNU-HCM. * **Students:** Võ Thành Lộc (24520989), Nguyễn Anh Nguyên (24521185) * **Instructor:** Ph.D. Nguyễn Trọng Chỉnh * **Date:** July 2026 If you use this model in your academic research or projects, please cite our project: ```bibtex @misc{cs221_food_order_ner_bilstm_crf, author = {Vo Thanh Loc and Nguyen Anh Nguyen}, title = {Food Order Extraction: BiLSTM-CRF Baseline for Vietnamese NER}, year = {2026}, publisher = {Hugging Face}, howpublished = https://huggingface.co/CS221DoAn/Do_an_group_BiLSTM_CRF } ```