BERT ๊ธฐ๋ฐ Intent Classification + NER์ ํ์ฉํ ๋ ์คํ ๋ ์๋ ์๋ต ์์คํ
๊ณ ๊ฐ ๋ฌธ์๋ฅผ ์ค์๊ฐ์ผ๋ก ์ดํดํ๊ณ , ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ธฐ๋ฐ ์ ํํ ์๋ต์ ์์ฑํ๋ End-to-End ์ฑ๋ด ์๋ฃจ์
๋ ์คํ ๋์ด๋ ์นดํ์ ๊ฐ์ ์๋น์ค ์ ์ข ์์ ๊ณ ๊ฐ ๋ฌธ์๋ ๋ฐ๋ณต์ ์ด๊ณ ์ ์ฌํ ํจํด์ ๋ณด์ ๋๋ค. ๋ฉ๋ด ์๋ด, ์์ ์๊ฐ, ๊ฒฐ์ ๋ฐฉ๋ฒ, ์์ฝ ๋ฑ์ ๋ฌธ์๋ฅผ ์๋ํํ์ฌ 24/7 ๊ณ ๊ฐ ์๋๋ฅผ ๊ฐ๋ฅํ๊ฒ ํ๊ณ , ์ง์์ ์ ๋ฌด ๋ถ๋ด์ ์ค์ด๋ ๊ฒ์ด ๋ณธ ํ๋ก์ ํธ์ ๋ชฉํ์ ๋๋ค.
Intent Classification: 48๊ฐ์ง ์ธ๋ถํ๋ ์๋ ๋ถ๋ฅ
Named Entity Recognition (NER): 6๊ฐ์ง ์ํฐํฐ ์ธ์
B-MENU/I-MENU: ๋ฉ๋ด๋ช
์ถ์ถB-PAYMENT/I-PAYMENT: ๊ฒฐ์ ์๋จB-DAY: ์์ผ ์ ๋ณดO: ๊ธฐํ ํ ํฐโโโโโโโโโโโโโโโโโโโ
โ User Input โ (์์ฑ/ํ
์คํธ)
โโโโโโโโโโฌโโโโโโโโโ
โ
โโโโโโผโโโโโ
โ Flask โ Web Server
โ Server โ (Port: 5007)
โโโโโโฌโโโโโ
โ
โโโโโโผโโโโโโโโโโโโโโโโโ
โ Intent Classifier โ (KLUE/RoBERTa-Large)
โ (48 classes) โ
โโโโโโฌโโโโโโโโโโโโโโโโโ
โ
โโโโโโผโโโโโโโโโโโโโโ
โ NER Model โ (KLUE/RoBERTa-Large)
โ (6 entity tags) โ
โโโโโโฌโโโโโโโโโโโโโโ
โ
โโโโโโผโโโโโโโโโโโโโโโโโโโ
โ Hybrid Search Engine โ
โ (BM25 + Sentence-BERT)โ
โโโโโโฌโโโโโโโโโโโโโโโโโโโ
โ
โโโโโโผโโโโโโโโโโโโ
โ SQL Database โ
โ Query โ
โโโโโโฌโโโโโโโโโโโโ
โ
โโโโโโผโโโโโโโโโโโโโโโโโ
โ Response Generator โ
โ (Template-based) โ
โโโโโโฌโโโโโโโโโโโโโโโโโ
โ
โโโโโโผโโโโโโ
โ Output โ (์์ฑ/ํ
์คํธ)
โโโโโโโโโโโโ
Beaver_ARS/
โ
โโโ ๐ README.md # ํ๋ก์ ํธ ๋ฌธ์ (๋ณธ ํ์ผ)
โโโ ๐ requirements.txt # ์์กด์ฑ ํจํค์ง
โโโ ๐ .gitignore # Git ์ ์ธ ํ์ผ
โ
โโโ ๐ 241215_BERT/ # Intent Classification ๋ชจ๋
โ โโโ 241215_step0_intent_mapping.py # ์๋ ๋ผ๋ฒจ ๋งคํ
โ โโโ 241215_step1_train_cls_intent.py # Intent ๋ถ๋ฅ ๋ชจ๋ธ ํ์ต
โ โโโ 241215_step1_inference_cls_intent.py # ์ถ๋ก
โ โโโ 241215_step1_evaluation_cls_intent.py # ํ๊ฐ
โ โโโ 241215_step2_response_template.py # ์๋ต ํ
ํ๋ฆฟ ์ค๊ณ
โ โโโ 241215_step3_web_server_main.py # Flask ์น ์๋ฒ
โ โโโ data/ # ํ์ต ๋ฐ์ดํฐ
โ โ โโโ user_intent_v*.csv # Intent ๋ฐ์ดํฐ์
(๋ฒ์ ๋ณ)
โ โ โโโ intent_v*.xlsx # Excel ํ์ ๋ฐ์ดํฐ
โ โโโ checkpoint/ # ํ์ต๋ ๋ชจ๋ธ ์ฒดํฌํฌ์ธํธ
โ โโโ logs/ # ํ์ต/์ถ๋ก ๋ก๊ทธ
โ โโโ templates/ # HTML ํ
ํ๋ฆฟ
โ โโโ static/ # CSS, JS, ์ด๋ฏธ์ง
โ
โโโ ๐ 241218_NER/ # Named Entity Recognition ๋ชจ๋
โ โโโ 241218_step1_ner_train_i_tagging.py # NER ๋ชจ๋ธ ํ์ต (IO Tagging)
โ โโโ 241218_step2_ner_evaluation.py # NER ํ๊ฐ
โ โโโ data/ # NER ํ์ต ๋ฐ์ดํฐ
โ โ โโโ NER_labeled_data_v*.conll # CoNLL ํ์ ๋ผ๋ฒจ๋ง ๋ฐ์ดํฐ
โ โโโ logs/
โ
โโโ ๐ 241219_BERT_NER/ # Intent + NER ํตํฉ ์์คํ
โ โโโ 250102_step3_MAIN_ars_chat_SQL_ju_v4_template_a6000.py # ์ต์ข
ํตํฉ ์์คํ
โ โโโ 241215_step3_web_server_mp3.py # ์์ฑ ์ถ๋ ฅ ์น ์๋ฒ
โ โโโ data/
โ โ โโโ dataset_SQL_general_ju_*.xlsx # SQL ์ฐ๋ ๋ฐ์ดํฐ์
โ โโโ checkpoint/ # ํตํฉ ๋ชจ๋ธ ์ฒดํฌํฌ์ธํธ
โ โโโ templates/
โ โ โโโ main_index_polly.html # AWS Polly TTS UI
โ โ โโโ main_index_polly_text.html # ํ
์คํธ ์ ์ฉ UI
โ โโโ static/
โ
โโโ ๐ docs/ # ํ๋ก์ ํธ ๋ฌธ์
โ โโโ ARCHITECTURE.md # ์์คํ
์ํคํ
์ฒ ์์ธ
โ โโโ API_REFERENCE.md # API ๋ช
์ธ์
โ โโโ TRAINING_GUIDE.md # ๋ชจ๋ธ ํ์ต ๊ฐ์ด๋
โ โโโ DEPLOYMENT.md # ๋ฐฐํฌ ๊ฐ์ด๋
โ
โโโ ๐ tests/ # ํ
์คํธ ์ฝ๋
โ โโโ test_intent_classification.py
โ โโโ test_ner_model.py
โ โโโ test_api_endpoints.py
โ
โโโ ๐ scripts/ # ์ ํธ๋ฆฌํฐ ์คํฌ๋ฆฝํธ
โโโ data_preprocessing.py
โโโ model_evaluation.py
โโโ export_model.py
# ๋ ํฌ์งํ ๋ฆฌ ํด๋ก
git clone https://github.com/your-username/Beaver_ARS.git
cd Beaver_ARS
# ๊ฐ์ํ๊ฒฝ ์์ฑ (๊ถ์ฅ)
python -m venv venv
source venv/bin/activate # Windows: venv\Scripts\activate
# ์์กด์ฑ ์ค์น
pip install -r requirements.txt
# Intent Classification ๋ฐ์ดํฐ
# data/user_intent_v4.csv ํ์:
# text,intent,intent_num
# "๋ฉ๋ดํ ์ข ๋ณด์ฌ์ฃผ์ธ์",๋ฉ๋ด ์นดํ
๊ณ ๋ฆฌ ์๋ด,0
# NER ๋ฐ์ดํฐ
# data/NER_labeled_data_v2.conll ํ์:
# ๋ก๋ณถ์ด B-MENU
# ๊ฐ๊ฒฉ์ด O
# ์ผ๋ง์์ O
# Step 1: Intent Classification ํ์ต
cd 241215_BERT
python 241215_step1_train_cls_intent.py
# Step 2: NER ๋ชจ๋ธ ํ์ต
cd ../241218_NER
python 241218_step1_ner_train_i_tagging.py
# ํตํฉ ์์คํ
์คํ
cd 241219_BERT_NER
python 250102_step3_MAIN_ars_chat_SQL_ju_v4_template_a6000.py
# ์น ์๋ฒ ์คํ (๋ณ๋ ํฐ๋ฏธ๋)
python 241215_step3_web_server_mp3.py
# ๋ธ๋ผ์ฐ์ ์์ ์ ์
# http://localhost:5007
# 1. ๋ฐ์ดํฐ ๋งคํ ๋ฐ ์ ์ฒ๋ฆฌ
241215_step0_intent_mapping.py
- ์๋(intent) โ ์ซ์ ๋ผ๋ฒจ ๋งคํ
- 48๊ฐ ํด๋์ค๋ก ๋ถ๋ฅ
# 2. ๋ชจ๋ธ ํ์ต
241215_step1_train_cls_intent.py
- ๋ชจ๋ธ: KLUE/RoBERTa-Large
- ํ์ต: 20 epochs, batch size 16
- Optimizer: AdamW (lr=2e-5)
- ํ๊ฐ: Accuracy, F1-Score
# 3. ์ถ๋ก ๋ฐ ํ๊ฐ
241215_step1_inference_cls_intent.py
241215_step1_evaluation_cls_intent.py
# 1. NER ํ์ต (IO Tagging)
241218_step1_ner_train_i_tagging.py
- CoNLL ํ์ ๋ฐ์ดํฐ ๋ก๋
- Token Classification (6๊ฐ ํ๊ทธ)
- seqeval ํ๊ฐ
# 2. ํ๊ฐ
241218_step2_ner_evaluation.py
- Precision, Recall, F1-Score
- Entity-level ํ๊ฐ
# ํตํฉ ์์คํ
250102_step3_MAIN_ars_chat_SQL_ju_v4_template_a6000.py
- Intent Classification โ NER โ Slot Filling
- Hybrid Search (BM25 + Sentence-BERT)
- SQL Database ์ฟผ๋ฆฌ
- Template ๊ธฐ๋ฐ ์๋ต ์์ฑ
curl -X POST http://localhost:1117/order \
-H "Content-Type: application/json" \
-d '{
"header": {
"interfaceID": "AI-SDC-CAT-001"
},
"body": {
"text": "๋ก๋ณถ์ด ๊ฐ๊ฒฉ์ด ์ผ๋ง์์?"
}
}'
{
"response": "๋ก๋ณถ์ด์ ๊ฐ๊ฒฉ์ 5,000์์ด์์. ๋ ์์ธํ ๋ด์ฉ์ ๋ฌธ์๋ก ๋ฐ์ก๋ ๋ฉ๋ดํ์ ์ฐธ๊ณ ํด์ฃผ์ธ์!",
"intent": "ํน์ ์ํ ๋ฐ ๊ฐ๊ฒฉ ์๋ด",
"intent_id": 1,
"entities": {
"MENU": ["๋ก๋ณถ์ด"]
},
"confidence": 0.98
}
| Endpoint | Method | Description |
|---|---|---|
/order | POST | ๋ฉ์ธ ์ฑ๋ด API |
/health | GET | ์๋ฒ ์ํ ํ์ธ |
/ | GET | ์น UI |
| Model | Accuracy | F1-Score | Inference Time |
|---|---|---|---|
| KLUE/BERT-Base | 92.3% | 91.8% | 15ms |
| KLUE/RoBERTa-Large | 95.7% | 95.2% | 18ms |
| Entity Type | Precision | Recall | F1-Score |
|---|---|---|---|
| MENU | 94.2% | 92.8% | 93.5% |
| PAYMENT | 91.5% | 89.3% | 90.4% |
| DAY | 96.1% | 95.7% | 95.9% |
| Macro Avg | 93.9% | 92.6% | 93.3% |
BERT ๊ธฐ๋ฐ Intent Classification + NER์ ํ์ฉํ ๋ ์คํ ๋ ์๋ ์๋ต ์์คํ
๊ณ ๊ฐ ๋ฌธ์๋ฅผ ์ค์๊ฐ์ผ๋ก ์ดํดํ๊ณ , ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ธฐ๋ฐ ์ ํํ ์๋ต์ ์์ฑํ๋ End-to-End ์ฑ๋ด ์๋ฃจ์
๋ ์คํ ๋์ด๋ ์นดํ์ ๊ฐ์ ์๋น์ค ์ ์ข ์์ ๊ณ ๊ฐ ๋ฌธ์๋ ๋ฐ๋ณต์ ์ด๊ณ ์ ์ฌํ ํจํด์ ๋ณด์ ๋๋ค. ๋ฉ๋ด ์๋ด, ์์ ์๊ฐ, ๊ฒฐ์ ๋ฐฉ๋ฒ, ์์ฝ ๋ฑ์ ๋ฌธ์๋ฅผ ์๋ํํ์ฌ 24/7 ๊ณ ๊ฐ ์๋๋ฅผ ๊ฐ๋ฅํ๊ฒ ํ๊ณ , ์ง์์ ์ ๋ฌด ๋ถ๋ด์ ์ค์ด๋ ๊ฒ์ด ๋ณธ ํ๋ก์ ํธ์ ๋ชฉํ์ ๋๋ค.
Intent Classification: 48๊ฐ์ง ์ธ๋ถํ๋ ์๋ ๋ถ๋ฅ
Named Entity Recognition (NER): 6๊ฐ์ง ์ํฐํฐ ์ธ์
B-MENU/I-MENU: ๋ฉ๋ด๋ช
์ถ์ถB-PAYMENT/I-PAYMENT: ๊ฒฐ์ ์๋จB-DAY: ์์ผ ์ ๋ณดO: ๊ธฐํ ํ ํฐโโโโโโโโโโโโโโโโโโโ
โ User Input โ (์์ฑ/ํ
์คํธ)
โโโโโโโโโโฌโโโโโโโโโ
โ
โโโโโโผโโโโโ
โ Flask โ Web Server
โ Server โ (Port: 5007)
โโโโโโฌโโโโโ
โ
โโโโโโผโโโโโโโโโโโโโโโโโ
โ Intent Classifier โ (KLUE/RoBERTa-Large)
โ (48 classes) โ
โโโโโโฌโโโโโโโโโโโโโโโโโ
โ
โโโโโโผโโโโโโโโโโโโโโ
โ NER Model โ (KLUE/RoBERTa-Large)
โ (6 entity tags) โ
โโโโโโฌโโโโโโโโโโโโโโ
โ
โโโโโโผโโโโโโโโโโโโโโโโโโโ
โ Hybrid Search Engine โ
โ (BM25 + Sentence-BERT)โ
โโโโโโฌโโโโโโโโโโโโโโโโโโโ
โ
โโโโโโผโโโโโโโโโโโโ
โ SQL Database โ
โ Query โ
โโโโโโฌโโโโโโโโโโโโ
โ
โโโโโโผโโโโโโโโโโโโโโโโโ
โ Response Generator โ
โ (Template-based) โ
โโโโโโฌโโโโโโโโโโโโโโโโโ
โ
โโโโโโผโโโโโโ
โ Output โ (์์ฑ/ํ
์คํธ)
โโโโโโโโโโโโ
Beaver_ARS/
โ
โโโ ๐ README.md # ํ๋ก์ ํธ ๋ฌธ์ (๋ณธ ํ์ผ)
โโโ ๐ requirements.txt # ์์กด์ฑ ํจํค์ง
โโโ ๐ .gitignore # Git ์ ์ธ ํ์ผ
โ
โโโ ๐ 241215_BERT/ # Intent Classification ๋ชจ๋
โ โโโ 241215_step0_intent_mapping.py # ์๋ ๋ผ๋ฒจ ๋งคํ
โ โโโ 241215_step1_train_cls_intent.py # Intent ๋ถ๋ฅ ๋ชจ๋ธ ํ์ต
โ โโโ 241215_step1_inference_cls_intent.py # ์ถ๋ก
โ โโโ 241215_step1_evaluation_cls_intent.py # ํ๊ฐ
โ โโโ 241215_step2_response_template.py # ์๋ต ํ
ํ๋ฆฟ ์ค๊ณ
โ โโโ 241215_step3_web_server_main.py # Flask ์น ์๋ฒ
โ โโโ data/ # ํ์ต ๋ฐ์ดํฐ
โ โ โโโ user_intent_v*.csv # Intent ๋ฐ์ดํฐ์
(๋ฒ์ ๋ณ)
โ โ โโโ intent_v*.xlsx # Excel ํ์ ๋ฐ์ดํฐ
โ โโโ checkpoint/ # ํ์ต๋ ๋ชจ๋ธ ์ฒดํฌํฌ์ธํธ
โ โโโ logs/ # ํ์ต/์ถ๋ก ๋ก๊ทธ
โ โโโ templates/ # HTML ํ
ํ๋ฆฟ
โ โโโ static/ # CSS, JS, ์ด๋ฏธ์ง
โ
โโโ ๐ 241218_NER/ # Named Entity Recognition ๋ชจ๋
โ โโโ 241218_step1_ner_train_i_tagging.py # NER ๋ชจ๋ธ ํ์ต (IO Tagging)
โ โโโ 241218_step2_ner_evaluation.py # NER ํ๊ฐ
โ โโโ data/ # NER ํ์ต ๋ฐ์ดํฐ
โ โ โโโ NER_labeled_data_v*.conll # CoNLL ํ์ ๋ผ๋ฒจ๋ง ๋ฐ์ดํฐ
โ โโโ logs/
โ
โโโ ๐ 241219_BERT_NER/ # Intent + NER ํตํฉ ์์คํ
โ โโโ 250102_step3_MAIN_ars_chat_SQL_ju_v4_template_a6000.py # ์ต์ข
ํตํฉ ์์คํ
โ โโโ 241215_step3_web_server_mp3.py # ์์ฑ ์ถ๋ ฅ ์น ์๋ฒ
โ โโโ data/
โ โ โโโ dataset_SQL_general_ju_*.xlsx # SQL ์ฐ๋ ๋ฐ์ดํฐ์
โ โโโ checkpoint/ # ํตํฉ ๋ชจ๋ธ ์ฒดํฌํฌ์ธํธ
โ โโโ templates/
โ โ โโโ main_index_polly.html # AWS Polly TTS UI
โ โ โโโ main_index_polly_text.html # ํ
์คํธ ์ ์ฉ UI
โ โโโ static/
โ
โโโ ๐ docs/ # ํ๋ก์ ํธ ๋ฌธ์
โ โโโ ARCHITECTURE.md # ์์คํ
์ํคํ
์ฒ ์์ธ
โ โโโ API_REFERENCE.md # API ๋ช
์ธ์
โ โโโ TRAINING_GUIDE.md # ๋ชจ๋ธ ํ์ต ๊ฐ์ด๋
โ โโโ DEPLOYMENT.md # ๋ฐฐํฌ ๊ฐ์ด๋
โ
โโโ ๐ tests/ # ํ
์คํธ ์ฝ๋
โ โโโ test_intent_classification.py
โ โโโ test_ner_model.py
โ โโโ test_api_endpoints.py
โ
โโโ ๐ scripts/ # ์ ํธ๋ฆฌํฐ ์คํฌ๋ฆฝํธ
โโโ data_preprocessing.py
โโโ model_evaluation.py
โโโ export_model.py
# ๋ ํฌ์งํ ๋ฆฌ ํด๋ก
git clone https://github.com/your-username/Beaver_ARS.git
cd Beaver_ARS
# ๊ฐ์ํ๊ฒฝ ์์ฑ (๊ถ์ฅ)
python -m venv venv
source venv/bin/activate # Windows: venv\Scripts\activate
# ์์กด์ฑ ์ค์น
pip install -r requirements.txt
# Intent Classification ๋ฐ์ดํฐ
# data/user_intent_v4.csv ํ์:
# text,intent,intent_num
# "๋ฉ๋ดํ ์ข ๋ณด์ฌ์ฃผ์ธ์",๋ฉ๋ด ์นดํ
๊ณ ๋ฆฌ ์๋ด,0
# NER ๋ฐ์ดํฐ
# data/NER_labeled_data_v2.conll ํ์:
# ๋ก๋ณถ์ด B-MENU
# ๊ฐ๊ฒฉ์ด O
# ์ผ๋ง์์ O
# Step 1: Intent Classification ํ์ต
cd 241215_BERT
python 241215_step1_train_cls_intent.py
# Step 2: NER ๋ชจ๋ธ ํ์ต
cd ../241218_NER
python 241218_step1_ner_train_i_tagging.py
# ํตํฉ ์์คํ
์คํ
cd 241219_BERT_NER
python 250102_step3_MAIN_ars_chat_SQL_ju_v4_template_a6000.py
# ์น ์๋ฒ ์คํ (๋ณ๋ ํฐ๋ฏธ๋)
python 241215_step3_web_server_mp3.py
# ๋ธ๋ผ์ฐ์ ์์ ์ ์
# http://localhost:5007
# 1. ๋ฐ์ดํฐ ๋งคํ ๋ฐ ์ ์ฒ๋ฆฌ
241215_step0_intent_mapping.py
- ์๋(intent) โ ์ซ์ ๋ผ๋ฒจ ๋งคํ
- 48๊ฐ ํด๋์ค๋ก ๋ถ๋ฅ
# 2. ๋ชจ๋ธ ํ์ต
241215_step1_train_cls_intent.py
- ๋ชจ๋ธ: KLUE/RoBERTa-Large
- ํ์ต: 20 epochs, batch size 16
- Optimizer: AdamW (lr=2e-5)
- ํ๊ฐ: Accuracy, F1-Score
# 3. ์ถ๋ก ๋ฐ ํ๊ฐ
241215_step1_inference_cls_intent.py
241215_step1_evaluation_cls_intent.py
# 1. NER ํ์ต (IO Tagging)
241218_step1_ner_train_i_tagging.py
- CoNLL ํ์ ๋ฐ์ดํฐ ๋ก๋
- Token Classification (6๊ฐ ํ๊ทธ)
- seqeval ํ๊ฐ
# 2. ํ๊ฐ
241218_step2_ner_evaluation.py
- Precision, Recall, F1-Score
- Entity-level ํ๊ฐ
# ํตํฉ ์์คํ
250102_step3_MAIN_ars_chat_SQL_ju_v4_template_a6000.py
- Intent Classification โ NER โ Slot Filling
- Hybrid Search (BM25 + Sentence-BERT)
- SQL Database ์ฟผ๋ฆฌ
- Template ๊ธฐ๋ฐ ์๋ต ์์ฑ
curl -X POST http://localhost:1117/order \
-H "Content-Type: application/json" \
-d '{
"header": {
"interfaceID": "AI-SDC-CAT-001"
},
"body": {
"text": "๋ก๋ณถ์ด ๊ฐ๊ฒฉ์ด ์ผ๋ง์์?"
}
}'
{
"response": "๋ก๋ณถ์ด์ ๊ฐ๊ฒฉ์ 5,000์์ด์์. ๋ ์์ธํ ๋ด์ฉ์ ๋ฌธ์๋ก ๋ฐ์ก๋ ๋ฉ๋ดํ์ ์ฐธ๊ณ ํด์ฃผ์ธ์!",
"intent": "ํน์ ์ํ ๋ฐ ๊ฐ๊ฒฉ ์๋ด",
"intent_id": 1,
"entities": {
"MENU": ["๋ก๋ณถ์ด"]
},
"confidence": 0.98
}
| Endpoint | Method | Description |
|---|---|---|
/order | POST | ๋ฉ์ธ ์ฑ๋ด API |
/health | GET | ์๋ฒ ์ํ ํ์ธ |
/ | GET | ์น UI |
| Model | Accuracy | F1-Score | Inference Time |
|---|---|---|---|
| KLUE/BERT-Base | 92.3% | 91.8% | 15ms |
| KLUE/RoBERTa-Large | 95.7% | 95.2% | 18ms |
| Entity Type | Precision | Recall | F1-Score |
|---|---|---|---|
| MENU | 94.2% | 92.8% | 93.5% |
| PAYMENT | 91.5% | 89.3% | 90.4% |
| DAY | 96.1% | 95.7% | 95.9% |
| Macro Avg | 93.9% | 92.6% | 93.3% |