{ "cells": [ { "cell_type": "code", "execution_count": 11, "id": "1195e917", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Using device: cuda\n" ] } ], "source": [ "!python settings.py" ] }, { "cell_type": "code", "execution_count": 12, "id": "01589fc8", "metadata": {}, "outputs": [], "source": [ "import os\n", "import numpy as np\n", "import pandas as pd\n", "from tqdm.autonotebook import tqdm\n", "\n", "import faiss\n", "from sentence_transformers import SentenceTransformer, CrossEncoder\n", "\n", "from settings import OUTPUT_DIR, DEVICE\n", "\n", "os.environ['WANDB_DISABLED'] = 'true'\n", "\n", "from transformers import logging\n", "logging.set_verbosity_error()" ] }, { "cell_type": "code", "execution_count": 13, "id": "057e852f", "metadata": {}, "outputs": [], "source": [ "# data = {\n", "# 'corpus': pd.read_parquet('data/processed/corpus_data.parquet'),\n", "# 'train' : pd.read_parquet('data/processed/train_data.parquet'),\n", "# 'test' : pd.read_parquet('data/processed/test_data.parquet')\n", "# }\n", "# for split in ['train', 'test']:\n", "# data[split]['cid'] = data[split]['cid'].apply(lambda x: x.tolist())\n", "# data[split]['context_list'] = data[split]['context_list'].apply(lambda x: x.tolist())" ] }, { "cell_type": "code", "execution_count": 14, "id": "5634b72a", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "SentenceTransformer(\n", " (0): Transformer({'max_seq_length': 512, 'do_lower_case': False}) with Transformer model: BertModel \n", " (1): Pooling({'word_embedding_dimension': 768, 'pooling_mode_cls_token': False, 'pooling_mode_mean_tokens': True, 'pooling_mode_max_tokens': False, 'pooling_mode_mean_sqrt_len_tokens': False, 'pooling_mode_weightedmean_tokens': False, 'pooling_mode_lasttoken': False, 'include_prompt': True})\n", ")" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "fine_tuned_model = SentenceTransformer(OUTPUT_DIR, device=DEVICE)\n", "fine_tuned_model.half()" ] }, { "cell_type": "code", "execution_count": 15, "id": "62cc0ead", "metadata": {}, "outputs": [], "source": [ "passages = pd.read_parquet('data/processed/corpus_data.parquet')['text'].tolist()\n", "# corpus_embeddings = fine_tuned_model.encode(\n", "# passages, \n", "# batch_size=128,\n", "# convert_to_numpy=True, \n", "# normalize_embeddings=True,\n", "# show_progress_bar=True, \n", "# device=DEVICE,\n", "# ).astype(np.float32)" ] }, { "cell_type": "code", "execution_count": 16, "id": "465e8d2a", "metadata": {}, "outputs": [], "source": [ "# d = corpus_embeddings.shape[1] # 768\n", "# cpu_index = faiss.IndexFlatIP(d)\n", "\n", "# res = faiss.StandardGpuResources()\n", "# gpu_index = faiss.index_cpu_to_gpu(res, 0, cpu_index)\n", "# gpu_index.add(corpus_embeddings)" ] }, { "cell_type": "code", "execution_count": 17, "id": "af365371", "metadata": {}, "outputs": [], "source": [ "# final_cpu_index = faiss.index_gpu_to_cpu(gpu_index)\n", "# faiss.write_index(final_cpu_index, 'data/retrieval/legal_faiss.index')" ] }, { "cell_type": "code", "execution_count": 18, "id": "9251d0db", "metadata": {}, "outputs": [], "source": [ "legal_index = faiss.read_index('data/retrieval/legal_faiss.index')" ] }, { "cell_type": "code", "execution_count": 19, "id": "9f54c596", "metadata": {}, "outputs": [], "source": [ "def retrieval(emb_model, query, index, top_k=10):\n", " q_emb = emb_model.encode(\n", " query, \n", " convert_to_numpy=True, \n", " normalize_embeddings=True,\n", " ).astype(np.float32).reshape(1, -1)\n", " \n", " scores, indices = index.search(q_emb, top_k) # shape: (1, top_k)\n", " \n", " cand_idxs = indices[0]\n", " cand_scores = scores[0]\n", " cand_texts = [passages[i] for i in cand_idxs]\n", "\n", " results = [{\n", " 'index': int(cand_idxs[i]),\n", " 'score': float(cand_scores[i]),\n", " 'text': cand_texts[i]\n", " } for i in range(len(cand_idxs))]\n", " \n", " return results" ] }, { "cell_type": "code", "execution_count": 22, "id": "ece21ef6", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[Rank 1] index=76423, score=0.6417\n", "Tội làm nhục người khác\n", "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", "...\n", "--------------------------------------------------------------------------------\n", "[Rank 2] index=99131, score=0.6155\n", "“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", "--------------------------------------------------------------------------------\n", "[Rank 3] index=228550, score=0.5932\n", "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", "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", "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", "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", "Điều 390. Tội không tố giác tội phạm\n", "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", "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", "Điều 391. Tội gây rối trật tự phiên tòa\n", "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", "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", "a) Gây náo loạn phiên tòa dẫn đến phải dừng phiên tòa;\n", "b) Hành hung thành viên Hội đồng xét xử.\n", "--------------------------------------------------------------------------------\n", "[Rank 4] index=228404, score=0.5660\n", "Điều 155. Tội làm nhục người khác\n", "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", "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", "a) Phạm tội 02 lần trở lên;\n", "b) Đối với 02 người trở lên;\n", "c) Lợi dụng chức vụ, quyền hạn;\n", "d) Đối với người đang thi hành công vụ;\n", "đ) Đối với người dạy dỗ, nuôi dưỡng, chăm sóc, chữa bệnh cho mình;\n", "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", "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", "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", "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", "b) Làm nạn nhân tự sát.\n", "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", "--------------------------------------------------------------------------------\n", "[Rank 5] index=143035, score=0.5470\n", "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", "--------------------------------------------------------------------------------\n", "[Rank 6] index=57787, score=0.5443\n", "\"Điều 7. Vi phạm quy định về trật tự công cộng\n", "..\n", "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", "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", "...\n", "14. Biện pháp khắc phục hậu quả:\n", "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", "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", "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", "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", "đ) 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", "--------------------------------------------------------------------------------\n", "[Rank 7] index=57120, score=0.5337\n", "Vi phạm quy định về trật tự công cộng\n", "...\n", "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", "...\n", "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", "...\n", "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", "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", "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", "...\n", "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", "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", "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", "...\n", "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", "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", "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", "...\n", "13. Hình thức xử phạt bổ sung:\n", "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", "...\n", "14. Biện pháp khắc phục hậu quả:\n", "...\n", "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", "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", "...\n", "đ) 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", "--------------------------------------------------------------------------------\n", "[Rank 8] index=56183, score=0.5270\n", "\"Điều 155. Tội làm nhục người khác\n", "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", "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", "a) Phạm tội 02 lần trở lên;\n", "b) Đối với 02 người trở lên;\n", "c) Lợi dụng chức vụ, quyền hạn;\n", "d) Đối với người đang thi hành công vụ;\n", "đ) Đối với người dạy dỗ, nuôi dưỡng, chăm sóc, chữa bệnh cho mình;\n", "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", "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", "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", "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", "b) Làm nạn nhân tự sát.\n", "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", "Điều 156. Tội vu khống\n", "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", "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", "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", "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", "a) Có tổ chức;\n", "b) Lợi dụng chức vụ, quyền hạn;\n", "c) Đối với 02 người trở lên;\n", "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", "đ) Đối với người đang thi hành công vụ;\n", "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", "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", "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", "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", "a) Vì động cơ đê hèn;\n", "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", "c) Làm nạn nhân tự sát.\n", "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", "--------------------------------------------------------------------------------\n", "[Rank 9] index=80022, score=0.5218\n", "\"Điều 20.\n", "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", "--------------------------------------------------------------------------------\n", "[Rank 10] index=52682, score=0.5203\n", "\"Điều 589. Thiệt hại do tài sản bị xâm phạm\n", "Thiệt hại do tài sản bị xâm phạm bao gồm:\n", "1. Tài sản bị mất, bị hủy hoại hoặc bị hư hỏng.\n", "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", "3. Chi phí hợp lý để ngăn chặn, hạn chế và khắc phục thiệt hại.\n", "4. Thiệt hại khác do luật quy định.\"\n", "--------------------------------------------------------------------------------\n" ] } ], "source": [ "query = 'Tội xúc phạm danh dự'\n", "hits = retrieval(fine_tuned_model, query, legal_index, top_k=10)\n", "\n", "for h in hits:\n", " print(f\"[Rank {hits.index(h)+1}] index={h['index']}, score={h['score']:.4f}\")\n", " print(f\"{h['text']}\\n{'-'*80}\")" ] }, { "cell_type": "code", "execution_count": null, "id": "1bedd1a7", "metadata": {}, "outputs": [], "source": [ "# def search(model, query, index, k=10):\n", "# query_embedding = model.encode(\n", "# query, \n", "# convert_to_numpy=True, \n", "# normalize_embeddings=True,\n", "# ).astype(np.float32).reshape(1, -1)\n", "\n", "# scores, indices = index.search(query_embedding, k*3)\n", "# hits = [{'score': scores[0][i], 'index': indices[0][i]} for i in range(len(scores[0]))]\n", "# return hits" ] }, { "cell_type": "code", "execution_count": null, "id": "4ef857db", "metadata": {}, "outputs": [], "source": [ "# hits = search(\n", "# model=fine_tuned_model, \n", "# query='Hợp đồng lao động là gì?', \n", "# index=legal_index, \n", "# k=10\n", "# )\n", "\n", "# for rank, hit in enumerate(hits):\n", "# print(f\"[Rank: {rank + 1}]\")\n", "# print(f\"(Index: {hit['index']}Score: {hit['score']:.4f})\\n\")\n", "# print(passages[hit['index']])\n", "# print('-' * 100)\n", "# print()" ] } ], "metadata": { "kernelspec": { "display_name": "legal_doc_retrieval", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.10.16" } }, "nbformat": 4, "nbformat_minor": 5 }