refactor: refactor all files
Browse files- README.md +195 -1
- assets/gradio_demo.png +3 -0
- main.py +0 -2
- requirements.txt +2 -2
- settings.py +4 -4
- step_01_Prepare_Data.ipynb +59 -16
- step_02_Finetune_SBERT.ipynb +2 -11
- step_03_Eval_with_MTEB.ipynb +3 -57
- step_04_Retrieval.ipynb +30 -224
README.md
CHANGED
@@ -12,4 +12,198 @@ datasets:
|
|
12 |
- YuITC/Vietnamese-Legal-Doc-Retrieval-Data
|
13 |
---
|
14 |
|
15 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
12 |
- YuITC/Vietnamese-Legal-Doc-Retrieval-Data
|
13 |
---
|
14 |
|
15 |
+
# Vietnamese Legal Document Retrieval System
|
16 |
+
|
17 |
+
[](https://huggingface.co/spaces/YuITC/Vietnamese-Legal-Doc-Retrieval)
|
18 |
+
[](https://huggingface.co/YuITC/bert-base-multilingual-cased-finetuned-VNLegalDocs)
|
19 |
+
[](https://huggingface.co/datasets/YuITC/Vietnamese-Legal-Doc-Retrieval-Data)
|
20 |
+
|
21 |
+
A retrieval system specifically designed for Vietnamese legal documents using fine-tuned SBERT (Sentence-BERT) technology.
|
22 |
+
|
23 |
+
|
24 |
+
## 📌 Overview
|
25 |
+
This project implements a retrieval system for retrieving relevant Vietnamese legal documents based on user queries. The system uses a fine-tuned multilingual BERT model to encode legal queries and documents into a semantic vector space, allowing for retrieval based on meaning rather than just keyword matching.
|
26 |
+
|
27 |
+

|
28 |
+
|
29 |
+
|
30 |
+
## 🔑 Key features
|
31 |
+
- Step-by-step notebook for understanding.
|
32 |
+
- Fine-tuned SBERT model specialized for Vietnamese legal document retrieval.
|
33 |
+
- FAISS indexing for efficient vector search.
|
34 |
+
- Evaluation based on MTEB.
|
35 |
+
- Interactive web interface for quick legal document search.
|
36 |
+
- High-performance retrieval of relevant legal passages.
|
37 |
+
|
38 |
+
|
39 |
+
## 🛠️ Installation & Usage
|
40 |
+
```bash
|
41 |
+
# Install dependencies
|
42 |
+
conda install pytorch torchvision torchaudio pytorch-cuda=12.1 -c pytorch -c nvidia
|
43 |
+
conda install faiss-gpu=1.9.0 -c pytorch -c nvidia
|
44 |
+
pip install -r requirements.txt
|
45 |
+
|
46 |
+
# Running the Application
|
47 |
+
python main.py
|
48 |
+
```
|
49 |
+
|
50 |
+
The application will start a local web server with the Gradio interface, allowing you to enter legal queries and retrieve relevant documents.
|
51 |
+
|
52 |
+
|
53 |
+
## 📂 Project Structure
|
54 |
+
|
55 |
+
```
|
56 |
+
Vietnamese-Legal-Doc-Retrieval/
|
57 |
+
├── assets/ # Visual assets for documentation
|
58 |
+
│ └── gradio_demo.png # Screenshot of the Gradio demo interface
|
59 |
+
├── cache/ # Cached model files
|
60 |
+
│ └── VN-legalDocs-SBERT/ # Cached BERT model files
|
61 |
+
├── data/ # Dataset files
|
62 |
+
│ ├── original/ # Original downloaded dataset
|
63 |
+
│ │ ├── corpus.csv # Raw corpus documents
|
64 |
+
│ │ ├── train_split.csv # Training data
|
65 |
+
│ │ ├── val_split.csv # Validation data
|
66 |
+
│ │ └── ...
|
67 |
+
│ ├── processed/ # Processed dataset files
|
68 |
+
│ │ ├── corpus_data.parquet # Processed corpus for embedding
|
69 |
+
│ │ ├── train_data.parquet # Processed training data
|
70 |
+
│ │ └── test_data.parquet # Processed test data
|
71 |
+
│ └── retrieval/ # Files for retrieval system
|
72 |
+
│ └── legal_faiss.index # FAISS index for fast vector search
|
73 |
+
├── models/ # Trained model files
|
74 |
+
│ └── VN-legalDocs-SBERT/ # Fine-tuned BERT model for legal documents
|
75 |
+
│ ├── model.safetensors # Model weights
|
76 |
+
│ ├── config.json # Model configuration
|
77 |
+
│ └── checkpoint-*/ # Training checkpoints
|
78 |
+
├── results/ # Evaluation results
|
79 |
+
├── Dockerfile # Docker configuration for deployment
|
80 |
+
├── main.py # Main application entry point
|
81 |
+
├── requirements.txt # Python dependencies
|
82 |
+
├── settings.py # Configuration settings
|
83 |
+
└── step_*_*.ipynb # Jupyter notebooks for each step of the process
|
84 |
+
```
|
85 |
+
## 💾 Dataset
|
86 |
+
The system is trained on a Vietnamese legal document corpus containing:
|
87 |
+
- Legal texts from various domains
|
88 |
+
- Query-document pairs for training and evaluation
|
89 |
+
- Processed and structured for semantic search training
|
90 |
+
|
91 |
+
The dataset is available on [Hugging Face](https://huggingface.co/datasets/YuITC/Vietnamese-Legal-Doc-Retrieval-Data) (modified by me, the base dataset is cited below).
|
92 |
+
|
93 |
+
|
94 |
+
## 📊 Model Training Process
|
95 |
+
The project follows a systematic approach to build the retrieval system:
|
96 |
+
|
97 |
+
1. **Data Preparation** (`step_01_Prepare_Data.ipynb`):
|
98 |
+
- Processes raw legal documents
|
99 |
+
- Creates query-document pairs for training
|
100 |
+
- Formats data for the embedding model
|
101 |
+
|
102 |
+
2. **SBERT Fine-tuning** (`step_02_Finetune_SBERT.ipynb`):
|
103 |
+
- Fine-tunes a multilingual BERT model with legal document pairs
|
104 |
+
- Uses `CachedMultipleNegativesRankingLoss` for training
|
105 |
+
- Optimizes for semantic similarity in legal context
|
106 |
+
|
107 |
+
3. **Evaluation** (`step_03_Eval_with_MTEB.ipynb`):
|
108 |
+
- Evaluates model performance using retrieval metrics
|
109 |
+
- Compares with baseline models
|
110 |
+
|
111 |
+
4. **Retrieval System Setup** (`step_04_Retrieval.ipynb`):
|
112 |
+
- Creates FAISS index from document embeddings
|
113 |
+
- Implements efficient search functionality
|
114 |
+
- Prepares for deployment
|
115 |
+
|
116 |
+
|
117 |
+
## 🔍 Usage Examples
|
118 |
+
|
119 |
+
The system accepts natural language queries in Vietnamese related to legal topics. Example queries:
|
120 |
+
|
121 |
+
- "Tội xúc phạm danh dự?" (Crimes against honor?)
|
122 |
+
- "Quyền lợi của người lao động?" (Rights of workers?)
|
123 |
+
- "Thủ tục đăng ký kết hôn?" (Marriage registration procedures?)
|
124 |
+
|
125 |
+
|
126 |
+
## 🧪 Performance
|
127 |
+
|
128 |
+
The fine-tuned model was evaluated using the [MTEB benchmark](https://github.com/embeddings-benchmark/mteb) on the BKAILegalDocRetrieval dataset. Key results:
|
129 |
+
|
130 |
+
| Metric | @k | Pre-trained model score (%) | Fine-tuned model score (%) |
|
131 |
+
|--------------|-----|-----------------------------|-----------------------------|
|
132 |
+
| **NDCG** | 1 | 0.007 | 42.425 |
|
133 |
+
| | 5 | 0.011 | 57.387 |
|
134 |
+
| | 10 | 0.023 | 60.389 |
|
135 |
+
| | 20 | 0.049 | 62.160 |
|
136 |
+
| | 100 | 0.147 | 63.894 |
|
137 |
+
| **MAP** | 1 | 0.007 | 40.328 |
|
138 |
+
| | 5 | 0.009 | 52.297 |
|
139 |
+
| | 10 | 0.014 | 53.608 |
|
140 |
+
| | 20 | 0.021 | 54.136 |
|
141 |
+
| | 100 | 0.033 | 54.418 |
|
142 |
+
| **Recall** | 1 | 0.007 | 40.328 |
|
143 |
+
| | 5 | 0.017 | 70.466 |
|
144 |
+
| | 10 | 0.054 | 79.407 |
|
145 |
+
| | 20 | 0.157 | 86.112 |
|
146 |
+
| | 100 | 0.713 | 94.805 |
|
147 |
+
| **Precision**| 1 | 0.007 | 42.425 |
|
148 |
+
| | 5 | 0.003 | 15.119 |
|
149 |
+
| | 10 | 0.005 | 8.587 |
|
150 |
+
| | 20 | 0.008 | 4.687 |
|
151 |
+
| | 100 | 0.007 | 1.045 |
|
152 |
+
| **MRR** | 1 | 0.007 | 42.418 |
|
153 |
+
| | 5 | 0.010 | 54.337 |
|
154 |
+
| | 10 | 0.014 | 55.510 |
|
155 |
+
| | 20 | 0.021 | 55.956 |
|
156 |
+
| | 100 | 0.033 | 56.172 |
|
157 |
+
|
158 |
+
- **NDCG@k (Normalized Discounted Cumulative Gain)**
|
159 |
+
Measures ranking quality by evaluating the relevance of results with logarithmic position-based discounting.
|
160 |
+
- **MAP@k (Mean Average Precision)**
|
161 |
+
Computes the average precision for each query up to rank k—precision at each relevant retrieved document—then averages across all queries.
|
162 |
+
- **Recall@k**
|
163 |
+
The proportion of all relevant documents that are retrieved in the top k results.
|
164 |
+
- **Precision@k**
|
165 |
+
The proportion of the top k retrieved documents that are relevant.
|
166 |
+
- **MRR@k (Mean Reciprocal Rank)**
|
167 |
+
The average of the reciprocal of the rank position of the first relevant document across all queries.
|
168 |
+
|
169 |
+
The model significantly outperforms baseline retrieval methods, with the main evaluation score (NDCG@10) reaching 60.4%, demonstrating strong performance on Vietnamese legal document retrieval tasks.
|
170 |
+
|
171 |
+
## 🐳 Docker Deployment
|
172 |
+
|
173 |
+
The project includes a Docker configuration for easy deployment. The Docker image is built on `continuumio/miniconda3` and includes GPU support via PyTorch CUDA and FAISS-GPU.
|
174 |
+
|
175 |
+
```bash
|
176 |
+
# Build the Docker image
|
177 |
+
docker build -t vietnamese-legal-retrieval .
|
178 |
+
|
179 |
+
# Run the container
|
180 |
+
docker run -p 7860:7860 vietnamese-legal-retrieval
|
181 |
+
```
|
182 |
+
|
183 |
+
The container:
|
184 |
+
- Uses Python 3.10 with CUDA 12.1 support
|
185 |
+
- Installs required dependencies from requirements.txt
|
186 |
+
- Exposes port 7860 for the Gradio web interface
|
187 |
+
- Sets proper environment variables for security and performance
|
188 |
+
- Runs as a non-root user for enhanced security
|
189 |
+
|
190 |
+
You can access the web interface by navigating to `http://localhost:7860` after starting the container.
|
191 |
+
|
192 |
+
|
193 |
+
## 📜 License
|
194 |
+
This project is licensed under the MIT License – feel free to modify and distribute it as needed.
|
195 |
+
|
196 |
+
|
197 |
+
## 🤝 Acknowledgments
|
198 |
+
Thanks for:
|
199 |
+
- [BKAI Legal Retrieval Dataset](https://huggingface.co/datasets/tmnam20/BKAI-Legal-Retrieval) for the original data
|
200 |
+
- [Sentence Transformers](https://www.sbert.net/) library for the embedding model architecture
|
201 |
+
- [Hugging Face](https://huggingface.co/) for hosting the model and dataset
|
202 |
+
|
203 |
+
If you find this project useful, consider ⭐️ starring the repository or contributing to further improvements!
|
204 |
+
|
205 |
+
|
206 |
+
## 📬 Contact
|
207 |
+
For any questions or collaboration opportunities, feel free to reach out:
|
208 |
+
|
209 |
+
📧 Email: tainguyenphu2502@gmail.com
|
assets/gradio_demo.png
ADDED
![]() |
Git LFS Details
|
main.py
CHANGED
@@ -1,10 +1,8 @@
|
|
1 |
-
import os
|
2 |
import numpy as np
|
3 |
import pandas as pd
|
4 |
import gradio as gr
|
5 |
|
6 |
import faiss
|
7 |
-
from datasets import load_dataset
|
8 |
from huggingface_hub import hf_hub_download
|
9 |
from sentence_transformers import SentenceTransformer
|
10 |
|
|
|
|
|
1 |
import numpy as np
|
2 |
import pandas as pd
|
3 |
import gradio as gr
|
4 |
|
5 |
import faiss
|
|
|
6 |
from huggingface_hub import hf_hub_download
|
7 |
from sentence_transformers import SentenceTransformer
|
8 |
|
requirements.txt
CHANGED
@@ -1,6 +1,7 @@
|
|
1 |
# !conda install pytorch torchvision torchaudio pytorch-cuda=12.1 -c pytorch -c nvidia
|
2 |
# !conda install faiss-gpu=1.9.0 -c pytorch -c nvidia
|
3 |
|
|
|
4 |
transformers
|
5 |
sentence-transformers
|
6 |
accelerate
|
@@ -8,5 +9,4 @@ datasets
|
|
8 |
mteb
|
9 |
tqdm
|
10 |
pandas
|
11 |
-
gradio
|
12 |
-
huggingface-hub
|
|
|
1 |
# !conda install pytorch torchvision torchaudio pytorch-cuda=12.1 -c pytorch -c nvidia
|
2 |
# !conda install faiss-gpu=1.9.0 -c pytorch -c nvidia
|
3 |
|
4 |
+
huggingface-hub
|
5 |
transformers
|
6 |
sentence-transformers
|
7 |
accelerate
|
|
|
9 |
mteb
|
10 |
tqdm
|
11 |
pandas
|
12 |
+
gradio
|
|
settings.py
CHANGED
@@ -4,14 +4,14 @@ import random
|
|
4 |
import numpy as np
|
5 |
|
6 |
|
7 |
-
# Data settings
|
8 |
os.makedirs('data', exist_ok=True)
|
9 |
os.makedirs('data/original', exist_ok=True)
|
10 |
os.makedirs('data/processed', exist_ok=True)
|
11 |
os.makedirs('data/retrieval', exist_ok=True)
|
12 |
|
13 |
|
14 |
-
# Model settings
|
15 |
MODEL_ID = 'google-bert/bert-base-multilingual-cased'
|
16 |
MODEL_NAME = 'VN-legalDocs-SBERT'
|
17 |
|
@@ -22,7 +22,7 @@ os.makedirs(CACHE_DIR, exist_ok=True)
|
|
22 |
os.makedirs(OUTPUT_DIR, exist_ok=True)
|
23 |
|
24 |
|
25 |
-
# Reproducibility
|
26 |
SEED = 42
|
27 |
random.seed(SEED)
|
28 |
np.random.seed(SEED)
|
@@ -35,7 +35,7 @@ torch.backends.cudnn.deterministic = False
|
|
35 |
torch.backends.cudnn.benchmark = True
|
36 |
|
37 |
|
38 |
-
# Hyperparameters
|
39 |
MAX_SEQ_LEN = 512
|
40 |
EPOCHS = 5
|
41 |
LR = 3e-5
|
|
|
4 |
import numpy as np
|
5 |
|
6 |
|
7 |
+
# ===== Data settings =====
|
8 |
os.makedirs('data', exist_ok=True)
|
9 |
os.makedirs('data/original', exist_ok=True)
|
10 |
os.makedirs('data/processed', exist_ok=True)
|
11 |
os.makedirs('data/retrieval', exist_ok=True)
|
12 |
|
13 |
|
14 |
+
# ===== Model settings =====
|
15 |
MODEL_ID = 'google-bert/bert-base-multilingual-cased'
|
16 |
MODEL_NAME = 'VN-legalDocs-SBERT'
|
17 |
|
|
|
22 |
os.makedirs(OUTPUT_DIR, exist_ok=True)
|
23 |
|
24 |
|
25 |
+
# ===== Reproducibility =====
|
26 |
SEED = 42
|
27 |
random.seed(SEED)
|
28 |
np.random.seed(SEED)
|
|
|
35 |
torch.backends.cudnn.benchmark = True
|
36 |
|
37 |
|
38 |
+
# ===== Hyperparameters =====
|
39 |
MAX_SEQ_LEN = 512
|
40 |
EPOCHS = 5
|
41 |
LR = 3e-5
|
step_01_Prepare_Data.ipynb
CHANGED
@@ -31,6 +31,15 @@
|
|
31 |
"import pandas as pd"
|
32 |
]
|
33 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
34 |
{
|
35 |
"cell_type": "code",
|
36 |
"execution_count": 5,
|
@@ -54,7 +63,7 @@
|
|
54 |
},
|
55 |
{
|
56 |
"cell_type": "code",
|
57 |
-
"execution_count":
|
58 |
"id": "4fe0c4f8",
|
59 |
"metadata": {},
|
60 |
"outputs": [
|
@@ -68,6 +77,7 @@
|
|
68 |
}
|
69 |
],
|
70 |
"source": [
|
|
|
71 |
"corpus_data = pd.read_csv('data/original/corpus.csv')\n",
|
72 |
"train_split = pd.read_csv('data/original/train_split.csv')\n",
|
73 |
"test_split = pd.read_csv('data/original/val_split.csv')\n",
|
@@ -155,9 +165,47 @@
|
|
155 |
"corpus_data.head()"
|
156 |
]
|
157 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
158 |
{
|
159 |
"cell_type": "code",
|
160 |
-
"execution_count":
|
161 |
"id": "3d32d13a",
|
162 |
"metadata": {},
|
163 |
"outputs": [
|
@@ -263,20 +311,6 @@
|
|
263 |
}
|
264 |
],
|
265 |
"source": [
|
266 |
-
"# 'cid' column: '[1 2 3]'\n",
|
267 |
-
"train_split['cid'] = train_split['cid'].apply(lambda x: [int(i) for i in x[1:-1].split()])\n",
|
268 |
-
"test_split['cid'] = test_split['cid'].apply(lambda x: [int(i) for i in x[1:-1].split()])\n",
|
269 |
-
"\n",
|
270 |
-
"\n",
|
271 |
-
"# Mapping from corpus \n",
|
272 |
-
"mapping = dict(zip(corpus_data['cid'], corpus_data['text']))\n",
|
273 |
-
"\n",
|
274 |
-
"def get_context_list(cid_list):\n",
|
275 |
-
" return [mapping[cid] for cid in cid_list if cid in mapping]\n",
|
276 |
-
"\n",
|
277 |
-
"train_split['context_list'] = train_split['cid'].apply(get_context_list)\n",
|
278 |
-
"test_split['context_list'] = test_split['cid'].apply(get_context_list)\n",
|
279 |
-
"\n",
|
280 |
"train_split.head()"
|
281 |
]
|
282 |
},
|
@@ -342,6 +376,15 @@
|
|
342 |
"]"
|
343 |
]
|
344 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
345 |
{
|
346 |
"cell_type": "code",
|
347 |
"execution_count": 11,
|
|
|
31 |
"import pandas as pd"
|
32 |
]
|
33 |
},
|
34 |
+
{
|
35 |
+
"cell_type": "markdown",
|
36 |
+
"id": "657d341a",
|
37 |
+
"metadata": {},
|
38 |
+
"source": [
|
39 |
+
"## **1. Data Overview**\n",
|
40 |
+
"---"
|
41 |
+
]
|
42 |
+
},
|
43 |
{
|
44 |
"cell_type": "code",
|
45 |
"execution_count": 5,
|
|
|
63 |
},
|
64 |
{
|
65 |
"cell_type": "code",
|
66 |
+
"execution_count": null,
|
67 |
"id": "4fe0c4f8",
|
68 |
"metadata": {},
|
69 |
"outputs": [
|
|
|
77 |
}
|
78 |
],
|
79 |
"source": [
|
80 |
+
"# Overview the dataset\n",
|
81 |
"corpus_data = pd.read_csv('data/original/corpus.csv')\n",
|
82 |
"train_split = pd.read_csv('data/original/train_split.csv')\n",
|
83 |
"test_split = pd.read_csv('data/original/val_split.csv')\n",
|
|
|
165 |
"corpus_data.head()"
|
166 |
]
|
167 |
},
|
168 |
+
{
|
169 |
+
"cell_type": "markdown",
|
170 |
+
"id": "e435ce3e",
|
171 |
+
"metadata": {},
|
172 |
+
"source": [
|
173 |
+
"## **2. Data Preprocessing**\n",
|
174 |
+
"---"
|
175 |
+
]
|
176 |
+
},
|
177 |
+
{
|
178 |
+
"cell_type": "code",
|
179 |
+
"execution_count": null,
|
180 |
+
"id": "8a176681",
|
181 |
+
"metadata": {},
|
182 |
+
"outputs": [],
|
183 |
+
"source": [
|
184 |
+
"# 'cid' column: '[1 2 3]'\n",
|
185 |
+
"train_split['cid'] = train_split['cid'].apply(lambda x: [int(i) for i in x[1:-1].split()])\n",
|
186 |
+
"test_split['cid'] = test_split['cid'].apply(lambda x: [int(i) for i in x[1:-1].split()])"
|
187 |
+
]
|
188 |
+
},
|
189 |
+
{
|
190 |
+
"cell_type": "code",
|
191 |
+
"execution_count": null,
|
192 |
+
"id": "65916537",
|
193 |
+
"metadata": {},
|
194 |
+
"outputs": [],
|
195 |
+
"source": [
|
196 |
+
"# Mapping from corpus \n",
|
197 |
+
"mapping = dict(zip(corpus_data['cid'], corpus_data['text']))\n",
|
198 |
+
"\n",
|
199 |
+
"def get_context_list(cid_list):\n",
|
200 |
+
" return [mapping[cid] for cid in cid_list if cid in mapping]\n",
|
201 |
+
"\n",
|
202 |
+
"train_split['context_list'] = train_split['cid'].apply(get_context_list)\n",
|
203 |
+
"test_split['context_list'] = test_split['cid'].apply(get_context_list)"
|
204 |
+
]
|
205 |
+
},
|
206 |
{
|
207 |
"cell_type": "code",
|
208 |
+
"execution_count": null,
|
209 |
"id": "3d32d13a",
|
210 |
"metadata": {},
|
211 |
"outputs": [
|
|
|
311 |
}
|
312 |
],
|
313 |
"source": [
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
314 |
"train_split.head()"
|
315 |
]
|
316 |
},
|
|
|
376 |
"]"
|
377 |
]
|
378 |
},
|
379 |
+
{
|
380 |
+
"cell_type": "markdown",
|
381 |
+
"id": "656c37f3",
|
382 |
+
"metadata": {},
|
383 |
+
"source": [
|
384 |
+
"## **3. Save Data**\n",
|
385 |
+
"---"
|
386 |
+
]
|
387 |
+
},
|
388 |
{
|
389 |
"cell_type": "code",
|
390 |
"execution_count": 11,
|
step_02_Finetune_SBERT.ipynb
CHANGED
@@ -23,15 +23,7 @@
|
|
23 |
"execution_count": null,
|
24 |
"id": "0086aabe",
|
25 |
"metadata": {},
|
26 |
-
"outputs": [
|
27 |
-
{
|
28 |
-
"name": "stdout",
|
29 |
-
"output_type": "stream",
|
30 |
-
"text": [
|
31 |
-
"Using device: cuda\n"
|
32 |
-
]
|
33 |
-
}
|
34 |
-
],
|
35 |
"source": [
|
36 |
"import os\n",
|
37 |
"import pandas as pd\n",
|
@@ -50,7 +42,6 @@
|
|
50 |
"from sentence_transformers.training_args import BatchSamplers\n",
|
51 |
"\n",
|
52 |
"from settings import MODEL_ID, MODEL_NAME, CACHE_DIR, OUTPUT_DIR, MAX_SEQ_LEN, EPOCHS, LR, BATCH_SIZE, DEVICE\n",
|
53 |
-
"\n",
|
54 |
"os.environ['WANDB_DISABLED'] = 'true'"
|
55 |
]
|
56 |
},
|
@@ -199,7 +190,7 @@
|
|
199 |
},
|
200 |
{
|
201 |
"cell_type": "code",
|
202 |
-
"execution_count":
|
203 |
"id": "2c751cf4",
|
204 |
"metadata": {},
|
205 |
"outputs": [
|
|
|
23 |
"execution_count": null,
|
24 |
"id": "0086aabe",
|
25 |
"metadata": {},
|
26 |
+
"outputs": [],
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
27 |
"source": [
|
28 |
"import os\n",
|
29 |
"import pandas as pd\n",
|
|
|
42 |
"from sentence_transformers.training_args import BatchSamplers\n",
|
43 |
"\n",
|
44 |
"from settings import MODEL_ID, MODEL_NAME, CACHE_DIR, OUTPUT_DIR, MAX_SEQ_LEN, EPOCHS, LR, BATCH_SIZE, DEVICE\n",
|
|
|
45 |
"os.environ['WANDB_DISABLED'] = 'true'"
|
46 |
]
|
47 |
},
|
|
|
190 |
},
|
191 |
{
|
192 |
"cell_type": "code",
|
193 |
+
"execution_count": null,
|
194 |
"id": "2c751cf4",
|
195 |
"metadata": {},
|
196 |
"outputs": [
|
step_03_Eval_with_MTEB.ipynb
CHANGED
@@ -20,64 +20,10 @@
|
|
20 |
},
|
21 |
{
|
22 |
"cell_type": "code",
|
23 |
-
"execution_count":
|
24 |
-
"id": "b5fd917b",
|
25 |
-
"metadata": {},
|
26 |
-
"outputs": [
|
27 |
-
{
|
28 |
-
"name": "stdout",
|
29 |
-
"output_type": "stream",
|
30 |
-
"text": [
|
31 |
-
"📦 PyTorch version: 2.5.1\n",
|
32 |
-
"🚀 CUDA available : True\n",
|
33 |
-
"🧠 GPU Name : NVIDIA RTX A4000\n",
|
34 |
-
"📦 FAISS version : 1.9.0\n",
|
35 |
-
"🚀 FAISS is using GPU ✅\n"
|
36 |
-
]
|
37 |
-
}
|
38 |
-
],
|
39 |
-
"source": [
|
40 |
-
"import torch\n",
|
41 |
-
"\n",
|
42 |
-
"print(\"📦 PyTorch version:\", torch.__version__)\n",
|
43 |
-
"print(\"🚀 CUDA available :\", torch.cuda.is_available())\n",
|
44 |
-
"if torch.cuda.is_available():\n",
|
45 |
-
" print(\"🧠 GPU Name :\", torch.cuda.get_device_name(0))\n",
|
46 |
-
" \n",
|
47 |
-
"import faiss\n",
|
48 |
-
"\n",
|
49 |
-
"print(\"📦 FAISS version :\", faiss.__version__)\n",
|
50 |
-
"\n",
|
51 |
-
"# Kiểm tra module FAISS-GPU có hoạt động không\n",
|
52 |
-
"try:\n",
|
53 |
-
" res = faiss.StandardGpuResources() # Nếu không lỗi là có GPU\n",
|
54 |
-
" print(\"🚀 FAISS is using GPU ✅\")\n",
|
55 |
-
"except Exception as e:\n",
|
56 |
-
" print(\"❌ FAISS is NOT using GPU:\", str(e))"
|
57 |
-
]
|
58 |
-
},
|
59 |
-
{
|
60 |
-
"cell_type": "code",
|
61 |
-
"execution_count": 3,
|
62 |
"id": "030016c2",
|
63 |
"metadata": {},
|
64 |
-
"outputs": [
|
65 |
-
{
|
66 |
-
"name": "stderr",
|
67 |
-
"output_type": "stream",
|
68 |
-
"text": [
|
69 |
-
"C:\\Users\\Administrator\\AppData\\Local\\Temp\\2\\ipykernel_648\\3951191562.py:5: TqdmExperimentalWarning: Using `tqdm.autonotebook.tqdm` in notebook mode. Use `tqdm.tqdm` instead to force console mode (e.g. in jupyter console)\n",
|
70 |
-
" from tqdm.autonotebook import tqdm\n"
|
71 |
-
]
|
72 |
-
},
|
73 |
-
{
|
74 |
-
"name": "stdout",
|
75 |
-
"output_type": "stream",
|
76 |
-
"text": [
|
77 |
-
"Using device: cuda\n"
|
78 |
-
]
|
79 |
-
}
|
80 |
-
],
|
81 |
"source": [
|
82 |
"import os\n",
|
83 |
"import json\n",
|
@@ -86,12 +32,12 @@
|
|
86 |
"from tqdm.autonotebook import tqdm\n",
|
87 |
"\n",
|
88 |
"from sentence_transformers import SentenceTransformer\n",
|
|
|
89 |
"from mteb import MTEB\n",
|
90 |
"from mteb.abstasks.TaskMetadata import TaskMetadata\n",
|
91 |
"from mteb.abstasks.AbsTaskRetrieval import AbsTaskRetrieval\n",
|
92 |
"\n",
|
93 |
"from settings import MODEL_NAME, OUTPUT_DIR, DEVICE, BATCH_SIZE\n",
|
94 |
-
"\n",
|
95 |
"os.environ['WANDB_DISABLED'] = 'true'"
|
96 |
]
|
97 |
},
|
|
|
20 |
},
|
21 |
{
|
22 |
"cell_type": "code",
|
23 |
+
"execution_count": null,
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
24 |
"id": "030016c2",
|
25 |
"metadata": {},
|
26 |
+
"outputs": [],
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
27 |
"source": [
|
28 |
"import os\n",
|
29 |
"import json\n",
|
|
|
32 |
"from tqdm.autonotebook import tqdm\n",
|
33 |
"\n",
|
34 |
"from sentence_transformers import SentenceTransformer\n",
|
35 |
+
"\n",
|
36 |
"from mteb import MTEB\n",
|
37 |
"from mteb.abstasks.TaskMetadata import TaskMetadata\n",
|
38 |
"from mteb.abstasks.AbsTaskRetrieval import AbsTaskRetrieval\n",
|
39 |
"\n",
|
40 |
"from settings import MODEL_NAME, OUTPUT_DIR, DEVICE, BATCH_SIZE\n",
|
|
|
41 |
"os.environ['WANDB_DISABLED'] = 'true'"
|
42 |
]
|
43 |
},
|
step_04_Retrieval.ipynb
CHANGED
@@ -20,7 +20,7 @@
|
|
20 |
},
|
21 |
{
|
22 |
"cell_type": "code",
|
23 |
-
"execution_count":
|
24 |
"id": "01589fc8",
|
25 |
"metadata": {},
|
26 |
"outputs": [],
|
@@ -33,29 +33,11 @@
|
|
33 |
"import faiss\n",
|
34 |
"from sentence_transformers import SentenceTransformer, CrossEncoder\n",
|
35 |
"\n",
|
36 |
-
"from settings import OUTPUT_DIR, DEVICE\n",
|
37 |
-
"\n",
|
38 |
-
"os.environ['WANDB_DISABLED'] = 'true'\n",
|
39 |
-
"\n",
|
40 |
"from transformers import logging\n",
|
41 |
-
"logging.set_verbosity_error()"
|
42 |
-
|
43 |
-
|
44 |
-
|
45 |
-
"cell_type": "code",
|
46 |
-
"execution_count": 13,
|
47 |
-
"id": "057e852f",
|
48 |
-
"metadata": {},
|
49 |
-
"outputs": [],
|
50 |
-
"source": [
|
51 |
-
"# data = {\n",
|
52 |
-
"# 'corpus': pd.read_parquet('data/processed/corpus_data.parquet'),\n",
|
53 |
-
"# 'train' : pd.read_parquet('data/processed/train_data.parquet'),\n",
|
54 |
-
"# 'test' : pd.read_parquet('data/processed/test_data.parquet')\n",
|
55 |
-
"# }\n",
|
56 |
-
"# for split in ['train', 'test']:\n",
|
57 |
-
"# data[split]['cid'] = data[split]['cid'].apply(lambda x: x.tolist())\n",
|
58 |
-
"# data[split]['context_list'] = data[split]['context_list'].apply(lambda x: x.tolist())"
|
59 |
]
|
60 |
},
|
61 |
{
|
@@ -85,51 +67,51 @@
|
|
85 |
},
|
86 |
{
|
87 |
"cell_type": "code",
|
88 |
-
"execution_count":
|
89 |
"id": "62cc0ead",
|
90 |
"metadata": {},
|
91 |
"outputs": [],
|
92 |
"source": [
|
93 |
-
"passages
|
94 |
-
"
|
95 |
-
"
|
96 |
-
"
|
97 |
-
"
|
98 |
-
"
|
99 |
-
"
|
100 |
-
"
|
101 |
-
"
|
102 |
]
|
103 |
},
|
104 |
{
|
105 |
"cell_type": "code",
|
106 |
-
"execution_count":
|
107 |
"id": "465e8d2a",
|
108 |
"metadata": {},
|
109 |
"outputs": [],
|
110 |
"source": [
|
111 |
-
"
|
112 |
-
"
|
113 |
"\n",
|
114 |
-
"
|
115 |
-
"
|
116 |
-
"
|
117 |
]
|
118 |
},
|
119 |
{
|
120 |
"cell_type": "code",
|
121 |
-
"execution_count":
|
122 |
"id": "af365371",
|
123 |
"metadata": {},
|
124 |
"outputs": [],
|
125 |
"source": [
|
126 |
-
"
|
127 |
-
"
|
128 |
]
|
129 |
},
|
130 |
{
|
131 |
"cell_type": "code",
|
132 |
-
"execution_count":
|
133 |
"id": "9251d0db",
|
134 |
"metadata": {},
|
135 |
"outputs": [],
|
@@ -168,194 +150,18 @@
|
|
168 |
},
|
169 |
{
|
170 |
"cell_type": "code",
|
171 |
-
"execution_count":
|
172 |
"id": "ece21ef6",
|
173 |
"metadata": {},
|
174 |
-
"outputs": [
|
175 |
-
{
|
176 |
-
"name": "stdout",
|
177 |
-
"output_type": "stream",
|
178 |
-
"text": [
|
179 |
-
"[Rank 1] index=76423, score=0.6417\n",
|
180 |
-
"Tội làm nhục người khác\n",
|
181 |
-
"1. Người nào xúc phạm nghiêm trọng nhân phẩm, danh dự của người khác, thì bị phạt cảnh cáo, phạt tiền từ 10.000.000 đồng đến 30.000.000 đồng hoặc phạt cải tạo không giam giữ đến 03 năm.\n",
|
182 |
-
"...\n",
|
183 |
-
"--------------------------------------------------------------------------------\n",
|
184 |
-
"[Rank 2] index=99131, score=0.6155\n",
|
185 |
-
"“Người nào có hành vi xâm phạm danh dự, nhân phẩm của người khác mà gây thiệt hại thì phải bồi thường.”\n",
|
186 |
-
"--------------------------------------------------------------------------------\n",
|
187 |
-
"[Rank 3] index=228550, score=0.5932\n",
|
188 |
-
"i) Điều 353, các khoản 2, 3 và 4 (tội tham ô tài sản); Điều 354, các khoản 2, 3 và 4 (tội nhận hối lộ); Điều 355, các khoản 2, 3 và 4 (tội lạm dụng chức vụ, quyền hạn chiếm đoạt tài sản); Điều 356, các khoản 2 và 3 (tội lợi dụng chức vụ, quyền hạn trong khi thi hành công vụ); Điều 357, các khoản 2 và 3 (tội lạm quyền trong khi thi hành công vụ); ��iều 358, các khoản 2, 3 và 4 (tội lợi dụng chức vụ, quyền hạn gây ảnh hưởng đối với người khác để trục lợi); Điều 359, các khoản 2, 3 và 4 (tội giả mạo trong công tác); Điều 364, các khoản 2, 3 và 4 (tội đưa hối lộ); Điều 365, các khoản 2, 3 và 4 (tội làm môi giới hối lộ);\n",
|
189 |
-
"k) Điều 373, các khoản 3 và 4 (tội dùng nhục hình); Điều 374, các khoản 3 và 4 (tội bức cung); Điều 386, khoản 2 (tội trốn khỏi nơi giam, giữ hoặc trốn khi đang bị áp giải, dẫn giải, đang bị xét xử);\n",
|
190 |
-
"l) Các điều từ Điều 421 đến Điều 425 về các tội phá hoại hòa bình, chống loài người và tội phạm chiến tranh.\n",
|
191 |
-
"2. Phạm tội trong trường hợp lợi dụng chức vụ, quyền hạn cản trở việc phát hiện tội phạm hoặc có những hành vi khác bao che người phạm tội, thì bị phạt tù từ 02 năm đến 07 năm.\n",
|
192 |
-
"Điều 390. Tội không tố giác tội phạm\n",
|
193 |
-
"1. Người nào biết rõ một trong các tội phạm được quy định tại Điều 389 của Bộ luật này đang được chuẩn bị, đang hoặc đã được thực hiện mà không tố giác, nếu không thuộc trường hợp quy định tại khoản 2 Điều 19 của Bộ luật này, thì bị phạt cảnh cáo, phạt cải tạo không giam giữ đến 03 năm hoặc phạt tù từ 06 tháng đến 03 năm.\n",
|
194 |
-
"2. Người không tố giác nếu đã có hành động can ngăn người phạm tội hoặc hạn chế tác hại của tội phạm, thì có thể được miễn trách nhiệm hình sự hoặc miễn hình phạt.\n",
|
195 |
-
"Điều 391. Tội gây rối trật tự phiên tòa\n",
|
196 |
-
"1. Người nào tại phiên tòa mà thóa mạ, xúc phạm nghiêm trọng danh dự, nhân phẩm thành viên Hội đồng xét xử, những người khác có mặt tại phiên tòa hoặc có hành vi đập phá tài sản thì bị phạt tiền từ 10.000.000 đồng đến 100.000.000 đồng, phạt cải tạo không giam giữ đến 01 năm hoặc phạt tù từ 03 tháng đến 01 năm.\n",
|
197 |
-
"2. Phạm tội thuộc một trong các trường hợp sau đây, thì bị phạt tù từ 01 năm đến 03 năm:\n",
|
198 |
-
"a) Gây náo loạn phiên tòa dẫn đến phải dừng phiên tòa;\n",
|
199 |
-
"b) Hành hung thành viên Hội đồng xét xử.\n",
|
200 |
-
"--------------------------------------------------------------------------------\n",
|
201 |
-
"[Rank 4] index=228404, score=0.5660\n",
|
202 |
-
"Điều 155. Tội làm nhục người khác\n",
|
203 |
-
"1. Người nào xúc phạm nghiêm trọng nhân phẩm, danh dự của người khác, thì bị phạt cảnh cáo, phạt tiền từ 10.000.000 đồng đến 30.000.000 đồng hoặc phạt cải tạo không giam giữ đến 03 năm.\n",
|
204 |
-
"2. Phạm tội thuộc một trong các trường hợp sau đây, thì bị phạt tù từ 03 tháng đến 02 năm:\n",
|
205 |
-
"a) Phạm tội 02 lần trở lên;\n",
|
206 |
-
"b) Đối với 02 người trở lên;\n",
|
207 |
-
"c) Lợi dụng chức vụ, quyền hạn;\n",
|
208 |
-
"d) Đối với người đang thi hành công vụ;\n",
|
209 |
-
"đ) Đối với người dạy dỗ, nuôi dưỡng, chăm sóc, chữa bệnh cho mình;\n",
|
210 |
-
"e) Sử dụng mạng máy tính hoặc mạng viễn thông, phương tiện điện tử để phạm tội;\n",
|
211 |
-
"g) Gây rối loạn tâm thần và hành vi của nạn nhân từ 11% đến 45%.\n",
|
212 |
-
"3. Phạm tội thuộc một trong các trường hợp sau đây, thì bị phạt tù từ 02 năm đến 05 năm:\n",
|
213 |
-
"a) Gây rối loạn tâm thần và hành vi của nạn nhân 46% trở lên;\n",
|
214 |
-
"b) Làm nạn nhân tự sát.\n",
|
215 |
-
"4. Người phạm tội còn có thể bị cấm đảm nhiệm chức vụ, cấm hành nghề hoặc làm công việc nhất định từ 01 năm đến 05 năm.\n",
|
216 |
-
"--------------------------------------------------------------------------------\n",
|
217 |
-
"[Rank 5] index=143035, score=0.5470\n",
|
218 |
-
"Khoản 4. Người có hành vi xâm phạm thân thể, sức khỏe, tính mạng hoặc xúc phạm danh dự, nhân phẩm của người hành nghề và người khác làm việc tại cơ sở khám bệnh, chữa bệnh thì tùy theo tính chất, mức độ vi phạm mà bị xử lý vi phạm hành chính hoặc bị truy cứu trách nhiệm hình sự theo quy định của pháp luật.\n",
|
219 |
-
"--------------------------------------------------------------------------------\n",
|
220 |
-
"[Rank 6] index=57787, score=0.5443\n",
|
221 |
-
"\"Điều 7. Vi phạm quy định về trật tự công cộng\n",
|
222 |
-
"..\n",
|
223 |
-
"3. Phạt tiền từ 2.000.000 đồng đến 3.000.000 đồng đối với một trong những hành vi sau đây:\n",
|
224 |
-
"a) Có hành vi khiêu khích, trêu gh��o, xúc phạm, lăng mạ, bôi nhọ danh dự, nhân phẩm của người khác, trừ trường hợp quy định tại điểm b khoản 2 Điều 21 và Điều 54 Nghị định này;\n",
|
225 |
-
"...\n",
|
226 |
-
"14. Biện pháp khắc phục hậu quả:\n",
|
227 |
-
"a) Buộc khôi phục lại tình trạng ban đầu đối với hành vi vi phạm quy định tại điểm c khoản 1, điểm l khoản 2 và điểm e khoản 4 Điều này;\n",
|
228 |
-
"b) Buộc cải chính thông tin sai sự thật hoặc gây nhầm lẫn đối với hành vi vi phạm quy định tại điểm a khoản 3 và điểm i khoản 4 Điều này;\n",
|
229 |
-
"c) Buộc xin lỗi công khai đối với hành vi vi phạm quy định tại điểm a khoản 3, các điểm d và đ khoản 5 Điều này trừ trường hợp nạn nhân có đơn không yêu cầu;\n",
|
230 |
-
"d) Buộc thực hiện biện pháp khắc phục tình trạng ô nhiễm môi trường đối với hành vi vi phạm quy định tại điểm h khoản 5 Điều này;\n",
|
231 |
-
"đ) Buộc chi trả toàn bộ chi phí khám bệnh, chữa bệnh đối với hành vi vi phạm quy định tại điểm d khoản 1, điểm c khoản 2, điểm b khoản 3 và điểm a khoản 5 Điều này.\"\n",
|
232 |
-
"--------------------------------------------------------------------------------\n",
|
233 |
-
"[Rank 7] index=57120, score=0.5337\n",
|
234 |
-
"Vi phạm quy định về trật tự công cộng\n",
|
235 |
-
"...\n",
|
236 |
-
"2. Phạt tiền từ 1.000.000 đồng đến 2.000.000 đồng đối với một trong những hành vi sau đây:\n",
|
237 |
-
"...\n",
|
238 |
-
"b) Tổ chức, tham gia tụ tập nhiều người ở nơi công cộng gây mất trật tự công cộng;\n",
|
239 |
-
"...\n",
|
240 |
-
"3. Phạt tiền từ 2.000.000 đồng đến 3.000.000 đồng đối với một trong những hành vi sau đây:\n",
|
241 |
-
"a) Có hành vi khiêu khích, trêu ghẹo, xúc phạm, lăng mạ, bôi nhọ danh dự, nhân phẩm của người khác, trừ trường hợp quy định tại điểm b khoản 2 Điều 21 và Điều 54 Nghị định này;\n",
|
242 |
-
"b) Tổ chức, thuê, xúi giục, lôi kéo, dụ dỗ, kích động người khác cố ý gây thương tích hoặc gây tổn hại cho sức khỏe người khác hoặc xâm phạm danh dự, nhân phẩm của người khác nhưng không bị truy cứu trách nhiệm hình sự;\n",
|
243 |
-
"...\n",
|
244 |
-
"4. Phạt tiền từ 3.000.000 đồng đến 5.000.000 đồng đối với một trong những hành vi sau đây:\n",
|
245 |
-
"a) Tổ chức thuê, xúi giục, lôi kéo, dụ dỗ hoặc kích động người khác gây rối, làm mất trật tự công cộng;\n",
|
246 |
-
"b) Mang theo trong người hoặc tàng trữ, cất giấu các loại vũ khí thô sơ, công cụ hỗ trợ hoặc các loại công cụ, phương tiện khác có khả năng sát thương; đồ vật, phương tiện giao thông nhằm mục đích gây rối trật tự công cộng, cố ý gây thương tích cho người khác;\n",
|
247 |
-
"...\n",
|
248 |
-
"5. Phạt tiền từ 5.000.000 đồng đến 8.000.000 đồng đối với một trong những hành vi sau đây:\n",
|
249 |
-
"a) Cố ý gây thương tích hoặc gây tổn hại cho sức khỏe của người khác nhưng không bị truy cứu trách nhiệm hình sự;\n",
|
250 |
-
"b) Gây rối trật tự công cộng mà có mang theo các loại vũ khí thô sơ, công cụ hỗ trợ hoặc công cụ, đồ vật, phương tiện khác có khả năng sát thương;\n",
|
251 |
-
"...\n",
|
252 |
-
"13. Hình thức xử phạt bổ sung:\n",
|
253 |
-
"a) Tịch thu tang vật, phương tiện vi phạm hành chính đối với hành vi vi phạm quy định tại các điểm a, d, đ và g khoản 2; điểm đ khoản 3; các điểm b, e và i khoản 4; các điểm a, b và c khoản 5; các khoản 6 và 10 Điều này;\n",
|
254 |
-
"...\n",
|
255 |
-
"14. Biện pháp khắc phục hậu quả:\n",
|
256 |
-
"...\n",
|
257 |
-
"b) Buộc cải chính thông tin sai sự thật hoặc gây nhầm lẫn đối với hành vi vi phạm quy định tại điểm a khoản 3 và điểm i khoản 4 Điều này;\n",
|
258 |
-
"c) Buộc xin lỗi công khai đối với hành vi vi phạm quy định tại điểm a khoản 3, các điểm d và đ khoản 5 Điều này trừ trường hợp nạn nhân có đơn không yêu cầu;\n",
|
259 |
-
"...\n",
|
260 |
-
"đ) Buộc chi trả toàn bộ chi phí khám bệnh, chữa bệnh đối với hành vi vi phạm quy định tại điểm d khoản 1, điểm c khoản 2, điểm b khoản 3 và điểm a khoản 5 Điều này.\n",
|
261 |
-
"--------------------------------------------------------------------------------\n",
|
262 |
-
"[Rank 8] index=56183, score=0.5270\n",
|
263 |
-
"\"Điều 155. Tội làm nhục người khác\n",
|
264 |
-
"1. Người nào xúc phạm nghiêm trọng nhân phẩm, danh dự của người khác, thì bị phạt cảnh cáo, phạt tiền từ 10.000.000 đồng đến 30.000.000 đồng hoặc phạt cải tạo không giam giữ đến 03 năm.\n",
|
265 |
-
"2. Phạm tội thuộc một trong các trường hợp sau đây, thì bị phạt tù từ 03 tháng đến 02 năm:\n",
|
266 |
-
"a) Phạm tội 02 lần trở lên;\n",
|
267 |
-
"b) Đối với 02 người trở lên;\n",
|
268 |
-
"c) Lợi dụng chức vụ, quyền hạn;\n",
|
269 |
-
"d) Đối với người đang thi hành công vụ;\n",
|
270 |
-
"đ) Đối với người dạy dỗ, nuôi dưỡng, chăm sóc, chữa bệnh cho mình;\n",
|
271 |
-
"e) Sử dụng mạng máy tính hoặc mạng viễn thông, phương tiện điện tử để phạm tội;\n",
|
272 |
-
"g) Gây rối loạn tâm thần và hành vi của nạn nhân mà tỷ lệ tổn thương cơ thể từ 31% đến 60%”.\n",
|
273 |
-
"3. Phạm tội thuộc một trong các trường hợp sau đây, thì bị phạt tù từ 02 năm đến 05 năm:\n",
|
274 |
-
"a) Gây rối loạn tâm thần và hành vi của nạn nhân mà tỷ lệ tổn thương cơ thể 61% trở lên”;\n",
|
275 |
-
"b) Làm nạn nhân tự sát.\n",
|
276 |
-
"4. Người phạm tội còn có thể bị cấm đảm nhiệm chức vụ, cấm hành nghề hoặc làm công việc nhất định từ 01 năm đến 05 năm.\n",
|
277 |
-
"Điều 156. Tội vu khống\n",
|
278 |
-
"1. Người nào thực hiện một trong các hành vi sau đây, thì bị phạt tiền từ 10.000.000 đồng đến 50.000.000 đồng, phạt cải tạo không giam giữ đến 02 năm hoặc phạt tù từ 03 tháng đến 01 năm:\n",
|
279 |
-
"a) Bịa đặt hoặc loan truyền những điều biết rõ là sai sự thật nhằm xúc phạm nghiêm trọng nhân phẩm, danh dự hoặc gây thiệt hại đến quyền, lợi ích hợp pháp của người khác;\n",
|
280 |
-
"b) Bịa đặt người khác phạm tội và tố cáo họ trước cơ quan có thẩm quyền.\n",
|
281 |
-
"2. Phạm tội thuộc một trong các trường hợp sau đây, thì bị phạt tù từ 01 năm đến 03 năm:\n",
|
282 |
-
"a) Có tổ chức;\n",
|
283 |
-
"b) Lợi dụng chức vụ, quyền hạn;\n",
|
284 |
-
"c) Đối với 02 người trở lên;\n",
|
285 |
-
"d) Đối với ông, bà, cha, mẹ, người dạy dỗ, nuôi dưỡng, chăm sóc, giáo dục, chữa bệnh cho mình;\n",
|
286 |
-
"đ) Đối với người đang thi hành công vụ;\n",
|
287 |
-
"e) Sử dụng mạng máy tính hoặc mạng viễn thông, phương tiện điện tử để phạm tội;\n",
|
288 |
-
"g) Gây rối loạn tâm thần và hành vi của nạn nhân mà tỷ lệ tổn thương cơ thể từ 31% đến 60%;\n",
|
289 |
-
"h) Vu khống người khác phạm tội rất nghiêm trọng hoặc đặc biệt nghiêm trọng.\n",
|
290 |
-
"3. Phạm tội thuộc một trong các trường hợp sau đây, thì bị phạt tù từ 03 năm đến 07 năm:\n",
|
291 |
-
"a) Vì động cơ đê hèn;\n",
|
292 |
-
"b) Gây rối loạn tâm thần và hành vi của nạn nhân mà tỷ lệ tổn thương cơ thể 61% trở lên;\n",
|
293 |
-
"c) Làm nạn nhân tự sát.\n",
|
294 |
-
"4. Người phạm tội còn có thể bị phạt tiền từ 10.000.000 đồng đến 50.000.000 đồng, cấm đảm nhiệm chức vụ, cấm hành nghề hoặc làm công việc nhất định từ 01 năm đến 05 năm.\"\n",
|
295 |
-
"--------------------------------------------------------------------------------\n",
|
296 |
-
"[Rank 9] index=80022, score=0.5218\n",
|
297 |
-
"\"Điều 20.\n",
|
298 |
-
"1. Mọi người có quyền bất khả xâm phạm về thân thể, được pháp luật bảo hộ về sức khoẻ, danh dự và nhân phẩm; không bị tra tấn, bạo lực, truy bức, nhục hình hay bất kỳ hình thức đối xử nào khác xâm phạm thân thể, sức khỏe, xúc phạm danh dự, nhân phẩm.\"\n",
|
299 |
-
"--------------------------------------------------------------------------------\n",
|
300 |
-
"[Rank 10] index=52682, score=0.5203\n",
|
301 |
-
"\"Điều 589. Thiệt hại do tài sản bị xâm phạm\n",
|
302 |
-
"Thiệt hại do tài sản bị xâm phạm bao gồm:\n",
|
303 |
-
"1. Tài sản bị mất, bị hủy hoại hoặc bị hư hỏng.\n",
|
304 |
-
"2. Lợi ích gắn liền với việc sử dụng, khai thác tài sản bị mất, bị giảm sút.\n",
|
305 |
-
"3. Chi phí hợp lý để ngăn chặn, hạn chế và khắc phục thiệt hại.\n",
|
306 |
-
"4. Thiệt hại khác do luật quy định.\"\n",
|
307 |
-
"--------------------------------------------------------------------------------\n"
|
308 |
-
]
|
309 |
-
}
|
310 |
-
],
|
311 |
"source": [
|
312 |
"query = 'Tội xúc phạm danh dự'\n",
|
313 |
"hits = retrieval(fine_tuned_model, query, legal_index, top_k=10)\n",
|
314 |
"\n",
|
315 |
"for h in hits:\n",
|
316 |
-
" print(f\"[Rank {hits.index(h)+1}] index={h['index']}, score={h['score']:.4f}\")\n",
|
317 |
-
" print(f\"{h['text']}
|
318 |
-
|
319 |
-
},
|
320 |
-
{
|
321 |
-
"cell_type": "code",
|
322 |
-
"execution_count": null,
|
323 |
-
"id": "1bedd1a7",
|
324 |
-
"metadata": {},
|
325 |
-
"outputs": [],
|
326 |
-
"source": [
|
327 |
-
"# def search(model, query, index, k=10):\n",
|
328 |
-
"# query_embedding = model.encode(\n",
|
329 |
-
"# query, \n",
|
330 |
-
"# convert_to_numpy=True, \n",
|
331 |
-
"# normalize_embeddings=True,\n",
|
332 |
-
"# ).astype(np.float32).reshape(1, -1)\n",
|
333 |
-
"\n",
|
334 |
-
"# scores, indices = index.search(query_embedding, k*3)\n",
|
335 |
-
"# hits = [{'score': scores[0][i], 'index': indices[0][i]} for i in range(len(scores[0]))]\n",
|
336 |
-
"# return hits"
|
337 |
-
]
|
338 |
-
},
|
339 |
-
{
|
340 |
-
"cell_type": "code",
|
341 |
-
"execution_count": null,
|
342 |
-
"id": "4ef857db",
|
343 |
-
"metadata": {},
|
344 |
-
"outputs": [],
|
345 |
-
"source": [
|
346 |
-
"# hits = search(\n",
|
347 |
-
"# model=fine_tuned_model, \n",
|
348 |
-
"# query='Hợp đồng lao động là gì?', \n",
|
349 |
-
"# index=legal_index, \n",
|
350 |
-
"# k=10\n",
|
351 |
-
"# )\n",
|
352 |
-
"\n",
|
353 |
-
"# for rank, hit in enumerate(hits):\n",
|
354 |
-
"# print(f\"[Rank: {rank + 1}]\")\n",
|
355 |
-
"# print(f\"(Index: {hit['index']}Score: {hit['score']:.4f})\\n\")\n",
|
356 |
-
"# print(passages[hit['index']])\n",
|
357 |
-
"# print('-' * 100)\n",
|
358 |
-
"# print()"
|
359 |
]
|
360 |
}
|
361 |
],
|
|
|
20 |
},
|
21 |
{
|
22 |
"cell_type": "code",
|
23 |
+
"execution_count": null,
|
24 |
"id": "01589fc8",
|
25 |
"metadata": {},
|
26 |
"outputs": [],
|
|
|
33 |
"import faiss\n",
|
34 |
"from sentence_transformers import SentenceTransformer, CrossEncoder\n",
|
35 |
"\n",
|
|
|
|
|
|
|
|
|
36 |
"from transformers import logging\n",
|
37 |
+
"logging.set_verbosity_error()\n",
|
38 |
+
"\n",
|
39 |
+
"from settings import OUTPUT_DIR, DEVICE\n",
|
40 |
+
"os.environ['WANDB_DISABLED'] = 'true'"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
41 |
]
|
42 |
},
|
43 |
{
|
|
|
67 |
},
|
68 |
{
|
69 |
"cell_type": "code",
|
70 |
+
"execution_count": null,
|
71 |
"id": "62cc0ead",
|
72 |
"metadata": {},
|
73 |
"outputs": [],
|
74 |
"source": [
|
75 |
+
"passages = pd.read_parquet('data/processed/corpus_data.parquet')['text'].tolist()\n",
|
76 |
+
"corpus_embeddings = fine_tuned_model.encode(\n",
|
77 |
+
" passages, \n",
|
78 |
+
" batch_size=128,\n",
|
79 |
+
" convert_to_numpy=True, \n",
|
80 |
+
" normalize_embeddings=True,\n",
|
81 |
+
" show_progress_bar=True, \n",
|
82 |
+
" device=DEVICE,\n",
|
83 |
+
").astype(np.float32)"
|
84 |
]
|
85 |
},
|
86 |
{
|
87 |
"cell_type": "code",
|
88 |
+
"execution_count": null,
|
89 |
"id": "465e8d2a",
|
90 |
"metadata": {},
|
91 |
"outputs": [],
|
92 |
"source": [
|
93 |
+
"d = corpus_embeddings.shape[1] # 768\n",
|
94 |
+
"cpu_index = faiss.IndexFlatIP(d)\n",
|
95 |
"\n",
|
96 |
+
"res = faiss.StandardGpuResources()\n",
|
97 |
+
"gpu_index = faiss.index_cpu_to_gpu(res, 0, cpu_index)\n",
|
98 |
+
"gpu_index.add(corpus_embeddings)"
|
99 |
]
|
100 |
},
|
101 |
{
|
102 |
"cell_type": "code",
|
103 |
+
"execution_count": null,
|
104 |
"id": "af365371",
|
105 |
"metadata": {},
|
106 |
"outputs": [],
|
107 |
"source": [
|
108 |
+
"final_cpu_index = faiss.index_gpu_to_cpu(gpu_index)\n",
|
109 |
+
"faiss.write_index(final_cpu_index, 'data/retrieval/legal_faiss.index')"
|
110 |
]
|
111 |
},
|
112 |
{
|
113 |
"cell_type": "code",
|
114 |
+
"execution_count": null,
|
115 |
"id": "9251d0db",
|
116 |
"metadata": {},
|
117 |
"outputs": [],
|
|
|
150 |
},
|
151 |
{
|
152 |
"cell_type": "code",
|
153 |
+
"execution_count": null,
|
154 |
"id": "ece21ef6",
|
155 |
"metadata": {},
|
156 |
+
"outputs": [],
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
157 |
"source": [
|
158 |
"query = 'Tội xúc phạm danh dự'\n",
|
159 |
"hits = retrieval(fine_tuned_model, query, legal_index, top_k=10)\n",
|
160 |
"\n",
|
161 |
"for h in hits:\n",
|
162 |
+
" print(f\"[Rank {hits.index(h)+1}] - index={h['index']}, score={h['score']:.4f}]\")\n",
|
163 |
+
" print(f\"{h['text']}\")\n",
|
164 |
+
" print('-' * 100)"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
165 |
]
|
166 |
}
|
167 |
],
|