SS3M commited on
Commit
d4b2c08
·
verified ·
1 Parent(s): 2c7c035

Upload 0_ent_175_negs_hr_05_wr25_1's state dict

Browse files
Files changed (38) hide show
  1. .gitattributes +1 -0
  2. 0_ent_175_negs_hr_05_wr25_1/0_ent_175_negs_hr_05_wr25_1.py +1934 -0
  3. 0_ent_175_negs_hr_05_wr25_1/lasts/0_ent_175_negs_hr_05_wr25_1_s26092004_f0_last_ema.pth +3 -0
  4. 0_ent_175_negs_hr_05_wr25_1/logs/0_ent_175_negs_hr_05_wr25_1_log_plot.jpg +3 -0
  5. 0_ent_175_negs_hr_05_wr25_1/logs/0_ent_175_negs_hr_05_wr25_1_s26092004_f0_logging.json +1 -0
  6. 0_ent_175_negs_hr_05_wr25_1/r1s/0_ent_175_negs_hr_05_wr25_1_s26092004_f0_r1_vs0.71461_ema.pth +3 -0
  7. 0_ent_175_negs_hr_05_wr25_1/results/0_ent_175_negs_hr_05_wr25_1_error_analyze_result.json +0 -0
  8. 0_ent_175_negs_hr_05_wr25_1/results/0_ent_175_negs_hr_05_wr25_1_pred_test.json +0 -0
  9. 0_ent_175_negs_hr_05_wr25_1/results/0_ent_175_negs_hr_05_wr25_1_test.json +26 -0
  10. 0_ent_175_negs_hr_05_wr25_1/results/0_ent_175_negs_hr_05_wr25_1_test_df.xlsx +0 -0
  11. 0_ent_175_negs_hr_05_wr25_1/results/0_ent_175_negs_hr_05_wr25_1_test_df_best.xlsx +0 -0
  12. 0_ent_175_negs_hr_05_wr25_1/results/all_splits/0_ent_175_negs_hr_05_wr25_1_predict_result_split_0.json +0 -0
  13. 0_ent_175_negs_hr_05_wr25_1/results/all_splits/0_ent_175_negs_hr_05_wr25_1_predict_result_split_1.json +0 -0
  14. 0_ent_175_negs_hr_05_wr25_1/results/all_splits/0_ent_175_negs_hr_05_wr25_1_predict_result_split_10.json +0 -0
  15. 0_ent_175_negs_hr_05_wr25_1/results/all_splits/0_ent_175_negs_hr_05_wr25_1_predict_result_split_11.json +0 -0
  16. 0_ent_175_negs_hr_05_wr25_1/results/all_splits/0_ent_175_negs_hr_05_wr25_1_predict_result_split_12.json +0 -0
  17. 0_ent_175_negs_hr_05_wr25_1/results/all_splits/0_ent_175_negs_hr_05_wr25_1_predict_result_split_13.json +0 -0
  18. 0_ent_175_negs_hr_05_wr25_1/results/all_splits/0_ent_175_negs_hr_05_wr25_1_predict_result_split_14.json +0 -0
  19. 0_ent_175_negs_hr_05_wr25_1/results/all_splits/0_ent_175_negs_hr_05_wr25_1_predict_result_split_15.json +0 -0
  20. 0_ent_175_negs_hr_05_wr25_1/results/all_splits/0_ent_175_negs_hr_05_wr25_1_predict_result_split_16.json +0 -0
  21. 0_ent_175_negs_hr_05_wr25_1/results/all_splits/0_ent_175_negs_hr_05_wr25_1_predict_result_split_17.json +0 -0
  22. 0_ent_175_negs_hr_05_wr25_1/results/all_splits/0_ent_175_negs_hr_05_wr25_1_predict_result_split_18.json +0 -0
  23. 0_ent_175_negs_hr_05_wr25_1/results/all_splits/0_ent_175_negs_hr_05_wr25_1_predict_result_split_19.json +0 -0
  24. 0_ent_175_negs_hr_05_wr25_1/results/all_splits/0_ent_175_negs_hr_05_wr25_1_predict_result_split_2.json +0 -0
  25. 0_ent_175_negs_hr_05_wr25_1/results/all_splits/0_ent_175_negs_hr_05_wr25_1_predict_result_split_20.json +0 -0
  26. 0_ent_175_negs_hr_05_wr25_1/results/all_splits/0_ent_175_negs_hr_05_wr25_1_predict_result_split_21.json +0 -0
  27. 0_ent_175_negs_hr_05_wr25_1/results/all_splits/0_ent_175_negs_hr_05_wr25_1_predict_result_split_22.json +0 -0
  28. 0_ent_175_negs_hr_05_wr25_1/results/all_splits/0_ent_175_negs_hr_05_wr25_1_predict_result_split_23.json +0 -0
  29. 0_ent_175_negs_hr_05_wr25_1/results/all_splits/0_ent_175_negs_hr_05_wr25_1_predict_result_split_24.json +0 -0
  30. 0_ent_175_negs_hr_05_wr25_1/results/all_splits/0_ent_175_negs_hr_05_wr25_1_predict_result_split_25.json +0 -0
  31. 0_ent_175_negs_hr_05_wr25_1/results/all_splits/0_ent_175_negs_hr_05_wr25_1_predict_result_split_26.json +1770 -0
  32. 0_ent_175_negs_hr_05_wr25_1/results/all_splits/0_ent_175_negs_hr_05_wr25_1_predict_result_split_3.json +0 -0
  33. 0_ent_175_negs_hr_05_wr25_1/results/all_splits/0_ent_175_negs_hr_05_wr25_1_predict_result_split_4.json +0 -0
  34. 0_ent_175_negs_hr_05_wr25_1/results/all_splits/0_ent_175_negs_hr_05_wr25_1_predict_result_split_5.json +0 -0
  35. 0_ent_175_negs_hr_05_wr25_1/results/all_splits/0_ent_175_negs_hr_05_wr25_1_predict_result_split_6.json +0 -0
  36. 0_ent_175_negs_hr_05_wr25_1/results/all_splits/0_ent_175_negs_hr_05_wr25_1_predict_result_split_7.json +0 -0
  37. 0_ent_175_negs_hr_05_wr25_1/results/all_splits/0_ent_175_negs_hr_05_wr25_1_predict_result_split_8.json +0 -0
  38. 0_ent_175_negs_hr_05_wr25_1/results/all_splits/0_ent_175_negs_hr_05_wr25_1_predict_result_split_9.json +0 -0
.gitattributes CHANGED
@@ -33,3 +33,4 @@ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
33
  *.zip filter=lfs diff=lfs merge=lfs -text
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
 
 
33
  *.zip filter=lfs diff=lfs merge=lfs -text
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
36
+ 0_ent_175_negs_hr_05_wr25_1/logs/0_ent_175_negs_hr_05_wr25_1_log_plot.jpg filter=lfs diff=lfs merge=lfs -text
0_ent_175_negs_hr_05_wr25_1/0_ent_175_negs_hr_05_wr25_1.py ADDED
@@ -0,0 +1,1934 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # %% [code]
2
+ get_ipython().system('pip install evaluate seqeval underthesea positional-encodings[pytorch]')
3
+
4
+ # %% [code]
5
+ import warnings
6
+ warnings.filterwarnings('ignore')
7
+
8
+ import torch
9
+ import torch.nn as nn
10
+ import torch.optim as optim
11
+ from torch.utils.data import Dataset, TensorDataset, DataLoader
12
+ import torch.nn.functional as F
13
+ import albumentations as albu
14
+ from transformers import AutoTokenizer, AutoModel
15
+ import torch.distributed as dist
16
+ from torch.nn.parallel import DistributedDataParallel as DDP
17
+ from positional_encodings.torch_encodings import PositionalEncoding1D
18
+
19
+ from sklearn.metrics import f1_score
20
+ from sklearn.preprocessing import MinMaxScaler, StandardScaler
21
+ from scipy.spatial.transform import Rotation as R
22
+ from sklearn.model_selection import KFold, StratifiedGroupKFold, GroupKFold, StratifiedKFold
23
+ from sklearn.metrics import precision_recall_fscore_support
24
+ from timm.utils import ModelEmaV3
25
+ import timm
26
+
27
+ import os
28
+ import gc
29
+ import json
30
+ from pathlib import Path
31
+ import pickle
32
+ from tqdm.auto import tqdm
33
+ import copy
34
+ import numpy as np
35
+ import pandas as pd
36
+ import polars as pl
37
+ from PIL import Image
38
+ import time
39
+ from tqdm import tqdm
40
+ from matplotlib import pyplot as plt
41
+ import seaborn as sns
42
+ from multiprocessing import Manager as MemoryManager
43
+ from functools import lru_cache
44
+ import shutil
45
+ import glob
46
+ import cv2
47
+ import random
48
+ import re
49
+ import joblib
50
+ import math
51
+ from huggingface_hub import HfApi, snapshot_download
52
+ import evaluate
53
+ from underthesea import word_tokenize as vi_tokenize_tool
54
+ import spacy
55
+ en_tokenize_tool = spacy.load("en_core_web_sm")
56
+ from collections import defaultdict, Counter
57
+
58
+ # %% [code]
59
+ # Global config
60
+ SEEDS = [26092004]
61
+ topk = 1
62
+ nfolds = 5
63
+ only_fold_idx = 0
64
+ test_only = 0
65
+ debug_only = 0
66
+
67
+ # Config thư mục
68
+ dataset = 'kltn/only_entities' # conll003, ontonotes, phoner, vietbio, vietmed, vimed, kltn/only_entities, kltn/raw
69
+ root_dir = f'/kaggle/input/notebooks/sambui22022517/kltn-data/{dataset}' ## Thư mục chứa file train, val, test
70
+ train_dir = f'{root_dir}'
71
+ # val_dir = f'{root_dir}/val'
72
+ test_dir = f'{root_dir}'
73
+
74
+ # Config checkpoints
75
+
76
+ # Config training
77
+ epochs = 18 if not debug_only else 2
78
+ batch_size = 32
79
+ device = "cuda" if torch.cuda.is_available() else "cpu"
80
+ # # Thêm biến toàn cục nào đó vào đây
81
+ repo_name = 'SS3M/kltn-ien-experiments'
82
+ state_dict_save_name = "0_ent_175_negs_hr_05_wr25_1"
83
+ checkpoints_dir = state_dict_save_name
84
+ pretrained_dir = "/kaggle/working"
85
+ os.makedirs(f'{checkpoints_dir}', exist_ok=True)
86
+
87
+ backbone_model_name = "bert-base-uncased" if dataset in ["conll003", "ontonotes"] else "vinai/phobert-base"
88
+ word_tokenize = lambda text: [token.text for token in en_tokenize_tool(text)] if dataset == dataset in ["conll003", "ontonotes"] else vi_tokenize_tool(text)
89
+ max_len_dict = {
90
+ 'kltn/raw': 256,
91
+ 'kltn/only_entities': 68,
92
+ 'conll003': 46,
93
+ 'ontonotes': 61,
94
+ 'phoner': 68,
95
+ 'vietbio': 125,
96
+ 'vietmed': 36,
97
+ 'vimed': 100,
98
+ }
99
+ zero_entities_rate_dict = {
100
+ 'kltn/raw': 1000,
101
+ 'kltn/only_entities': 0.2,
102
+ 'conll003': 1000, # mean keep all zero-entities samples
103
+ 'ontonotes': 1000,
104
+ 'phoner': 1000,
105
+ 'vietbio': 1000,
106
+ 'vietmed': 1000,
107
+ 'vimed': 1000,
108
+ }
109
+
110
+ max_len = max_len_dict[dataset]
111
+ max_n_parts = 3 if dataset in ['kltn/raw'] else 1
112
+ max_span_len = 14
113
+ zero_entities_rate = zero_entities_rate_dict[dataset]
114
+ n_negs = 175
115
+
116
+ # Trainer
117
+ trainer_params = {
118
+ "training_time": "00:11:30:00",
119
+ "eval_mode": "max",
120
+ "topk": topk,
121
+ "save_name": state_dict_save_name,
122
+ "save_best": True,
123
+ "save_last": True,
124
+ "device": device,
125
+ "logging": True,
126
+ "logging_file": True,
127
+ "checkpoints_dir": checkpoints_dir,
128
+ "early_stopping": 30,
129
+ "eval_from_ratio": 0.4,
130
+ "eval_every": 1,
131
+ "schedule_in_step": False,
132
+ "use_ema": True,
133
+ "ema_from_ratio": 0.3,
134
+ "ema_decay": 0.9995,
135
+ "max_grad_norm": 200.0,
136
+ "return_best": True,
137
+ "return_last": True,
138
+ }
139
+
140
+ # Memory
141
+ train_memory_params = {
142
+ 'max_len': max_len,
143
+ 'max_n_parts': max_n_parts,
144
+ 'max_span_len': max_span_len,
145
+ 'n_negs': n_negs,
146
+ 'weight_sampling': True,
147
+ 'weight_rate': 2.5,
148
+ 'hard_rate': 0.5,
149
+ }
150
+ val_memory_params = {
151
+ 'max_len': max_len,
152
+ 'max_n_parts': max_n_parts,
153
+ 'max_span_len': max_span_len,
154
+ 'n_negs': n_negs,
155
+ 'weight_sampling': True,
156
+ 'weight_rate': 2.5,
157
+ 'hard_rate': 0.5,
158
+ }
159
+
160
+ # Data Loader
161
+ def seed_worker(worker_id):
162
+ worker_seed = torch.initial_seed() % 2**32
163
+ np.random.seed(worker_seed)
164
+ random.seed(worker_seed)
165
+
166
+ train_loader_params = {
167
+ 'batch_size': batch_size,
168
+ 'shuffle': True,
169
+ 'pin_memory':True,
170
+ 'num_workers': 2,
171
+ 'drop_last': False,
172
+ 'worker_init_fn': seed_worker,
173
+ 'persistent_workers': False,
174
+ }
175
+ val_loader_params = {
176
+ 'batch_size': batch_size,
177
+ 'shuffle': False,
178
+ 'pin_memory':True,
179
+ 'num_workers': 1,
180
+ 'drop_last': False,
181
+ 'worker_init_fn': seed_worker,
182
+ 'persistent_workers': False,
183
+ }
184
+
185
+ # Model
186
+ model_params = {
187
+ 'backbone_model_name': backbone_model_name,
188
+ }
189
+
190
+ # Loss Func
191
+ loss_func_params = {
192
+
193
+ }
194
+ eval_func_params = {}
195
+
196
+ # Optim
197
+ optim_params = {
198
+ 'name': 'AdamW',
199
+ 'lr': 1e-4,
200
+ 'weight_decay': 1e-4,
201
+ }
202
+ scheduler_params = {
203
+ 'name': 'CosineAnnealingLR',
204
+ 'T_max': 20, # Số epoch để hoàn thành một chu kỳ giảm LR
205
+ 'eta_min': 1e-6 # Learning rate nhỏ nhất trong chu kỳ
206
+ }
207
+
208
+ # %% [code]
209
+ def set_seed(seed=42):
210
+ random.seed(seed)
211
+ np.random.seed(seed)
212
+ torch.manual_seed(seed)
213
+ torch.cuda.manual_seed(seed)
214
+ torch.cuda.manual_seed_all(seed) # if using multi-GPU
215
+ torch.use_deterministic_algorithms(False)
216
+ torch.backends.cudnn.deterministic = True
217
+ torch.backends.cudnn.benchmark = False
218
+ os.environ['PYTHONHASHSEED'] = str(seed)
219
+
220
+ # %% [code]
221
+ class CustomLoss(nn.Module):
222
+ def __init__(self):
223
+ super().__init__()
224
+
225
+ def forward(self, logits, labels, weights=None):
226
+ B, N, C = logits.shape
227
+
228
+ flat_logits = logits.reshape(-1, C)
229
+ flat_labels = labels.reshape(-1)
230
+
231
+ valid_mask = flat_labels != -100
232
+
233
+ if valid_mask.any():
234
+ losses = F.cross_entropy(
235
+ flat_logits,
236
+ flat_labels,
237
+ reduction='none'
238
+ )
239
+
240
+ losses = losses[valid_mask]
241
+
242
+ if weights is not None:
243
+ flat_weights = weights.reshape(-1)[valid_mask]
244
+ span_loss = (losses * flat_weights).mean()
245
+ else:
246
+ span_loss = losses.mean()
247
+
248
+ else:
249
+ span_loss = logits.new_tensor(0.0)
250
+
251
+ return {
252
+ "total": span_loss,
253
+ "span_loss": span_loss,
254
+ }
255
+
256
+ # %% [code]
257
+ ## Viết eval_fn vào đây
258
+
259
+ # Bỏ hết eval_fn và trọng số vào đây
260
+ class CustomEvalFn(nn.Module):
261
+ def __init__(self):
262
+ super().__init__()
263
+
264
+ def compute_f1(self, tp, fp, fn):
265
+ precision = tp / (tp + fp + 1e-8)
266
+ recall = tp / (tp + fn + 1e-8)
267
+ f1 = 2 * precision * recall / (precision + recall + 1e-8)
268
+ return precision, recall, f1
269
+
270
+ def forward(self, pred, gold):
271
+ pred_set = set(pred)
272
+ gold_set = set(gold)
273
+
274
+ tp = len(pred_set & gold_set)
275
+ fp = len(pred_set - gold_set)
276
+ fn = len(gold_set - pred_set)
277
+
278
+ precision, recall, f1 = self.compute_f1(tp, fp, fn)
279
+
280
+ return {
281
+ f"precision": precision,
282
+ f"recall": recall,
283
+ f"f1": f1,
284
+ }
285
+
286
+ class SpanErrorAnalyzer:
287
+ def __init__(self, pad_token_id=0):
288
+ self.pad_token_id = pad_token_id
289
+
290
+ # ===== helper =====
291
+ def _to_set(self, data):
292
+ """
293
+ data: list of (b, tuple(ids))
294
+ -> dict[b] = set(tuple(ids))
295
+ """
296
+ res = defaultdict(set)
297
+ for b, ids in data:
298
+ ids = tuple([i for i in ids if i != self.pad_token_id])
299
+ if len(ids) > 0:
300
+ res[b].add(ids)
301
+ return res
302
+
303
+ def _iou(self, a, b):
304
+ """
305
+ a, b: tuple(ids)
306
+ """
307
+ set_a, set_b = set(a), set(b)
308
+ inter = len(set_a & set_b)
309
+ union = len(set_a | set_b)
310
+ if union == 0:
311
+ return 0.0
312
+ return inter / union
313
+
314
+ def _boundary_error(self, pred, gold):
315
+ """
316
+ đo lệch boundary dựa trên overlap prefix/suffix
317
+ """
318
+ # left match
319
+ left = 0
320
+ for i in range(min(len(pred), len(gold))):
321
+ if pred[i] == gold[i]:
322
+ left += 1
323
+ else:
324
+ break
325
+
326
+ # right match
327
+ right = 0
328
+ for i in range(1, min(len(pred), len(gold)) + 1):
329
+ if pred[-i] == gold[-i]:
330
+ right += 1
331
+ else:
332
+ break
333
+
334
+ return {
335
+ "left_match": left,
336
+ "right_match": right,
337
+ "pred_len": len(pred),
338
+ "gold_len": len(gold),
339
+ }
340
+
341
+ # ===== main =====
342
+ def analyze(self, preds, golds):
343
+ pred_map = self._to_set(preds)
344
+ gold_map = self._to_set(golds)
345
+
346
+ all_batches = set(pred_map.keys()) | set(gold_map.keys())
347
+
348
+ stats = Counter()
349
+
350
+ detailed_errors = []
351
+
352
+ for b in all_batches:
353
+ pset = pred_map.get(b, set())
354
+ gset = gold_map.get(b, set())
355
+
356
+ matched_gold = set()
357
+
358
+ # ===== check predictions =====
359
+ for p in pset:
360
+ if p in gset:
361
+ stats["exact_match"] += 1
362
+ matched_gold.add(p)
363
+ else:
364
+ # tìm gold gần nhất
365
+ best_iou = 0
366
+ best_g = None
367
+
368
+ for g in gset:
369
+ iou = self._iou(p, g)
370
+ if iou > best_iou:
371
+ best_iou = iou
372
+ best_g = g
373
+
374
+ if best_iou > 0:
375
+ stats["partial_match"] += 1
376
+
377
+ boundary = self._boundary_error(p, best_g)
378
+
379
+ detailed_errors.append({
380
+ "type": "boundary_error",
381
+ "batch": b,
382
+ "pred": p,
383
+ "gold": best_g,
384
+ "iou": best_iou,
385
+ **boundary
386
+ })
387
+ else:
388
+ if b not in gold_map:
389
+ stats["no_event_sample"] += 1
390
+ err_type = "no_event_sample"
391
+ else:
392
+ stats["completely_wrong"] += 1
393
+ err_type = "completely_wrong"
394
+
395
+ detailed_errors.append({
396
+ "type": err_type,
397
+ "batch": b,
398
+ "pred": p
399
+ })
400
+
401
+ # ===== check missing =====
402
+ for g in gset:
403
+ if g not in matched_gold:
404
+ # check if any pred overlaps
405
+ overlap = any(self._iou(p, g) > 0 for p in pset)
406
+
407
+ if overlap:
408
+ stats["miss_with_overlap"] += 1
409
+ else:
410
+ stats["miss"] += 1
411
+
412
+ detailed_errors.append({
413
+ "type": "miss",
414
+ "batch": b,
415
+ "gold": g
416
+ })
417
+
418
+ return {
419
+ "summary": {
420
+ "exact_match": (stats["exact_match"], stats["exact_match"] / len(preds)),
421
+ "partial_match": (stats["partial_match"], stats["partial_match"] / len(preds)),
422
+ "no_event_sample": (stats["no_event_sample"], stats["no_event_sample"] / len(preds)),
423
+ "completely_wrong": (stats["completely_wrong"], stats["completely_wrong"] / len(preds)),
424
+ "miss": (stats["miss"], stats["miss"] / len(golds)),
425
+ "miss_with_overlap": (stats["miss_with_overlap"], stats["miss_with_overlap"] / len(golds)),
426
+ },
427
+ "details": detailed_errors
428
+ }
429
+
430
+ # %% [code]
431
+ class DataParallelProxy(nn.DataParallel):
432
+ def __getattr__(self, name):
433
+ try:
434
+ return super().__getattr__(name)
435
+
436
+ except AttributeError:
437
+
438
+ attr = getattr(self.module, name)
439
+
440
+ if callable(attr):
441
+
442
+ def wrapper(*args, **kwargs):
443
+ return self._parallel_apply_method(
444
+ name,
445
+ *args,
446
+ **kwargs
447
+ )
448
+
449
+ return wrapper
450
+
451
+ return attr
452
+
453
+ def _parallel_apply_method(self, method_name, *inputs, **kwargs):
454
+ if not self.device_ids:
455
+ return getattr(self.module, method_name)(*inputs, **kwargs)
456
+
457
+ inputs_scattered, kwargs_scattered = self.scatter(
458
+ inputs,
459
+ kwargs,
460
+ self.device_ids
461
+ )
462
+
463
+ replicas = self.replicate(
464
+ self.module,
465
+ self.device_ids[:len(inputs_scattered)]
466
+ )
467
+
468
+ outputs = self.parallel_apply(
469
+ [getattr(replica, method_name) for replica in replicas],
470
+ inputs_scattered,
471
+ kwargs_scattered
472
+ )
473
+
474
+ return self._custom_gather(outputs, self.output_device)
475
+
476
+ def gather(self, outputs, output_device):
477
+ return self._custom_gather(outputs, output_device)
478
+
479
+ def _custom_gather(self, outputs, output_device):
480
+ first = outputs[0]
481
+
482
+ if torch.is_tensor(first):
483
+ return self._gather_tensor(outputs, output_device)
484
+
485
+ if isinstance(first, tuple):
486
+ return tuple(
487
+ self._custom_gather(
488
+ list(items),
489
+ output_device
490
+ )
491
+ for items in zip(*outputs)
492
+ )
493
+
494
+ if isinstance(first, list):
495
+ if len(first) > 0 and torch.is_tensor(first[0]):
496
+ return self._gather_tensor_list(outputs, output_device)
497
+
498
+ merged = []
499
+ for out in outputs:
500
+ merged.extend(out)
501
+ return merged
502
+
503
+ if isinstance(first, dict):
504
+ return {
505
+ k: self._custom_gather(
506
+ [o[k] for o in outputs],
507
+ output_device
508
+ )
509
+ for k in first.keys()
510
+ }
511
+ return outputs
512
+
513
+ def _gather_tensor(self, tensors, output_device):
514
+ tensors = [
515
+ t.to(output_device)
516
+ for t in tensors
517
+ ]
518
+
519
+ try:
520
+ return torch.cat(tensors, dim=0)
521
+ except RuntimeError:
522
+ pass
523
+
524
+ max_shape = list(tensors[0].shape)
525
+ for t in tensors[1:]:
526
+ for d in range(len(max_shape)):
527
+ max_shape[d] = max(max_shape[d], t.shape[d])
528
+
529
+ padded = []
530
+ for t in tensors:
531
+ pad = []
532
+
533
+ for d in reversed(range(len(max_shape))):
534
+ if d == 0:
535
+ pad.extend([0, 0])
536
+ continue
537
+
538
+ diff = max_shape[d] - t.shape[d]
539
+ pad.extend([0, diff])
540
+
541
+ t = F.pad(t, pad)
542
+ padded.append(t)
543
+ return torch.cat(padded, dim=0)
544
+
545
+ def _gather_tensor_list(self, outputs, output_device):
546
+ merged = []
547
+
548
+ for out in outputs:
549
+ merged.extend(out)
550
+
551
+ return self._gather_tensor(merged, output_device)
552
+
553
+ # %% [code]
554
+ class SpanExtractor(nn.Module):
555
+ def __init__(self, hidden_size):
556
+ super().__init__()
557
+
558
+ # self.start_proj = MLP(hidden_size, hidden_size, hidden_size)
559
+ # self.end_proj = MLP(hidden_size, hidden_size, hidden_size)
560
+
561
+ self.span_attn = nn.Sequential(
562
+ nn.Linear(hidden_size, hidden_size),
563
+ nn.GELU(),
564
+ nn.Linear(hidden_size, 1)
565
+ )
566
+
567
+ def forward(self, hidden_states, spans):
568
+ B, L, H = hidden_states.shape
569
+ N = spans.size(1)
570
+
571
+ start_hidden = hidden_states
572
+ end_hidden = hidden_states
573
+
574
+ batch_idx = torch.arange(B, device=hidden_states.device).unsqueeze(1)
575
+ start_idx = spans[..., 0]
576
+ end_idx = spans[..., 1]
577
+
578
+ start_h = start_hidden[batch_idx, start_idx]
579
+ end_h = end_hidden[batch_idx, end_idx]
580
+
581
+ token_idx = torch.arange(L, device=hidden_states.device).view(1, 1, L)
582
+ span_mask = (token_idx >= start_idx.unsqueeze(-1)) & (token_idx <= end_idx.unsqueeze(-1))
583
+
584
+ attn_scores = self.span_attn(hidden_states).squeeze(-1).unsqueeze(1).expand(-1, N, -1)
585
+ attn_scores = attn_scores.masked_fill(~span_mask, float('-inf'))
586
+ attn_weights = torch.softmax(attn_scores, dim=-1)
587
+ span_context = torch.einsum("bnl,blh->bnh", attn_weights, hidden_states)
588
+
589
+ span_repr = torch.cat([start_h, end_h, end_h - start_h, end_h * start_h, span_context], dim=-1)
590
+ # span_repr = torch.cat([start_h, end_h, span_context], dim=-1)
591
+
592
+ return span_repr
593
+
594
+ class MLP(nn.Module):
595
+ def __init__(self, in_size, hid_size, out_size, dropout=0.1):
596
+ super().__init__()
597
+
598
+ self.input_proj = nn.Identity() if in_size == hid_size else nn.Linear(in_size, hid_size)
599
+
600
+ self.block = nn.Sequential(
601
+ nn.Linear(hid_size, hid_size),
602
+ nn.LayerNorm(hid_size),
603
+ nn.GELU(),
604
+ nn.Dropout(dropout),
605
+
606
+ nn.Linear(hid_size, hid_size),
607
+ nn.LayerNorm(hid_size),
608
+ nn.GELU(),
609
+ nn.Dropout(dropout),
610
+ )
611
+
612
+ self.out = nn.Linear(hid_size, out_size)
613
+
614
+ def forward(self, x):
615
+ x = self.input_proj(x)
616
+ x = x + self.block(x) # residual
617
+ return self.out(x)
618
+
619
+ class IEModel(nn.Module):
620
+ def __init__(self, backbone_model_name, num_labels):
621
+ super().__init__()
622
+
623
+ self.encoder = AutoModel.from_pretrained(backbone_model_name)
624
+ hidden_size = self.encoder.config.hidden_size
625
+
626
+ self.span_extractor = SpanExtractor(hidden_size)
627
+ self.spans_classifier = MLP(5 * hidden_size, hidden_size, num_labels)
628
+
629
+ def encode(self, input_ids, attention_mask):
630
+ B, n_parts, L = input_ids.shape
631
+
632
+ input_ids = input_ids.view(-1, L)
633
+ attention_mask = attention_mask.view(-1, L)
634
+
635
+ outputs = self.encoder(input_ids=input_ids, attention_mask=attention_mask)
636
+ hidden_states = outputs.last_hidden_state
637
+
638
+ hidden_states = hidden_states.view(B, n_parts, L, -1).reshape(B, n_parts * L, -1)
639
+ return hidden_states
640
+
641
+ def get_span_logits(self, span_reprs):
642
+ return self.spans_classifier(span_reprs)
643
+
644
+ def forward(self, input_ids, attention_mask, sampled_spans):
645
+ hidden_states = self.encode(input_ids, attention_mask)
646
+
647
+ span_reprs = self.span_extractor(hidden_states, sampled_spans)
648
+ span_logits = self.get_span_logits(span_reprs)
649
+ return span_logits
650
+
651
+ def test_model():
652
+ model = nn.DataParallel(IEModel(backbone_model_name, 17)).to(device)
653
+ model.eval()
654
+ total_params = sum(p.numel() for p in model.parameters())
655
+ print(f"Total params: {total_params:,}")
656
+
657
+ vocab_size = model.module.encoder.config.vocab_size
658
+ max_len = model.module.encoder.config.max_position_embeddings
659
+
660
+ bz = 32
661
+ i = torch.randint(0, vocab_size, (bz, 5, 10)).to(device)
662
+ a = torch.ones(bz, 5, 10).to(device)
663
+ s = torch.ones(bz, 3, 2, dtype=torch.long).to(device)
664
+ gs = torch.ones(bz, 3, 2, dtype=torch.long).to(device)
665
+
666
+ with torch.no_grad():
667
+ r = model(i, a, s)
668
+
669
+ if type(r) == tuple:
670
+ print([r[i].shape if type(r[i]) == type(torch.Tensor()) else len(r[i]) for i in range(len(r))])
671
+ else:
672
+ print(r.shape)
673
+
674
+ test_model()
675
+
676
+ # %% [code]
677
+ def configure_optimizers(network, optim_params, scheduler_params):
678
+ try:
679
+ optim_params = copy.copy(optim_params)
680
+ scheduler_params = copy.copy(scheduler_params)
681
+
682
+ optim_name = optim_params.pop('name')
683
+ scheduler_name = scheduler_params.pop('name')
684
+
685
+ optimizer_cls = globals().get(optim_name) or getattr(optim, optim_name, None)
686
+ scheduler_cls = globals().get(scheduler_name) or getattr(optim.lr_scheduler, scheduler_name, None)
687
+
688
+ if optimizer_cls is None:
689
+ raise ValueError(f"Optimizer '{optim_name}' is not available!")
690
+
691
+ optimizer = optimizer_cls(network.parameters(), **optim_params)
692
+
693
+ scheduler = None
694
+ if scheduler_params and scheduler_cls: # Chỉ tạo scheduler nếu có tham số
695
+ scheduler = scheduler_cls(optimizer, **scheduler_params)
696
+
697
+ return optimizer, scheduler
698
+
699
+ except KeyError as e:
700
+ raise ValueError(f"Missing {e} in config!!")
701
+
702
+ def freeze(self, model):
703
+ model.eval()
704
+ for param in model.parameters():
705
+ param.requires_grad = False
706
+
707
+ def unfreeze(self, model):
708
+ model.train()
709
+ for param in model.parameters():
710
+ param.requires_grad = True
711
+
712
+ def reduce_batch_size(loader, ratio=0.5):
713
+ new_bs = max(1, int(loader.batch_size * ratio))
714
+
715
+ shuffle = isinstance(loader.sampler, RandomSampler)
716
+
717
+ new_loader = DataLoader(
718
+ dataset=loader.dataset,
719
+ batch_size=new_bs,
720
+ shuffle=shuffle,
721
+ sampler=None if shuffle else loader.sampler,
722
+ num_workers=loader.num_workers,
723
+ collate_fn=loader.collate_fn,
724
+ pin_memory=loader.pin_memory,
725
+ drop_last=loader.drop_last,
726
+ timeout=loader.timeout,
727
+ worker_init_fn=loader.worker_init_fn,
728
+ multiprocessing_context=loader.multiprocessing_context,
729
+ generator=loader.generator,
730
+ prefetch_factor=loader.prefetch_factor if loader.num_workers > 0 else None,
731
+ persistent_workers=loader.persistent_workers,
732
+ pin_memory_device=loader.pin_memory_device
733
+ )
734
+
735
+ return new_loader
736
+
737
+ def list_to_tuple(x):
738
+ if isinstance(x, (list, tuple)):
739
+ return tuple(list_to_tuple(i) for i in x)
740
+ return x
741
+
742
+ def fmt(x):
743
+ if isinstance(x, float):
744
+ return round(x, 5)
745
+ if isinstance(x, dict):
746
+ return {k: fmt(v) for k, v in x.items()}
747
+ if isinstance(x, list):
748
+ return [fmt(v) for v in x]
749
+ return x
750
+
751
+ class ModelEmaV3Proxy(ModelEmaV3):
752
+ def __getattr__(self, name):
753
+ try:
754
+ return super().__getattr__(name)
755
+ except AttributeError:
756
+ return getattr(self.module, name)
757
+
758
+ def extract_entities(
759
+ input_ids, # (B, L)
760
+ logits, # (B, N, C)
761
+ pred_spans, # (B, N, 2)
762
+ id2label
763
+ ):
764
+ """
765
+ Return: [(batch_idx, ([token_ids], label_name)),...]
766
+ """
767
+
768
+ # (B, N)
769
+ pred_labels = logits.softmax(dim=-1).argmax(dim=-1)
770
+ start_idx = pred_spans[..., 0] # (B, N)
771
+ end_idx = pred_spans[..., 1] # (B, N)
772
+ keep = ((pred_labels > 0) & (start_idx > 0) & (end_idx > 0))
773
+
774
+ results = []
775
+ B, N = pred_labels.shape
776
+ for bidx in range(B):
777
+ valid_idxes = keep[bidx].nonzero(as_tuple=False).squeeze(-1)
778
+
779
+ for idx in valid_idxes:
780
+ lb = pred_labels[bidx, idx]
781
+
782
+ s, e = pred_spans[bidx, idx].tolist()
783
+ token_ids = input_ids[bidx, s:e+1].tolist()
784
+
785
+ results.append((bidx, (token_ids, id2label[lb.item()])))
786
+
787
+ return results
788
+
789
+ class Trainer:
790
+ def __init__(
791
+ self, training_time="00:11:30:00", eval_mode="max", topk=1, save_name="network", save_best=True, save_last=False, max_grad_norm=200.0,
792
+ logging=0, logging_file=False, checkpoints_dir="", early_stopping=False, eval_from_ratio=-1, eval_every=1, device='cpu',
793
+ schedule_in_step=True, use_ema=True, ema_from_ratio=-1, ema_decay=0.999, return_best=True, return_last=True
794
+ ):
795
+ self.ema_net = None
796
+
797
+ self.training_time = self._time_str_to_seconds(training_time)
798
+ self.mode = eval_mode
799
+ self.topk = topk
800
+ self.device = device
801
+ self.logging = logging if logging < epochs else 1
802
+ self.logging_file = logging_file
803
+ self.checkpoints_dir = checkpoints_dir
804
+ self.early_stopping = early_stopping
805
+ self.eval_from_ratio = eval_from_ratio
806
+ self.eval_every = eval_every
807
+ self.save_name = save_name
808
+ self.save_best = save_best
809
+ self.save_last = save_last
810
+ self.return_best = return_best
811
+ self.return_last = return_last
812
+ self.max_grad_norm = max_grad_norm
813
+ self.schedule_in_step = schedule_in_step
814
+ self.use_ema = use_ema
815
+ self.ema_from_ratio = ema_from_ratio
816
+ self.ema_decay = ema_decay
817
+
818
+ self.best_stage = [[float('-inf') if self.mode == 'max' else float('inf'), None, None]]
819
+ self.grad_scaler = torch.amp.GradScaler(self.device, init_scale=1024.0)
820
+
821
+ def fit(self, network, optimizer, scheduler, loss_fn, epochs, train_loader, val_loader=None, eval_fn=None, start_epoch=1, start_training_time=None, id2label=None):
822
+ if eval_fn is None:
823
+ if self.mode == "max":
824
+ eval_fn = lambda *x: -loss_fn(*x)
825
+ else:
826
+ eval_fn = lambda *x: loss_fn(*x)
827
+
828
+ if torch.cuda.device_count() > 1:
829
+ network = DataParallelProxy(network)
830
+ network = network.to(self.device)
831
+
832
+ if not start_training_time:
833
+ start_training_time = time.time()
834
+
835
+ start_ema = int(epochs * self.ema_from_ratio)
836
+ start_eval = int(epochs * self.eval_from_ratio)
837
+
838
+ if val_loader is None:
839
+ print(f'[Trainer CallBack] 📢 Không có Val Set, không thể đánh giá và Early Stopping!')
840
+ else:
841
+ model_to_use_str = 'mô hình EMA' if self.use_ema else 'mô hình gốc'
842
+ start_model_update_str = f'Bắt đầu cập nhật EMA từ epoch {start_epoch + start_ema}!' if self.use_ema else ''
843
+ print(f'[Trainer CallBack] 📢 Đánh giá bằng {model_to_use_str} từ epoch {start_epoch + start_eval}!', start_model_update_str)
844
+
845
+ training_log = {}
846
+ for epoch in range(start_epoch, epochs+start_epoch):
847
+ if self.use_ema and self.ema_net is None and epoch - start_epoch >= start_ema:
848
+ self.ema_net = ModelEmaV3Proxy(network, self.ema_decay, device=self.device)
849
+
850
+ try:
851
+ teaching_rate = math.cos(math.pi / 2 * epoch / epochs)
852
+ train_loss_epoch, train_loss_epoch_dict = self._train_epoch(network, train_loader, optimizer, scheduler, loss_fn, teaching_rate)
853
+ logging_dict = {'lr': [group['lr'] for group in optimizer.param_groups], 'train_loss': train_loss_epoch}
854
+ logging_dict.update(train_loss_epoch_dict)
855
+
856
+ if val_loader is not None and epoch - start_epoch >= start_eval and (epoch - start_epoch - start_eval) % self.eval_every == 0:
857
+ eval_net = self.ema_net.module if (self.use_ema and self.ema_net is not None) else network
858
+
859
+ val_score, val_score_dict, _ = self._eval_epoch(eval_net, val_loader, eval_fn, id2label)
860
+ update = self._update_best_network(eval_net, val_score, epoch)
861
+ logging_dict.update({'val_score': val_score, 'best_score': self.best_stage[0][0], 'new_best_model': update})
862
+ logging_dict.update(val_score_dict)
863
+ if not self.schedule_in_step and scheduler:
864
+ scheduler.step()
865
+
866
+ except RuntimeError as e:
867
+ if "out of memory" in str(e).lower():
868
+ print(f"[Trainer CallBack] ⚠️ Epoch {epoch}/{epochs}: CUDA Out of Memory! Clearing GPU cache...")
869
+ torch.cuda.empty_cache()
870
+ gc.collect()
871
+ if torch.cuda.is_available():
872
+ torch.cuda.synchronize()
873
+ print(f"[Trainer CallBack] ✅ Epoch {epoch}/{epochs}: GPU memory cleared")
874
+
875
+ train_loader = reduce_batch_size(train_loader, ratio=0.5)
876
+ if val_loader is not None:
877
+ val_loader = reduce_batch_size(val_loader, ratio=0.5)
878
+
879
+ logging_dict = {'lr': [group['lr'] for group in optimizer.param_groups], 'train_loss': float('inf')}
880
+ else:
881
+ raise
882
+
883
+ training_log[epoch] = logging_dict
884
+ if self.is_early_stopping(epoch):
885
+ print(f'[Trainer CallBack] 📢 Epoch {epoch}/{epochs}: Detect Overfitting! Breaking Training Process...')
886
+ break
887
+ if self.logging:
888
+ if epoch % self.logging == 0:
889
+ print(f'[Trainer CallBack] 📢 Epoch {epoch}/{epochs}:', fmt(logging_dict))
890
+ else:
891
+ print(f'{epoch}...', end=' ')
892
+
893
+ if self._at_time_limit(start_training_time):
894
+ print(f'[Trainer CallBack] ⚠️ Epoch {epoch}/{epochs}: Thời gian training giới hạn là {self.training_time}, hết giờ tại epoch {epoch}/{epochs}')
895
+ break
896
+
897
+ if self.logging_file:
898
+ os.makedirs(f'{self.checkpoints_dir}/logs', exist_ok=True)
899
+ with open(f"{self.checkpoints_dir}/logs/{self.save_name}_logging.json", "a", encoding="utf-8") as f:
900
+ f.write(json.dumps(training_log))
901
+
902
+ if self.use_ema and self.ema_net is not None:
903
+ self._save_state_dict(self.ema_net.module)
904
+ else:
905
+ self._save_state_dict(network)
906
+ print(f'[Trainer CallBack] 📢 Kết thúc training.\n')
907
+
908
+ best_model, last_model = None, None
909
+ eval_net = self.ema_net.module if (self.use_ema and self.ema_net is not None) else network
910
+ if self.return_best :
911
+ best_model = self.best_stage[0][2] if self.best_stage[0][2] is not None else eval_net.state_dict()
912
+ best_model = {k.replace("module.", ""): v.detach().cpu().clone() for k, v in best_model.items()}
913
+ if self.return_last:
914
+ last_model = eval_net.state_dict()
915
+ last_model = {k.replace("module.", ""): v.detach().cpu().clone() for k, v in last_model.items()}
916
+
917
+ del network
918
+ torch.cuda.empty_cache()
919
+ gc.collect()
920
+ return training_log, best_model, last_model
921
+
922
+ def _time_str_to_seconds(self, time_str):
923
+ days, hours, minutes, seconds = map(int, time_str.split(":"))
924
+ return days * 86400 + hours * 3600 + minutes * 60 + seconds
925
+
926
+ def _update_best_network(self, network, val_score, epoch):
927
+ topk = max(1, self.topk)
928
+ self.best_stage.append([val_score, epoch, {k: v.detach().cpu().clone() for k, v in network.state_dict().items()}])
929
+ self.best_stage = sorted(self.best_stage, reverse=(self.mode == 'max'), key=lambda x: x[0])[:topk]
930
+ if val_score in [x[0] for x in self.best_stage]:
931
+ return True
932
+ return False
933
+
934
+ def is_early_stopping(self, epoch):
935
+ if self.best_stage[0][1] is None:
936
+ return False
937
+ if not self.early_stopping:
938
+ return False
939
+ return epoch - self.best_stage[0][1] >= self.early_stopping
940
+
941
+ def _at_time_limit(self, start_training_time):
942
+ return time.time() - start_training_time >= self.training_time
943
+
944
+ def _save_state_dict(self, network):
945
+ if self.topk <= 0:
946
+ return
947
+
948
+ if self.save_best:
949
+ for r in range(self.topk):
950
+ os.makedirs(f'{self.checkpoints_dir}/r{r+1}s', exist_ok=True)
951
+
952
+ for rank, (score, epoch, state_dict) in enumerate(self.best_stage):
953
+ if state_dict is None:
954
+ continue
955
+ state_dict = {k.replace("module.", ""): v.detach().cpu().clone() for k, v in state_dict.items()}
956
+ torch.save(state_dict, f'{self.checkpoints_dir}/r{rank+1}s/{self.save_name}_r{rank+1}_vs{score:.5f}_{"ema" if self.ema_net is not None else ""}.pth')
957
+ if self.save_last:
958
+ os.makedirs(f'{self.checkpoints_dir}/lasts', exist_ok=True)
959
+ state_dict = {k.replace("module.", ""): v.detach().cpu().clone() for k, v in network.state_dict().items()}
960
+ torch.save(state_dict, f'{self.checkpoints_dir}/lasts/{self.save_name}_last_{"ema" if self.ema_net is not None else ""}.pth')
961
+
962
+ def _train_epoch(self, network, train_loader, optimizer, scheduler, loss_fn, teaching_rate):
963
+ network.train()
964
+ total_loss = 0
965
+ total_loss_dict = {}
966
+ for batch_idx, batch in enumerate(train_loader):
967
+ optimizer.zero_grad()
968
+ with torch.autocast(device_type=self.device, dtype=torch.float16):
969
+ loss, loss_dict = self._cal_loss(network, batch, batch_idx, loss_fn, teaching_rate)
970
+
971
+ for k, v in loss_dict.items():
972
+ t = total_loss_dict.get(k, 0)
973
+ total_loss_dict[k] = t + v
974
+ self.grad_scaler.scale(loss).backward()
975
+ self.grad_scaler.unscale_(optimizer)
976
+ grad_norm = nn.utils.clip_grad_norm_(network.parameters(), self.max_grad_norm)
977
+ # print(grad_norm) # Bỏ cmt dòng này để biết nên chọn max_grad_norm bằng bao nhiêu...
978
+ self.grad_scaler.step(optimizer)
979
+ self.grad_scaler.update()
980
+ if self.schedule_in_step and scheduler:
981
+ scheduler.step()
982
+ if self.use_ema and self.ema_net is not None:
983
+ self.ema_net.update(network)
984
+ total_loss += loss
985
+ return (total_loss / len(train_loader)).item(), {k: v.item() / len(train_loader) for k, v in total_loss_dict.items()}
986
+
987
+ def _eval_epoch(self, network, val_loader, eval_fn, id2label):
988
+ network.eval()
989
+ total_score = 0.0
990
+ total_score_dict = {}
991
+ object_lists = None # sẽ init sau
992
+
993
+ with torch.no_grad():
994
+ for batch_idx, batch in enumerate(val_loader):
995
+ score, score_dict, objects = self._cal_val_score(network, batch, batch_idx, eval_fn, id2label)
996
+ total_score += score
997
+
998
+ for k, v in score_dict.items():
999
+ t = total_score_dict.get(k, 0)
1000
+ total_score_dict[k] = t + v
1001
+
1002
+ if objects:
1003
+ if object_lists is None:
1004
+ object_lists = [[] for _ in range(len(objects))]
1005
+
1006
+ for i, obj in enumerate(objects):
1007
+ object_lists[i].append(obj.detach())
1008
+
1009
+ if object_lists is not None:
1010
+ object_arrays = [
1011
+ torch.concat(obj_list, dim=0).cpu().numpy()
1012
+ for obj_list in object_lists
1013
+ ]
1014
+ else:
1015
+ object_arrays = []
1016
+
1017
+ return total_score / len(val_loader), {k: v / len(val_loader) for k, v in total_score_dict.items()}, object_arrays
1018
+
1019
+ def _cal_loss(self, network, batch, batch_idx, loss_fn, teaching_rate):
1020
+ # Bạn cần override _cal_loss để tính loss
1021
+ input_ids = batch['input_ids'].to(self.device)
1022
+ attention_mask = batch['attention_mask'].to(self.device)
1023
+
1024
+ sampled_spans = batch['sampled_spans'].to(self.device) # B, M, 2
1025
+ sampled_labels = batch['sampled_labels'].to(self.device) # B, M
1026
+ sampled_weights = batch['sampled_weights'].to(self.device) # B, M
1027
+
1028
+ span_logits = network(input_ids, attention_mask, sampled_spans)
1029
+
1030
+ loss_dict = loss_fn(
1031
+ span_logits, sampled_labels, sampled_weights,
1032
+ )
1033
+ return loss_dict['total'], loss_dict
1034
+
1035
+ def _cal_val_score(self, network, batch, batch_idx, eval_fn, id2label):
1036
+ # Bạn cần override _cal_val_score để tính val score, list bên cạnh là để trả về y hay pred gì đó (nếu cần)
1037
+ input_ids = batch['input_ids'].to(self.device)
1038
+ attention_mask = batch['attention_mask'].to(self.device)
1039
+ all_spans = batch['all_spans'].to(self.device) # B, N, 2
1040
+ gold_entities = batch['gold_entities']
1041
+
1042
+ B, _, _ = input_ids.shape
1043
+
1044
+ span_logits = network(input_ids, attention_mask, all_spans)
1045
+
1046
+ pred_ids = extract_entities(input_ids.reshape(B, -1), span_logits, all_spans, id2label)
1047
+ pred_ids = list_to_tuple(pred_ids)
1048
+
1049
+ gold_ids = list_to_tuple(gold_entities)
1050
+
1051
+ score_dict = eval_fn(pred_ids, gold_ids)
1052
+ return score_dict['f1'], score_dict, []
1053
+
1054
+ # %% [code]
1055
+ class PhoBERTSpanAligner:
1056
+ def __init__(self, tokenizer, max_len):
1057
+ self.tokenizer = tokenizer
1058
+ self.max_len = max_len
1059
+
1060
+ # ===== 1. Extract discontinuous spans =====
1061
+ def extract_spans(self, sample):
1062
+ entity_spans = []
1063
+
1064
+ for event in sample["entities"]:
1065
+ entity_type = event["label"]
1066
+ spans = [tuple(event["offset"])]
1067
+ entity_spans.append({
1068
+ "spans": spans,
1069
+ "label": entity_type
1070
+ })
1071
+
1072
+ return entity_spans
1073
+
1074
+ # ===== 2. Word offsets =====
1075
+ def build_word_offsets(self, text, words):
1076
+ offsets = []
1077
+ pointer = 0
1078
+
1079
+ for word in words:
1080
+ start = text.find(word, pointer)
1081
+ end = start + len(word)
1082
+ offsets.append((start, end))
1083
+ pointer = end
1084
+
1085
+ return offsets
1086
+
1087
+ # ===== 3. Char → word =====
1088
+ def char_span_to_word_span(self, word_offsets, start, end):
1089
+ start_word = None
1090
+ end_word = None
1091
+
1092
+ for i, (w_start, w_end) in enumerate(word_offsets):
1093
+ if w_start <= start < w_end:
1094
+ start_word = i
1095
+ if w_start < end <= w_end:
1096
+ end_word = i
1097
+
1098
+ return start_word, end_word
1099
+
1100
+ # ===== 4. Word → subword =====
1101
+ def word_to_subword_map(self, words):
1102
+ mapping = []
1103
+ subword_index = 1 # <s>
1104
+
1105
+ for word in words:
1106
+ sub_tokens = self.tokenizer.tokenize(word)
1107
+ start = subword_index
1108
+ end = subword_index + len(sub_tokens) - 1
1109
+ mapping.append((start, end))
1110
+ subword_index += len(sub_tokens)
1111
+
1112
+ return mapping
1113
+
1114
+ # ===== 5. Span → subword =====
1115
+ def span_to_subword(self, word_offsets, word_subword_map, spans):
1116
+ sub_spans = []
1117
+
1118
+ for span_start, span_end in spans:
1119
+ w_start, w_end = self.char_span_to_word_span(
1120
+ word_offsets, span_start, span_end
1121
+ )
1122
+ if w_start is None or w_end is None:
1123
+ continue
1124
+
1125
+ sub_start = word_subword_map[w_start][0]
1126
+ sub_end = word_subword_map[w_end][1]
1127
+ sub_spans.append((sub_start, sub_end))
1128
+
1129
+ return sub_spans
1130
+
1131
+ def extract_valid_spans(self, sub_spans):
1132
+ valid_spans = []
1133
+ for s, e in sub_spans:
1134
+ if s < 0 or e < 0 or s >= self.max_len or e >= self.max_len or s > e:
1135
+ continue
1136
+ valid_spans.append((s, e))
1137
+ return valid_spans
1138
+
1139
+ def encode(self, sample):
1140
+ text = sample["text"]
1141
+ entities = self.extract_spans(sample)
1142
+
1143
+ # ===== 1. Word tokenize =====
1144
+ words = word_tokenize(text)
1145
+ sentence = " ".join(words)
1146
+
1147
+ # ===== 2. Mapping =====
1148
+ word_offsets = self.build_word_offsets(text, words)
1149
+ word_subword_map = self.word_to_subword_map(words)
1150
+
1151
+ # ===== 3. Tokenize FULL =====
1152
+ encoding = self.tokenizer(
1153
+ sentence,
1154
+ max_length=self.max_len,
1155
+ truncation=True,
1156
+ padding="max_length",
1157
+ return_tensors="pt"
1158
+ )
1159
+ input_ids = encoding["input_ids"][0]
1160
+ attention_mask = encoding["attention_mask"][0]
1161
+
1162
+ # ===== 5. Convert spans =====
1163
+ entities_gold_spans = []
1164
+
1165
+ for ent in entities:
1166
+ label = ent["label"]
1167
+
1168
+ sub_spans = self.span_to_subword(
1169
+ word_offsets,
1170
+ word_subword_map,
1171
+ ent["spans"]
1172
+ )
1173
+ valid_spans = self.extract_valid_spans(sub_spans)
1174
+ if len(valid_spans) == 0:
1175
+ continue
1176
+ entities_gold_spans.append((tuple(valid_spans), label))
1177
+
1178
+ return {
1179
+ "input_ids": input_ids,
1180
+ "attention_mask": attention_mask,
1181
+ "entities_gold_spans": entities_gold_spans,
1182
+ }
1183
+
1184
+ def generate_spans(attention_mask, max_span_len):
1185
+ seq_len = attention_mask.sum().item() - 2
1186
+ spans = []
1187
+ for i in range(1, seq_len+1):
1188
+ for j in range(i, min(i+max_span_len, seq_len+1)):
1189
+ spans.append((i, j))
1190
+ return spans
1191
+
1192
+ def match_gold_labels(
1193
+ gold_spans, # (N, 2)
1194
+ gold_labels, # (N,)
1195
+ pred_spans, # (M, 2)
1196
+ default_label=-100
1197
+ ):
1198
+ """
1199
+ Return:
1200
+ pred_labels: (M,)
1201
+ """
1202
+
1203
+ pred_labels = torch.full(
1204
+ (pred_spans.size(0),),
1205
+ default_label,
1206
+ dtype=gold_labels.dtype,
1207
+ device=gold_labels.device
1208
+ )
1209
+ if gold_spans.size(0) == 0:
1210
+ return pred_labels
1211
+
1212
+ # (M, N)
1213
+ matched = (pred_spans[:, None, :] == gold_spans[None, :, :]).all(dim=-1)
1214
+ has_match = matched.any(dim=1)
1215
+
1216
+ # lấy index gold đầu tiên match
1217
+ gold_idx = matched.float().argmax(dim=1)
1218
+
1219
+ pred_labels[has_match] = gold_labels[gold_idx[has_match]]
1220
+
1221
+ return pred_labels
1222
+
1223
+ class KLTNDataset(Dataset):
1224
+ def __init__(
1225
+ self,
1226
+ all_data, using_idxes, label2id, tokenizer,
1227
+ max_len, max_n_parts, max_span_len, n_negs,
1228
+ weight_sampling=False, weight_rate=0.0, hard_rate=0.5,
1229
+ ):
1230
+ super().__init__()
1231
+
1232
+ self.tokenizer = tokenizer
1233
+ self.aligner = PhoBERTSpanAligner(tokenizer, max_len * max_n_parts)
1234
+
1235
+ self.all_data = all_data
1236
+ self.using_idxes = using_idxes
1237
+ self.label2id = label2id
1238
+
1239
+ self.max_len = max_len
1240
+ self.max_n_parts = max_n_parts
1241
+ self.max_span_len = max_span_len
1242
+
1243
+ self.n_negs = n_negs
1244
+ self.weight_sampling = weight_sampling
1245
+ self.weight_rate = weight_rate
1246
+ self.hard_rate = hard_rate
1247
+
1248
+ def __len__(self):
1249
+ return len(self.using_idxes)
1250
+
1251
+ def compute_iou(self, spans1, spans2):
1252
+ s1 = spans1[:, None, 0]
1253
+ e1 = spans1[:, None, 1]
1254
+
1255
+ s2 = spans2[None, :, 0]
1256
+ e2 = spans2[None, :, 1]
1257
+
1258
+ inter = (torch.minimum(e1, e2) - torch.maximum(s1, s2) + 1).clamp(min=0)
1259
+
1260
+ len1 = e1 - s1 + 1
1261
+ len2 = e2 - s2 + 1
1262
+
1263
+ union = len1 + len2 - inter
1264
+
1265
+ return inter.float() / union.float()
1266
+
1267
+ def sample_spans(self, all_spans, all_labels, gold_spans):
1268
+ pos_mask = all_labels != 0
1269
+ neg_mask = all_labels == 0
1270
+
1271
+ pos_indices = torch.nonzero(pos_mask, as_tuple=False).squeeze(-1)
1272
+ neg_indices = torch.nonzero(neg_mask, as_tuple=False).squeeze(-1)
1273
+
1274
+ n_negs = min(self.n_negs, len(neg_indices))
1275
+
1276
+ sampled_neg_indices = torch.empty(0, dtype=torch.long)
1277
+ sampled_neg_weights = torch.empty(0, dtype=torch.float)
1278
+
1279
+ if n_negs > 0 and len(neg_indices) > 0:
1280
+ neg_spans = all_spans[neg_indices]
1281
+
1282
+ if len(gold_spans) > 0:
1283
+ ious = self.compute_iou(neg_spans, gold_spans)
1284
+
1285
+ max_ious = ious.max(dim=1).values
1286
+
1287
+ else:
1288
+ max_ious = torch.zeros(len(neg_indices))
1289
+
1290
+ neg_weights = 1.0 + self.weight_rate * max_ious
1291
+
1292
+ if self.weight_sampling:
1293
+ hard_mask = max_ious > 0
1294
+ easy_mask = max_ious == 0
1295
+
1296
+ hard_indices = neg_indices[hard_mask]
1297
+ easy_indices = neg_indices[easy_mask]
1298
+
1299
+ hard_weights = neg_weights[hard_mask]
1300
+ easy_weights = neg_weights[easy_mask]
1301
+
1302
+ hard_k = min(int(n_negs * self.hard_rate), len(hard_indices))
1303
+ easy_k = min(n_negs - hard_k, len(easy_indices))
1304
+
1305
+ if hard_k > 0:
1306
+ hard_probs = hard_weights / hard_weights.sum()
1307
+ hard_ids = torch.multinomial(
1308
+ hard_probs,
1309
+ hard_k,
1310
+ replacement=False
1311
+ )
1312
+
1313
+ sampled_hard_indices = hard_indices[hard_ids]
1314
+ sampled_hard_weights = hard_weights[hard_ids]
1315
+ else:
1316
+ sampled_hard_indices = torch.empty(0, dtype=torch.long)
1317
+ sampled_hard_weights = torch.empty(0, dtype=torch.float)
1318
+
1319
+ if easy_k > 0:
1320
+ easy_perm = torch.randperm(len(easy_indices))[:easy_k]
1321
+ sampled_easy_indices = easy_indices[easy_perm]
1322
+ sampled_easy_weights = easy_weights[easy_perm]
1323
+ else:
1324
+ sampled_easy_indices = torch.empty(0, dtype=torch.long)
1325
+ sampled_easy_weights = torch.empty(0, dtype=torch.float)
1326
+
1327
+ sampled_neg_indices = torch.cat([sampled_hard_indices, sampled_easy_indices], dim=0)
1328
+ sampled_neg_weights = torch.cat([sampled_hard_weights, sampled_easy_weights], dim=0)
1329
+
1330
+ else:
1331
+ perm = torch.randperm(len(neg_indices))[:n_negs]
1332
+ sampled_neg_indices = neg_indices[perm]
1333
+ sampled_neg_weights = neg_weights[perm]
1334
+
1335
+ pos_weights = torch.ones(len(pos_indices), dtype=torch.float)
1336
+ sampled_indices = torch.cat([pos_indices, sampled_neg_indices], dim=0)
1337
+ sampled_weights = torch.cat([pos_weights, sampled_neg_weights], dim=0)
1338
+
1339
+ if len(sampled_indices) > 0:
1340
+ perm = torch.randperm(len(sampled_indices))
1341
+ sampled_indices = sampled_indices[perm]
1342
+ sampled_weights = sampled_weights[perm]
1343
+
1344
+ sampled_spans = all_spans[sampled_indices]
1345
+ sampled_labels = all_labels[sampled_indices]
1346
+ return sampled_spans, sampled_labels, sampled_weights
1347
+
1348
+ def __getitem__(self, idx):
1349
+ ridx = self.using_idxes[idx]
1350
+
1351
+ sample = self.all_data[ridx]
1352
+
1353
+ result = self.aligner.encode(sample)
1354
+
1355
+ input_ids = result["input_ids"].squeeze(0)
1356
+ attention_mask = result["attention_mask"].squeeze(0)
1357
+
1358
+ entities_gold_spans = result["entities_gold_spans"]
1359
+
1360
+ all_spans = torch.tensor(generate_spans(attention_mask, self.max_span_len))
1361
+
1362
+ gold_spans = (
1363
+ torch.tensor([spans[0] for spans, _ in entities_gold_spans], dtype=torch.long)
1364
+ if entities_gold_spans else
1365
+ torch.empty(0, 2, dtype=torch.long)
1366
+ )
1367
+
1368
+ gold_labels = (
1369
+ torch.tensor([self.label2id[label] for _, label in entities_gold_spans], dtype=torch.long)
1370
+ if entities_gold_spans else
1371
+ torch.empty(0, dtype=torch.long)
1372
+ )
1373
+
1374
+ all_labels = match_gold_labels(
1375
+ gold_spans,
1376
+ gold_labels,
1377
+ all_spans,
1378
+ default_label=0
1379
+ )
1380
+
1381
+ sampled_spans, sampled_labels, sampled_weights = self.sample_spans(
1382
+ all_spans,
1383
+ all_labels,
1384
+ gold_spans
1385
+ )
1386
+
1387
+ gold_entities = []
1388
+
1389
+ for spans, label in entities_gold_spans:
1390
+ s, e = spans[0]
1391
+
1392
+ gold_entities.append((tuple(input_ids[s:e+1].tolist()), label))
1393
+
1394
+ input_ids = input_ids.reshape(self.max_n_parts, self.max_len)
1395
+ attention_mask = attention_mask.reshape(self.max_n_parts, self.max_len)
1396
+
1397
+ n_valid_parts = math.ceil(attention_mask.sum().item() / self.max_len)
1398
+
1399
+ input_ids = input_ids[:n_valid_parts]
1400
+ attention_mask = attention_mask[:n_valid_parts]
1401
+
1402
+ return {
1403
+ "input_ids": input_ids,
1404
+ "attention_mask": attention_mask,
1405
+
1406
+ "sampled_spans": sampled_spans,
1407
+ "sampled_labels": sampled_labels,
1408
+ "sampled_weights": sampled_weights,
1409
+
1410
+ "all_spans": all_spans,
1411
+
1412
+ "gold_entities": gold_entities,
1413
+ }
1414
+
1415
+ def _pad_batch(tensor_list, pad_value=0):
1416
+ """
1417
+ tensor_list: list of tensors
1418
+ mỗi tensor shape: (Nk, n_parts_i, max_len_i)
1419
+
1420
+ return:
1421
+ padded tensor shape: (B, max_Nk, max_n_parts, max_len)
1422
+ """
1423
+
1424
+ # lấy max toàn batch
1425
+ max_Nk = max(t.size(0) for t in tensor_list)
1426
+ max_n_parts = max(t.size(1) for t in tensor_list)
1427
+ max_len = max(t.size(2) for t in tensor_list)
1428
+
1429
+ padded = []
1430
+
1431
+ for t in tensor_list:
1432
+ Nk, n_parts_i, max_len_i = t.shape
1433
+
1434
+ # pad chiều n_parts và max_len trước
1435
+ if n_parts_i < max_n_parts or max_len_i < max_len:
1436
+ new_t = t.new_full(
1437
+ (Nk, max_n_parts, max_len),
1438
+ pad_value
1439
+ )
1440
+ new_t[:, :n_parts_i, :max_len_i] = t
1441
+ t = new_t
1442
+
1443
+ # pad chiều Nk
1444
+ if Nk < max_Nk:
1445
+ pad_tensor = t.new_full(
1446
+ (max_Nk - Nk, max_n_parts, max_len),
1447
+ pad_value
1448
+ )
1449
+ t = torch.cat([t, pad_tensor], dim=0)
1450
+
1451
+ padded.append(t)
1452
+
1453
+ return torch.stack(padded) # (B, max_Nk, max_n_parts, max_len)
1454
+
1455
+ def collate_fn(batch):
1456
+ gold_entities = []
1457
+ for bidx, b in enumerate(batch):
1458
+ for entity in b['gold_entities']:
1459
+ gold_entities.append([bidx, entity])
1460
+
1461
+ input_ids = [b["input_ids"].unsqueeze(-1) for b in batch]
1462
+ attention_mask = [b["attention_mask"].unsqueeze(-1) for b in batch]
1463
+ sampled_spans = [b["sampled_spans"].unsqueeze(-1) for b in batch]
1464
+ sampled_labels = [b["sampled_labels"].unsqueeze(-1).unsqueeze(-1) for b in batch]
1465
+ sampled_weights = [b["sampled_weights"].unsqueeze(-1).unsqueeze(-1) for b in batch]
1466
+ all_spans = [b["all_spans"].unsqueeze(-1) for b in batch]
1467
+
1468
+ # pad theo Nk
1469
+ input_ids = _pad_batch(input_ids, pad_value=0).squeeze(-1)
1470
+ attention_mask = _pad_batch(attention_mask, pad_value=0).squeeze(-1)
1471
+ sampled_spans = _pad_batch(sampled_spans, pad_value=0).squeeze(-1)
1472
+ sampled_labels = _pad_batch(sampled_labels, pad_value=-100).squeeze(-1).squeeze(-1)
1473
+ sampled_weights = _pad_batch(sampled_weights, pad_value=0).squeeze(-1).squeeze(-1)
1474
+ all_spans = _pad_batch(all_spans, pad_value=0).squeeze(-1)
1475
+
1476
+ return {
1477
+ "input_ids": input_ids,
1478
+ "attention_mask": attention_mask,
1479
+
1480
+ "sampled_spans": sampled_spans,
1481
+ "sampled_labels": sampled_labels,
1482
+ "sampled_weights": sampled_weights,
1483
+
1484
+ "all_spans": all_spans,
1485
+ "gold_entities": gold_entities,
1486
+ }
1487
+
1488
+ # %% [code]
1489
+ def shift_bidx(spans, batch_idx):
1490
+ shifted = []
1491
+ for bidx, ent in spans:
1492
+ new_bidx = bidx + batch_idx * batch_size
1493
+ shifted.append((new_bidx, ent))
1494
+ return shifted
1495
+
1496
+ def refactor_entities(entities, save_dict):
1497
+ i, c = [], []
1498
+ for bidx, (ids, lb) in entities:
1499
+ if (bidx, ids) not in i:
1500
+ i.append((bidx, ids))
1501
+
1502
+ if (bidx, (ids, lb)) not in c:
1503
+ c.append((bidx, (ids, lb)))
1504
+
1505
+ save_dict['Ent-I'].extend(i)
1506
+ save_dict['Ent-C'].extend(c)
1507
+
1508
+ def test(network, state_dicts, test_loader, eval_fn, analyzer, device, id2label, tokenizer):
1509
+ if torch.cuda.device_count() > 1:
1510
+ network = DataParallelProxy(network)
1511
+ network = network.to(device)
1512
+ network.eval()
1513
+
1514
+ eval_types = ['Ent-I', 'Ent-C']
1515
+
1516
+ all_pred = {eval_type: [] for eval_type in eval_types}
1517
+ all_gold = {eval_type: [] for eval_type in eval_types}
1518
+
1519
+ list_input_ids = []
1520
+
1521
+ with torch.no_grad():
1522
+ for batch_idx, batch in enumerate(test_loader):
1523
+ input_ids = batch['input_ids'].to(device)
1524
+ attention_mask = batch['attention_mask'].to(device)
1525
+ all_spans = batch['all_spans'].to(device)
1526
+ gold_entities = batch['gold_entities']
1527
+
1528
+ B, _, _ = input_ids.shape
1529
+ list_input_ids.extend(input_ids.reshape(B, -1).tolist())
1530
+
1531
+ list_hidden_states = []
1532
+ list_logits = []
1533
+ list_start_logits = []
1534
+ list_end_logits = []
1535
+ for sd in state_dicts:
1536
+ if torch.cuda.device_count() > 1:
1537
+ network.module.load_state_dict(sd)
1538
+ else:
1539
+ network.load_state_dict(sd)
1540
+
1541
+ span_logits = network(input_ids, attention_mask, all_spans)
1542
+ list_logits.append(span_logits)
1543
+
1544
+ ensemble_logits = torch.stack(list_logits, dim=0).mean(dim=0)
1545
+ pred_entities = extract_entities(input_ids.reshape(B, -1), ensemble_logits, all_spans, id2label)
1546
+ pred_entities = shift_bidx(pred_entities, batch_idx)
1547
+ refactor_entities(pred_entities, all_pred)
1548
+
1549
+ gold_entities = shift_bidx(gold_entities, batch_idx)
1550
+ refactor_entities(gold_entities, all_gold)
1551
+
1552
+ # ===== GLOBAL EVAL =====
1553
+ final_score = {}
1554
+ for eval_type in eval_types:
1555
+ score = eval_fn(list_to_tuple(all_pred[eval_type]), list_to_tuple(all_gold[eval_type]))
1556
+ final_score[eval_type] = score
1557
+
1558
+ analyze_result = analyzer.analyze(list_to_tuple(all_pred['Ent-I']), list_to_tuple(all_gold['Ent-I']))
1559
+
1560
+ # ===== PREDICT =====
1561
+ predictions = []
1562
+ for input_ids in list_input_ids:
1563
+ predictions.append([tokenizer.decode(input_ids, skip_special_tokens=True, clean_up_tokenization_spaces=True)])
1564
+ for bidx, (ids, lb) in all_pred['Ent-C']:
1565
+ predictions[bidx].append((tokenizer.decode(ids, skip_special_tokens=True, clean_up_tokenization_spaces=True), lb))
1566
+
1567
+ return final_score, analyze_result, predictions
1568
+
1569
+ # %% [code]
1570
+ with open(f'{train_dir}/train.json', "r", encoding="utf-8") as f:
1571
+ data_train = json.load(f)
1572
+
1573
+ with open(f'{test_dir}/test.json', "r", encoding="utf-8") as f:
1574
+ data_test = json.load(f)
1575
+
1576
+ print('Train:', len(data_train))
1577
+ print('Test:', len(data_test))
1578
+
1579
+ # %% [code]
1580
+ entity_types = ['O'] + sorted(list(set([e['label'] for d in data_train + data_test for e in d['entities']])))
1581
+ # bio_entity_type = ['O'] + [f'{prefix}-{ent}' for ent in entity_types for prefix in ['B', 'I']]
1582
+ label2id = {l: i for i, l in enumerate(entity_types)}
1583
+ id2label = {i: l for l, i in label2id.items()}
1584
+
1585
+ # %% [code]
1586
+ zero_entities_idxes = []
1587
+ for idx, d in enumerate(data_train):
1588
+ if len(d['entities']) == 0:
1589
+ zero_entities_idxes.append(idx)
1590
+
1591
+ n_zero_entities_samples = len(zero_entities_idxes)
1592
+ n_has_entities_samples = len(data_train) - n_zero_entities_samples
1593
+
1594
+ random.seed(42)
1595
+ k = min(int(n_has_entities_samples * zero_entities_rate), len(zero_entities_idxes))
1596
+ sampled_zero_entities_idxes = random.sample(zero_entities_idxes, k)
1597
+
1598
+ new_data_train = []
1599
+ for idx, d in enumerate(data_train):
1600
+ if len(d['entities']) == 0:
1601
+ if idx in sampled_zero_entities_idxes:
1602
+ new_data_train.append(d)
1603
+ else:
1604
+ new_data_train.append(d)
1605
+ data_train = new_data_train
1606
+
1607
+ print('Train:', len(data_train))
1608
+
1609
+ # %% [code]
1610
+ if debug_only:
1611
+ data_train = data_train[:20]
1612
+ data_test = data_test[:20]
1613
+
1614
+ print('Train:', len(data_train))
1615
+ print('Test:', len(data_test))
1616
+
1617
+ # %% [code]
1618
+ tokenizer = AutoTokenizer.from_pretrained(backbone_model_name)
1619
+
1620
+ # %% [code]
1621
+ print('Experiment name:', state_dict_save_name)
1622
+
1623
+ # %% [code]
1624
+ # trainset = KLTNDataset(data_train, np.array(range(len(data_train))), label2id, tokenizer, **train_memory_params)
1625
+ # train_loader = DataLoader(trainset, collate_fn=collate_fn, **train_loader_params)
1626
+ # for b in train_loader:
1627
+ # break
1628
+
1629
+ # %% [code]
1630
+ if not test_only:
1631
+ full_idxes = np.array(range(len(data_train)))
1632
+ training_logs, best_models, last_models = [], [], []
1633
+ start_training_time = time.time()
1634
+ for seed in SEEDS:
1635
+ kf = KFold(n_splits=nfolds, shuffle=True, random_state=seed)
1636
+ for fold_idx, (tr_idx, va_idx) in enumerate(kf.split(full_idxes)):
1637
+ if only_fold_idx is not None and only_fold_idx >= 0 and only_fold_idx != fold_idx:
1638
+ continue
1639
+ set_seed(seed)
1640
+
1641
+ train_idxes, val_idxes = full_idxes[tr_idx], full_idxes[va_idx]
1642
+
1643
+ trainset = KLTNDataset(data_train, train_idxes, label2id, tokenizer, **train_memory_params)
1644
+ valset = KLTNDataset(data_train, val_idxes, label2id, tokenizer, **val_memory_params)
1645
+
1646
+ generator = torch.Generator()
1647
+ generator.manual_seed(seed)
1648
+ train_loader = DataLoader(trainset, generator=generator, collate_fn=collate_fn, **train_loader_params)
1649
+ val_loader = DataLoader(valset, generator=generator, collate_fn=collate_fn, **val_loader_params)
1650
+
1651
+ my_model = IEModel(
1652
+ num_labels=len(label2id),
1653
+ **model_params
1654
+ )
1655
+ total_params = sum(p.numel() for p in my_model.parameters())
1656
+ print(f"Total params: {total_params:,}")
1657
+
1658
+ # optimizer, scheduler = configure_optimizers(my_model, optim_params, scheduler_params)
1659
+ encoder_params = set(map(id, my_model.encoder.parameters()))
1660
+ other_params = [
1661
+ p for p in my_model.parameters()
1662
+ if id(p) not in encoder_params
1663
+ ]
1664
+ optimizer = optim.AdamW([
1665
+ {"params": my_model.encoder.parameters(), "lr": 2e-5},
1666
+ {"params": other_params}
1667
+ ], lr=5e-4)
1668
+ scheduler = optim.lr_scheduler.CosineAnnealingLR(optimizer, T_max=20, eta_min=1e-6)
1669
+
1670
+ loss_fn = CustomLoss(
1671
+ **loss_func_params
1672
+ )
1673
+ eval_fn = CustomEvalFn(**eval_func_params)
1674
+ trainer_params['save_name'] = f'{state_dict_save_name}_s{seed}_f{fold_idx}'
1675
+ trainer = Trainer(**trainer_params)
1676
+
1677
+ print(f'Start Training Fold {fold_idx}...')
1678
+ training_log, best_model, last_model = trainer.fit(
1679
+ my_model, optimizer, scheduler, loss_fn, epochs, train_loader, val_loader, eval_fn,
1680
+ start_epoch=1, start_training_time=start_training_time, id2label=id2label
1681
+ )
1682
+
1683
+ training_logs.append(training_log)
1684
+ best_models.append(best_model)
1685
+ last_models.append(last_model)
1686
+
1687
+ # %% [code]
1688
+ def load_all_state_dicts(folder):
1689
+ files = []
1690
+
1691
+ for file in os.listdir(folder):
1692
+ if file.endswith(".pt") or file.endswith(".pth"):
1693
+ m = re.search(r"f(\d+)", file) # tìm f<số>
1694
+ if m:
1695
+ fold = int(m.group(1))
1696
+ files.append((fold, file))
1697
+
1698
+ # sort theo fold
1699
+ files.sort(key=lambda x: x[0])
1700
+
1701
+ state_dicts = []
1702
+ for fold, file in files:
1703
+ path = os.path.join(folder, file)
1704
+ print(f"Loading fold {fold}: {file}")
1705
+ state_dict = torch.load(path, map_location="cpu")
1706
+ state_dicts.append(state_dict)
1707
+
1708
+ return state_dicts
1709
+
1710
+ if test_only:
1711
+ snapshot_download(repo_id=repo_name, local_dir="", repo_type="model", allow_patterns=[f"{state_dict_save_name}/**"])
1712
+ get_ipython().system('rm -rf .cache .gitattributes')
1713
+
1714
+ best_models = load_all_state_dicts(f"{state_dict_save_name}/r1s")
1715
+ last_models = load_all_state_dicts(f"{state_dict_save_name}/lasts")
1716
+
1717
+ # %% [code]
1718
+ os.makedirs(f'{checkpoints_dir}/results', exist_ok=True)
1719
+ testset = KLTNDataset(data_test, range(len(data_test)), label2id, tokenizer, **val_memory_params)
1720
+ generator = torch.Generator()
1721
+ test_loader = DataLoader(testset, generator=generator, collate_fn=collate_fn, **val_loader_params)
1722
+ eval_fn = CustomEvalFn(**eval_func_params)
1723
+ analyzer = SpanErrorAnalyzer()
1724
+ my_model = IEModel(
1725
+ num_labels=len(label2id),
1726
+ **model_params
1727
+ )
1728
+ total_params = sum(p.numel() for p in my_model.parameters())
1729
+ print(f"Total params: {total_params:,}")
1730
+
1731
+ # %% [code]
1732
+ start_time = time.time()
1733
+
1734
+ best_score, best_analyze_result, best_pred_test = test(my_model, best_models, test_loader, eval_fn, analyzer, device, id2label, tokenizer)
1735
+ last_score, last_analyze_result, last_pred_test = test(my_model, last_models, test_loader, eval_fn, analyzer, device, id2label, tokenizer)
1736
+
1737
+ result_test = {"Best model": best_score, "Last model": last_score}
1738
+ analyze_result = {"Best model": best_analyze_result, "Last model": last_analyze_result}
1739
+ analyze_result_sumary = {"Best model": best_analyze_result['summary'], "Last model": last_analyze_result['summary']}
1740
+ pred_test = {"Best model": best_pred_test, "Last model": last_pred_test}
1741
+
1742
+ with open(f"{checkpoints_dir}/results/{state_dict_save_name}_test.json", "w", encoding="utf-8") as f:
1743
+ json.dump(result_test, f, ensure_ascii=False, indent=2)
1744
+
1745
+ with open(f"{checkpoints_dir}/results/{state_dict_save_name}_error_analyze_result.json", "w", encoding="utf-8") as f:
1746
+ json.dump(analyze_result, f, ensure_ascii=False, indent=2)
1747
+
1748
+ with open(f"{checkpoints_dir}/results/{state_dict_save_name}_pred_test.json", "w", encoding="utf-8") as f:
1749
+ json.dump(pred_test, f, ensure_ascii=False, indent=2)
1750
+
1751
+ print('Test:', time.time() - start_time, 's --> Done!')
1752
+ print(json.dumps(analyze_result_sumary, ensure_ascii=False, indent=4))
1753
+
1754
+ # %% [code]
1755
+ best_pred_test[:10]
1756
+
1757
+ # %% [code]
1758
+ last_pred_test[:10]
1759
+
1760
+ # %% [code]
1761
+ def dict_to_df(data):
1762
+ row_tuples = []
1763
+ row_values = []
1764
+
1765
+ metrics = ["precision", "recall", "f1"]
1766
+
1767
+ # Lấy model đầu tiên
1768
+ first_model = next(iter(data.values()))
1769
+
1770
+ # eval_keys
1771
+ eval_keys = list(first_model.keys())
1772
+
1773
+ for eval_key in eval_keys:
1774
+ row_tuples.append(eval_key)
1775
+ row = {}
1776
+
1777
+ for model_name, model_data in data.items():
1778
+ for metric in metrics:
1779
+ row[(model_name, metric)] = model_data[eval_key][metric]
1780
+
1781
+ row_values.append(row)
1782
+
1783
+ # ===== DataFrame =====
1784
+ df = pd.DataFrame(row_values)
1785
+
1786
+ # MultiIndex columns
1787
+ df.columns = pd.MultiIndex.from_tuples(df.columns)
1788
+
1789
+ # Index
1790
+ df.index = pd.Index(row_tuples, name="evaluation")
1791
+
1792
+ # ===== Sort =====
1793
+ sort_keys = []
1794
+ if ("Best model", "f1") in df.columns:
1795
+ sort_keys.append(("Best model", "f1"))
1796
+ if ("Last model", "f1") in df.columns:
1797
+ sort_keys.append(("Last model", "f1"))
1798
+
1799
+ if sort_keys:
1800
+ df = df.sort_values(by=sort_keys, ascending=False)
1801
+
1802
+ return df
1803
+
1804
+ result_test_df = dict_to_df(result_test)
1805
+ result_test_df.to_excel(f"{checkpoints_dir}/results/{state_dict_save_name}_test_df.xlsx")
1806
+ result_test_df
1807
+
1808
+ # %% [code]
1809
+ key = ("Best model", "f1")
1810
+ result_test_df_best = result_test_df.sort_values(by=key, ascending=False).groupby(level="evaluation").head(1)
1811
+ result_test_df_best.to_excel(f"{checkpoints_dir}/results/{state_dict_save_name}_test_df_best.xlsx")
1812
+ result_test_df_best
1813
+
1814
+ # %% [code]
1815
+ def get_avg_best_score(logs):
1816
+ return float(np.mean([list(log.values())[-1]['best_score'] for log in logs]))
1817
+
1818
+ def get_avg_log(logs, epochs):
1819
+ avg_log = {}
1820
+
1821
+ for epoch in range(1, epochs + 1):
1822
+ val_score = 0.0
1823
+ train_loss = 0.0
1824
+ n_eval = 0
1825
+
1826
+ for idx in range(len(logs)):
1827
+ log = logs[idx].get(epoch, logs[idx].get(str(epoch)))
1828
+ if log is None:
1829
+ continue
1830
+
1831
+ val_score += log.get('val_score', 0.0)
1832
+ train_loss += log.get('train_loss', 0.0)
1833
+ n_eval += 1
1834
+
1835
+ if n_eval == 0:
1836
+ continue
1837
+
1838
+ avg_log[epoch] = {
1839
+ 'train_loss': train_loss / n_eval,
1840
+ 'val_score': val_score / n_eval if val_score != 0 else float('inf')
1841
+ }
1842
+
1843
+ return avg_log
1844
+
1845
+ def parse_label_key(label: str):
1846
+ try:
1847
+ first = float(label.split('_', 1)[0]) # số đầu: trước dấu _
1848
+ last = float(re.findall(r'_(\d+(?:\.\d+)?)$', label)[0])
1849
+ return first, last
1850
+ except:
1851
+ return (0, 0)
1852
+
1853
+ def plot_training_logs(logs_dict, save_path=None, figsize=(24, 10)):
1854
+ fig, axes = plt.subplots(1, 2, figsize=figsize)
1855
+
1856
+ # ===== Plot Train Loss =====
1857
+ for name, log in logs_dict.items():
1858
+ epochs = sorted(log.keys())
1859
+ train_loss = [log[e]['train_loss'] for e in epochs]
1860
+ axes[0].plot(epochs, train_loss, label=name)
1861
+
1862
+ axes[0].set_xlabel('Epoch')
1863
+ axes[0].set_ylabel('Train Loss')
1864
+ axes[0].set_title('Training Loss')
1865
+ axes[0].grid(True)
1866
+
1867
+ # ===== Plot Validation Score =====
1868
+ for name, log in logs_dict.items():
1869
+ epochs = sorted(log.keys())
1870
+ val_score = [log[e]['val_score'] for e in epochs]
1871
+ axes[1].plot(epochs, val_score, label=name)
1872
+
1873
+ axes[1].set_xlabel('Epoch')
1874
+ axes[1].set_ylabel('Validation Score')
1875
+ axes[1].set_title('Validation Score')
1876
+ axes[1].grid(True)
1877
+
1878
+ # ===== Shared Legend =====
1879
+ handles, labels = axes[0].get_legend_handles_labels()
1880
+ pairs = list(zip(handles, labels))
1881
+ pairs_sorted = sorted(
1882
+ pairs,
1883
+ key=lambda x: parse_label_key(x[1])
1884
+ )
1885
+ handles_sorted, labels_sorted = zip(*pairs_sorted)
1886
+
1887
+ axes[0].legend(
1888
+ handles_sorted,
1889
+ labels_sorted,
1890
+ loc='center left',
1891
+ bbox_to_anchor=(1.01, 0.5),
1892
+ borderaxespad=0.
1893
+ )
1894
+
1895
+ plt.tight_layout(rect=[0, 0, 1, 1])
1896
+
1897
+ if save_path is not None:
1898
+ os.makedirs(os.path.dirname(save_path), exist_ok=True) if os.path.dirname(save_path) else None
1899
+ plt.savefig(save_path, dpi=300, bbox_inches='tight')
1900
+
1901
+ plt.show()
1902
+
1903
+ # %% [code]
1904
+ # if not test_only:
1905
+ # snapshot_download(repo_id=repo_name, local_dir="", repo_type="model", allow_patterns=["**/*.json"])
1906
+ # !rm -rf .cache .gitattributes
1907
+
1908
+ # %% [code]
1909
+ if not test_only:
1910
+ experiments = {}
1911
+ for experiment in os.listdir(pretrained_dir):
1912
+ if '.virtual_documents' in experiment:
1913
+ continue
1914
+ experiment_logs = []
1915
+ try:
1916
+ for seed in SEEDS:
1917
+ for fold_idx in range(nfolds):
1918
+ with open(f"{pretrained_dir}/{experiment}/logs/{experiment}_s{seed}_f{fold_idx}_logging.json", "r", encoding="utf-8") as f:
1919
+ experiment_log = json.load(f)
1920
+ experiment_logs.append(experiment_log)
1921
+ except:
1922
+ pass
1923
+ experiments[experiment] = get_avg_log(experiment_logs, 1000)
1924
+ experiments[state_dict_save_name] = get_avg_log(training_logs, 1000)
1925
+
1926
+ # %% [code]
1927
+ if not test_only:
1928
+ score = get_avg_best_score(training_logs)
1929
+ state_dict_save_name, score
1930
+
1931
+ # %% [code]
1932
+ if not test_only:
1933
+ plot_training_logs(experiments, save_path=f'{checkpoints_dir}/logs/{state_dict_save_name}_log_plot.jpg', figsize=(18, 7.5))
1934
+
0_ent_175_negs_hr_05_wr25_1/lasts/0_ent_175_negs_hr_05_wr25_1_s26092004_f0_last_ema.pth ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:00261628dcacf4215e6500533a7eaf9e0bc074286a465b3935e9f83a78fbb0c2
3
+ size 558996179
0_ent_175_negs_hr_05_wr25_1/logs/0_ent_175_negs_hr_05_wr25_1_log_plot.jpg ADDED

Git LFS Details

  • SHA256: 54541d09efa12e98ce83c6a3cfb53e09ffa90d8b8e22fd1d7ce1b6c9b2e150e4
  • Pointer size: 131 Bytes
  • Size of remote file: 437 kB
0_ent_175_negs_hr_05_wr25_1/logs/0_ent_175_negs_hr_05_wr25_1_s26092004_f0_logging.json ADDED
@@ -0,0 +1 @@
 
 
1
+ {"1": {"lr": [2e-05, 0.0005], "train_loss": 0.020961720496416092, "total": 0.020961720960775924, "span_loss": 0.020961720960775924}, "2": {"lr": [1.988303923565381e-05, 0.0004969282409784868], "train_loss": 0.014191273599863052, "total": 0.014191274072552208, "span_loss": 0.014191274072552208}, "3": {"lr": [1.9535036904803962e-05, 0.0004877886008156408], "train_loss": 0.013201650232076645, "total": 0.01320165012587776, "span_loss": 0.01320165012587776}, "4": {"lr": [1.8964561979789496e-05, 0.00047280612778499774], "train_loss": 0.012403259985148907, "total": 0.012403260002328139, "span_loss": 0.012403260002328139}, "5": {"lr": [1.8185661446562005e-05, 0.00045234974009654937], "train_loss": 0.011563217267394066, "total": 0.011563217393375095, "span_loss": 0.011563217393375095}, "6": {"lr": [1.7217514421272206e-05, 0.00042692314190604356], "train_loss": 0.010949498042464256, "total": 0.010949497851930962, "span_loss": 0.010949497851930962}, "7": {"lr": [1.60839598967785e-05, 0.00039715242044697206], "train_loss": 0.00987175852060318, "total": 0.009871758449803923, "span_loss": 0.009871758449803923}, "8": {"lr": [1.4812909747525698e-05, 0.00036377062968501693], "train_loss": 0.009031984023749828, "total": 0.009031984511535883, "span_loss": 0.009031984511535883, "val_score": 0.7134464324282884, "best_score": 0.7134464324282884, "new_best_model": true, "precision": 0.7005837180317529, "recall": 0.7295585606497342, "f1": 0.7134464324282884}, "9": {"lr": [1.3435661446562005e-05, 0.0003275997400965494], "train_loss": 0.008218602277338505, "total": 0.008218602670378496, "span_loss": 0.008218602670378496, "val_score": 0.7146105123135245, "best_score": 0.7146105123135245, "new_best_model": true, "precision": 0.7020190146816602, "recall": 0.7304271346245945, "f1": 0.7146105123135245}, "10": {"lr": [1.1986127417882198e-05, 0.00028953039902753766], "train_loss": 0.007431660778820515, "total": 0.007431660903239797, "span_loss": 0.007431660903239797, "val_score": 0.7134536364473689, "best_score": 0.7146105123135245, "new_best_model": false, "precision": 0.7026598725759119, "recall": 0.7273251164341132, "f1": 0.7134536364473689}, "11": {"lr": [1.0500000000000003e-05, 0.0002505], "train_loss": 0.00675791222602129, "total": 0.006757912121384153, "span_loss": 0.006757912121384153, "val_score": 0.7136868938582748, "best_score": 0.7146105123135245, "new_best_model": false, "precision": 0.7043648009312882, "recall": 0.7259899522589253, "f1": 0.7136868938582748}, "12": {"lr": [9.013872582117811e-06, 0.00021146960097246246], "train_loss": 0.00601030420511961, "total": 0.006010304488837219, "span_loss": 0.006010304488837219, "val_score": 0.7120223929827854, "best_score": 0.7146105123135245, "new_best_model": false, "precision": 0.7032033689425254, "recall": 0.7237277542155913, "f1": 0.7120223929827854}, "13": {"lr": [7.564338553438001e-06, 0.00017340025990345064], "train_loss": 0.005376620218157768, "total": 0.005376620156729002, "span_loss": 0.005376620156729002, "val_score": 0.710441003909232, "best_score": 0.7146105123135245, "new_best_model": false, "precision": 0.7029803410947579, "recall": 0.7206067540140515, "f1": 0.710441003909232}, "14": {"lr": [6.1870902524743065e-06, 0.00013722937031498307], "train_loss": 0.004949146416038275, "total": 0.004949146439204208, "span_loss": 0.004949146439204208, "val_score": 0.7094792682655269, "best_score": 0.7146105123135245, "new_best_model": false, "precision": 0.7041239298442693, "recall": 0.7174488391184694, "f1": 0.7094792682655269}, "15": {"lr": [4.916040103221507e-06, 0.00010384757955302797], "train_loss": 0.004475330002605915, "total": 0.004475330226977089, "span_loss": 0.004475330226977089, "val_score": 0.708377095183791, "best_score": 0.7146105123135245, "new_best_model": false, "precision": 0.7052154919777592, "recall": 0.7141250286032995, "f1": 0.708377095183791}, "16": {"lr": [3.7824855787278e-06, 7.40768580939564e-05], "train_loss": 0.004132495261728764, "total": 0.004132495504840917, "span_loss": 0.004132495504840917, "val_score": 0.7086034397758405, "best_score": 0.7146105123135245, "new_best_model": false, "precision": 0.707740108993689, "recall": 0.7119498625745739, "f1": 0.7086034397758405}, "17": {"lr": [2.814338553438001e-06, 4.865025990345063e-05], "train_loss": 0.0037781288847327232, "total": 0.0037781289997815153, "span_loss": 0.0037781289997815153, "val_score": 0.7088597749522912, "best_score": 0.7146105123135245, "new_best_model": false, "precision": 0.7089025722431348, "recall": 0.7112362509726536, "f1": 0.7088597749522912}, "18": {"lr": [2.0354380202105066e-06, 2.8193872215002235e-05], "train_loss": 0.0036237267777323723, "total": 0.003623726782417617, "span_loss": 0.003623726782417617, "val_score": 0.7089386166436004, "best_score": 0.7146105123135245, "new_best_model": false, "precision": 0.7110026936604456, "recall": 0.70934741329177, "f1": 0.7089386166436004}}
0_ent_175_negs_hr_05_wr25_1/r1s/0_ent_175_negs_hr_05_wr25_1_s26092004_f0_r1_vs0.71461_ema.pth ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:43ae11e0af5c6ef88e49577c28d6725328c626df2a0eade319cf2a5075c1af61
3
+ size 558998011
0_ent_175_negs_hr_05_wr25_1/results/0_ent_175_negs_hr_05_wr25_1_error_analyze_result.json ADDED
The diff for this file is too large to render. See raw diff
 
0_ent_175_negs_hr_05_wr25_1/results/0_ent_175_negs_hr_05_wr25_1_pred_test.json ADDED
The diff for this file is too large to render. See raw diff
 
0_ent_175_negs_hr_05_wr25_1/results/0_ent_175_negs_hr_05_wr25_1_test.json ADDED
@@ -0,0 +1,26 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "Best model": {
3
+ "Ent-I": {
4
+ "precision": 0.6704268292677816,
5
+ "recall": 0.8175480992649711,
6
+ "f1": 0.7367142628149196
7
+ },
8
+ "Ent-C": {
9
+ "precision": 0.5961890243897895,
10
+ "recall": 0.7263441359450957,
11
+ "f1": 0.6548620654568527
12
+ }
13
+ },
14
+ "Last model": {
15
+ "Ent-I": {
16
+ "precision": 0.6891697328421938,
17
+ "recall": 0.8008179198802855,
18
+ "f1": 0.7408107942192176
19
+ },
20
+ "Ent-C": {
21
+ "precision": 0.6063829787229192,
22
+ "recall": 0.7039650849654526,
23
+ "f1": 0.6515405390519211
24
+ }
25
+ }
26
+ }
0_ent_175_negs_hr_05_wr25_1/results/0_ent_175_negs_hr_05_wr25_1_test_df.xlsx ADDED
Binary file (5.29 kB). View file
 
0_ent_175_negs_hr_05_wr25_1/results/0_ent_175_negs_hr_05_wr25_1_test_df_best.xlsx ADDED
Binary file (5.29 kB). View file
 
0_ent_175_negs_hr_05_wr25_1/results/all_splits/0_ent_175_negs_hr_05_wr25_1_predict_result_split_0.json ADDED
The diff for this file is too large to render. See raw diff
 
0_ent_175_negs_hr_05_wr25_1/results/all_splits/0_ent_175_negs_hr_05_wr25_1_predict_result_split_1.json ADDED
The diff for this file is too large to render. See raw diff
 
0_ent_175_negs_hr_05_wr25_1/results/all_splits/0_ent_175_negs_hr_05_wr25_1_predict_result_split_10.json ADDED
The diff for this file is too large to render. See raw diff
 
0_ent_175_negs_hr_05_wr25_1/results/all_splits/0_ent_175_negs_hr_05_wr25_1_predict_result_split_11.json ADDED
The diff for this file is too large to render. See raw diff
 
0_ent_175_negs_hr_05_wr25_1/results/all_splits/0_ent_175_negs_hr_05_wr25_1_predict_result_split_12.json ADDED
The diff for this file is too large to render. See raw diff
 
0_ent_175_negs_hr_05_wr25_1/results/all_splits/0_ent_175_negs_hr_05_wr25_1_predict_result_split_13.json ADDED
The diff for this file is too large to render. See raw diff
 
0_ent_175_negs_hr_05_wr25_1/results/all_splits/0_ent_175_negs_hr_05_wr25_1_predict_result_split_14.json ADDED
The diff for this file is too large to render. See raw diff
 
0_ent_175_negs_hr_05_wr25_1/results/all_splits/0_ent_175_negs_hr_05_wr25_1_predict_result_split_15.json ADDED
The diff for this file is too large to render. See raw diff
 
0_ent_175_negs_hr_05_wr25_1/results/all_splits/0_ent_175_negs_hr_05_wr25_1_predict_result_split_16.json ADDED
The diff for this file is too large to render. See raw diff
 
0_ent_175_negs_hr_05_wr25_1/results/all_splits/0_ent_175_negs_hr_05_wr25_1_predict_result_split_17.json ADDED
The diff for this file is too large to render. See raw diff
 
0_ent_175_negs_hr_05_wr25_1/results/all_splits/0_ent_175_negs_hr_05_wr25_1_predict_result_split_18.json ADDED
The diff for this file is too large to render. See raw diff
 
0_ent_175_negs_hr_05_wr25_1/results/all_splits/0_ent_175_negs_hr_05_wr25_1_predict_result_split_19.json ADDED
The diff for this file is too large to render. See raw diff
 
0_ent_175_negs_hr_05_wr25_1/results/all_splits/0_ent_175_negs_hr_05_wr25_1_predict_result_split_2.json ADDED
The diff for this file is too large to render. See raw diff
 
0_ent_175_negs_hr_05_wr25_1/results/all_splits/0_ent_175_negs_hr_05_wr25_1_predict_result_split_20.json ADDED
The diff for this file is too large to render. See raw diff
 
0_ent_175_negs_hr_05_wr25_1/results/all_splits/0_ent_175_negs_hr_05_wr25_1_predict_result_split_21.json ADDED
The diff for this file is too large to render. See raw diff
 
0_ent_175_negs_hr_05_wr25_1/results/all_splits/0_ent_175_negs_hr_05_wr25_1_predict_result_split_22.json ADDED
The diff for this file is too large to render. See raw diff
 
0_ent_175_negs_hr_05_wr25_1/results/all_splits/0_ent_175_negs_hr_05_wr25_1_predict_result_split_23.json ADDED
The diff for this file is too large to render. See raw diff
 
0_ent_175_negs_hr_05_wr25_1/results/all_splits/0_ent_175_negs_hr_05_wr25_1_predict_result_split_24.json ADDED
The diff for this file is too large to render. See raw diff
 
0_ent_175_negs_hr_05_wr25_1/results/all_splits/0_ent_175_negs_hr_05_wr25_1_predict_result_split_25.json ADDED
The diff for this file is too large to render. See raw diff
 
0_ent_175_negs_hr_05_wr25_1/results/all_splits/0_ent_175_negs_hr_05_wr25_1_predict_result_split_26.json ADDED
@@ -0,0 +1,1770 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [
2
+ {
3
+ "text": "Kính gửi Bộ Tư pháp và Bộ Tài chính! Công ty chúng tôi là một doanh nghiệp đấu giá tài sản. Chúng tôi vừa hoàn thành việc đấu giá thành công một lô tài sản lớn. Người mua thành công có yêu cầu công ty chúng tôi cung cấp dịch vụ hỗ trợ làm thủ tục chuyển quyền sở hữu tài sản tại các cơ quan nhà nước có thẩm quyền. Hai bên đã thương lượng và thống nhất mức chi phí cho dịch vụ này. Theo quy định tại Điều 67 Luật Đấu giá tài sản, chi phí dịch vụ này được thực hiện theo thỏa thuận giữa các bên. Tuy nhiên, tại điểm đ khoản 2 Điều 78 Luật này quy định Bộ Tài chính có trách nhiệm \"Quy định khung thù lao dịch vụ đấu giá\". Xin hỏi: Đối với khoản chi phí dịch vụ làm thủ tục chuyển quyền sở hữu mà người mua yêu cầu và chúng tôi cung cấp theo Điều 67, giá trị hợp đồng dịch vụ giữa hai bên có bắt buộc phải nằm trong khung thù lao dịch vụ đấu giá do Bộ Tài chính quy định hay không? Nếu vượt khung thì có được coi là vi phạm pháp luật về đấu giá không? Rất mong nhận được sự hướng dẫn của các Bộ. Trân trọng cảm ơn!",
4
+ "entities": [
5
+ [
6
+ "Bộ Tư pháp và Bộ Tài chính",
7
+ "CO_QUAN_THAM_QUYEN"
8
+ ],
9
+ [
10
+ "Công ty chúng tôi",
11
+ "TO_CHUC"
12
+ ],
13
+ [
14
+ "doanh nghiệp đấu giá tài sản",
15
+ "CHUC_DANH"
16
+ ],
17
+ [
18
+ "Người mua thành công",
19
+ "BEN_THU_BA"
20
+ ],
21
+ [
22
+ "Bộ Tài chính",
23
+ "CO_QUAN_THAM_QUYEN"
24
+ ],
25
+ [
26
+ "người mua",
27
+ "BEN_THU_BA"
28
+ ],
29
+ [
30
+ "Bộ Tài chính",
31
+ "CO_QUAN_THAM_QUYEN"
32
+ ]
33
+ ]
34
+ },
35
+ {
36
+ "text": "Kính gửi Bộ Tài nguyên và Môi trường! Công ty chúng tôi đang có nhu cầu khai thác khoáng sản (cát xây dựng) tại một khu vực. Trong quá trình chuẩn bị hồ sơ, chúng tôi được biết Nhà nước đã có kết quả điều tra, đánh giá tiềm năng và thăm dò khoáng sản tại khu vực này từ trước. Tuy nhiên, để đảm bảo độ chính xác và phù hợp với quy mô dự kiến, công ty chúng tôi đã tự bỏ kinh phí để thực hiện lại công tác khảo sát, đánh giá chi tiết và lập hồ sơ đề nghị cấp giấy phép khai thác dựa trên kết quả khảo sát của mình, không sử dụng số liệu từ báo cáo điều tra của Nhà nước. Xin hỏi: Trong trường hợp này, khi được cấp phép khai thác, công ty chúng tôi có bắt buộc phải hoàn trả chi phí đánh giá tiềm năng, thăm dò khoáng sản mà Nhà nước đã đầu tư trước đó cho khu vực đó hay không? Nếu phải hoàn trả, căn cứ pháp lý cụ thể là gì?",
37
+ "entities": [
38
+ [
39
+ "Bộ Tài nguyên và Môi trường",
40
+ "CO_QUAN_THAM_QUYEN"
41
+ ],
42
+ [
43
+ "Công ty chúng tôi",
44
+ "TO_CHUC"
45
+ ],
46
+ [
47
+ "Nhà nước",
48
+ "BEN_THU_BA"
49
+ ],
50
+ [
51
+ "Nhà nước",
52
+ "BEN_THU_BA"
53
+ ]
54
+ ]
55
+ },
56
+ {
57
+ "text": "Kính gửi Bộ Nội vụ, tôi là một thanh niên 25 tuổi. Hiện tại, tôi đang có nhu cầu vay vốn để khởi nghiệp theo chính sách tại Điều 18 Luật Thanh niên. Đồng thời, tôi cũng đang có ý định tham gia nghĩa vụ quân sự để sau khi hoàn thành sẽ được hưởng các chính sách hỗ trợ đào tạo nghề theo Điều 21. Tôi xin hỏi: 1. Liệu tôi có thể cùng một lúc đăng ký vay vốn khởi nghiệp (Điều 18) và đăng ký tham gia nghĩa vụ quân sự (Điều 21) được không? Hay tôi phải hoàn thành nghĩa vụ quân sự trước rồi mới được xét vay vốn khởi nghiệp? 2. Trong trường hợp tôi tham gia nghĩa vụ quân sự và được hưởng chính sách hỗ trợ đào tạo nghề sau đó, tôi có tiếp tục được hưởng các ưu đãi, hỗ trợ về khởi nghiệp (như hỗ trợ pháp lý, khoa học công nghệ) hay không? 3. Nếu tôi vay vốn khởi nghiệp và sau đó tham gia nghĩa vụ quân sự, việc trả nợ vay vốn trong thời gian tại ngũ sẽ được xử lý như thế nào? Rất mong nhận được phản hồi từ Bộ để tôi có thể lên kế hoạch phù hợp cho bản thân.",
58
+ "entities": [
59
+ [
60
+ "Bộ Nội vụ",
61
+ "CO_QUAN_THAM_QUYEN"
62
+ ],
63
+ [
64
+ "tôi",
65
+ "NGUOI"
66
+ ]
67
+ ]
68
+ },
69
+ {
70
+ "text": "Kính gửi Bộ Công an! Tôi là Trưởng phòng Công nghệ Thông tin của một cơ quan nhà nước. Chúng tôi có một hệ thống thông tin đã được xác định là quan trọng về an ninh quốc gia. Khi triển khai hoạt động bảo vệ an ninh mạng cho cơ quan mình, chúng tôi có thắc mắc sau: Theo Điều 14 Luật An ninh mạng, hệ thống thông tin quan trọng về an ninh quốc gia sẽ được giám sát bởi lực lượng chuyên trách bảo vệ an ninh mạng (khoản 3). Trong khi đó, theo điểm e khoản 1 Điều 23 Luật An ninh mạng và Nghị định hướng dẫn, người đứng đầu cơ quan nhà nước có trách nhiệm tổ chức kiểm tra an ninh mạng đối với hệ thống thông tin của cơ quan mình. Xin hỏi: Đối với hệ thống thông tin quan trọng về an ninh quốc gia mà đã nằm trong phạm vi giám sát thường xuyên của lực lượng chuyên trách (theo Điều 14), thì người đứng đầu cơ quan chúng tôi (chủ quản hệ thống) có bắt buộc phải tự tổ chức thêm các cuộc kiểm tra an ninh mạng định kỳ hay đột xuất cho hệ thống đó theo quy định tại Điều 23 nữa không? Hay hoạt động giám sát của lực lượng chuyên trách được coi là đã đáp ứng yêu cầu kiểm tra của Điều 23? Trân trọng cảm ơn!",
71
+ "entities": [
72
+ [
73
+ "Bộ Công an",
74
+ "CO_QUAN_THAM_QUYEN"
75
+ ],
76
+ [
77
+ "Tôi",
78
+ "NGUOI"
79
+ ],
80
+ [
81
+ "Trưởng phòng Công nghệ Thông tin",
82
+ "CHUC_DANH"
83
+ ],
84
+ [
85
+ "một cơ quan nhà nước",
86
+ "TO_CHUC"
87
+ ],
88
+ [
89
+ "Chúng tôi",
90
+ "NHOM_NGUOI"
91
+ ],
92
+ [
93
+ "lực lượng chuyên trách bảo vệ an ninh mạng",
94
+ "NHOM_NGUOI"
95
+ ],
96
+ [
97
+ "người đứng đầu cơ quan nhà nước",
98
+ "CHUC_DANH"
99
+ ],
100
+ [
101
+ "lực lượng chuyên trách",
102
+ "CO_QUAN_THAM_QUYEN"
103
+ ],
104
+ [
105
+ "người đứng đầu cơ quan chúng tôi",
106
+ "CHUC_DANH"
107
+ ],
108
+ [
109
+ "chủ quản hệ thống",
110
+ "CHUC_DANH"
111
+ ],
112
+ [
113
+ "lực lượng chuyên trách",
114
+ "CO_QUAN_THAM_QUYEN"
115
+ ]
116
+ ]
117
+ },
118
+ {
119
+ "text": "Kính gửi Bộ Tư pháp, tôi hiện là một công dân muốn thực hiện quyền tiếp cận thông tin. Tôi có một thắc mắc cần được giải đáp như sau: Trong một dự án đầu tư của địa phương, tôi yêu cầu được cung cấp toàn bộ hồ sơ dự án, bao gồm báo cáo đánh giá tác động môi trường và các tài liệu kỹ thuật chi tiết của dự án. Tuy nhiên, cơ quan chức năng từ chối cung cấp với lý do đây là \"thông tin nội bộ\" và có liên quan đến \"bí mật công tác\" theo Điều 6 Luật Tiếp cận thông tin. Xin hỏi: Nếu các thông tin trên đã được giải mật sau một thời gian nhất định, liệu tôi có quyền được tiếp cận chúng hay không? Và nếu được, thủ tục yêu cầu cung cấp thông tin trong trường hợp này như thế nào? Tôi xin chân thành cảm ơn.",
120
+ "entities": [
121
+ [
122
+ "Bộ Tư pháp",
123
+ "CO_QUAN_THAM_QUYEN"
124
+ ],
125
+ [
126
+ "tôi",
127
+ "NGUOI"
128
+ ],
129
+ [
130
+ "công dân",
131
+ "CHUC_DANH"
132
+ ],
133
+ [
134
+ "Tôi",
135
+ "NGUOI"
136
+ ],
137
+ [
138
+ "cơ quan chức năng",
139
+ "BEN_THU_BA"
140
+ ]
141
+ ]
142
+ },
143
+ {
144
+ "text": "Kính gửi Ban Pháp chế, Liên đoàn Lao động Thành phố Hồ Chí Minh! Tôi là một người lao động làm việc tại một doanh nghiệp tư nhân. Tại nơi tôi làm việc, ban chấp hành công đoàn cơ sở chưa được thành lập. Một số anh chị em trong công ty chúng tôi đã tự nguyện thành lập một nhóm đại diện người lao động để trao đổi với ban lãnh đạo công ty về các vấn đề như tăng lương, cải thiện điều kiện làm việc. Khi nhóm chúng tôi đề nghị thương lượng tập thể, công ty từ chối với lý do chỉ có tổ chức công đoàn mới có quyền đại diện để thương lượng tập thể. Xin hỏi: Trong trường hợp chưa có tổ chức công đoàn cơ sở, một nhóm đại diện người lao động do tập thể bầu ra có được tiến hành thương lượng tập thể và ký kết thỏa ước lao động tập thể với người sử dụng lao động hay không? Nếu được, căn cứ pháp lý ở đâu?",
145
+ "entities": [
146
+ [
147
+ "Ban Pháp chế, Liên đoàn Lao động Thành phố Hồ Chí Minh",
148
+ "CO_QUAN_THAM_QUYEN"
149
+ ],
150
+ [
151
+ "Tôi",
152
+ "NGUOI"
153
+ ],
154
+ [
155
+ "người lao động",
156
+ "CHUC_DANH"
157
+ ],
158
+ [
159
+ "một doanh nghiệp tư nhân",
160
+ "TO_CHUC"
161
+ ],
162
+ [
163
+ "ban chấp hành công đoàn cơ sở",
164
+ "TO_CHUC"
165
+ ],
166
+ [
167
+ "Một số anh chị em trong công ty chúng t��i",
168
+ "NHOM_NGUOI"
169
+ ],
170
+ [
171
+ "một nhóm đại diện người lao động",
172
+ "NHOM_NGUOI"
173
+ ],
174
+ [
175
+ "ban lãnh đạo công ty",
176
+ "TO_CHUC"
177
+ ],
178
+ [
179
+ "tổ chức công đoàn",
180
+ "TO_CHUC"
181
+ ],
182
+ [
183
+ "người sử dụng lao động",
184
+ "BEN_THU_BA"
185
+ ]
186
+ ]
187
+ },
188
+ {
189
+ "text": "Kính gửi Cục Hàng không Việt Nam! Công ty chúng tôi là doanh nghiệp vận tải hàng không. Ngày 10/02/2025, chúng tôi thực hiện chuyến bay charter vận chuyển hàng hóa theo hợp đồng thuê chuyến từ sân bay Nội Bài (Hà Nội) đến sân bay Tân Sơn Nhất (TP.HCM). Trên chuyến bay có một lô hành lý ký gửi (không phải hàng hóa thương mại) nhưng khi đến nơi, không có người đến nhận. Chúng tôi đã thông báo cho bên thuê chuyến nhưng họ không phản hồi. Theo quy định tại Điều 150 Luật Hàng không dân dụng, hành lý được thanh lý nếu không có người nhận trong 30 ngày kể từ ngày đến địa điểm đến. Tuy nhiên, đây là hành lý vận chuyển theo hợp đồng thuê chuyến, không phải vận chuyển theo chuyến bay thông thường bán vé cho từng hành khách. Xin hỏi: Đối với hành lý trong vận chuyển hàng không theo hợp đồng thuê chuyến (charter) như trường hợp của chúng tôi, thời hạn 30 ngày để thanh lý được tính từ thời điểm nào? Có áp dụng tương tự như quy định tại Điều 150 hay không? Rất mong nhận được sự hướng dẫn của Cục. Trân trọng cảm ơn!",
190
+ "entities": [
191
+ [
192
+ "Cục Hàng không Việt Nam",
193
+ "CO_QUAN_THAM_QUYEN"
194
+ ],
195
+ [
196
+ "Công ty chúng tôi",
197
+ "TO_CHUC"
198
+ ],
199
+ [
200
+ "doanh nghiệp vận tải hàng không",
201
+ "CHUC_DANH"
202
+ ],
203
+ [
204
+ "chúng tôi",
205
+ "TO_CHUC"
206
+ ],
207
+ [
208
+ "bên thuê chuyến",
209
+ "BEN_THU_BA"
210
+ ]
211
+ ]
212
+ },
213
+ {
214
+ "text": "Kính gửi Cơ quan chức năng, công ty chúng tôi là doanh nghiệp tư nhân thường xuyên có các giao dịch điện tử với cơ quan thuế và hải quan. Trong nội bộ công ty, chúng tôi đang sử dụng một hệ thống phần mềm quản lý riêng để ký duyệt và phê duyệt các văn bản, hợp đồng nội bộ và tạo ra chữ ký điện tử chuyên dùng đáp ứng đầy đủ các yêu cầu tại khoản 2 Điều 22 Luật Giao dịch điện tử. Tuy nhiên, khi gửi tờ khai thuế điện tử, báo cáo tài chính điện tử hoặc thực hiện các thủ tục hải quan điện tử, các cơ quan này yêu cầu phải sử dụng chữ ký số công cộng do các tổ chức cung cấp dịch vụ chứng thực chữ ký số cấp. Xin hỏi: Trong trường hợp này, chữ ký điện tử chuyên dùng do công ty chúng tôi tự tạo lập và quản lý có được công nhận giá trị pháp lý tương đương với chữ ký số công cộng để thực hiện các giao dịch điện tử với cơ quan nhà nước nói trên hay không? Nếu không được, căn cứ pháp lý cụ thể nào quy định về việc này?",
215
+ "entities": [
216
+ [
217
+ "Cơ quan chức năng",
218
+ "CO_QUAN_THAM_QUYEN"
219
+ ],
220
+ [
221
+ "công ty chúng tôi",
222
+ "TO_CHUC"
223
+ ],
224
+ [
225
+ "doanh nghiệp tư nhân",
226
+ "CHUC_DANH"
227
+ ],
228
+ [
229
+ "cơ quan thuế và hải quan",
230
+ "BEN_THU_BA"
231
+ ],
232
+ [
233
+ "các cơ quan này",
234
+ "BEN_THU_BA"
235
+ ],
236
+ [
237
+ "các tổ chức cung cấp dịch vụ chứng thực chữ ký số",
238
+ "TO_CHUC"
239
+ ]
240
+ ]
241
+ },
242
+ {
243
+ "text": "Thưa cơ quan có thẩm quyền, tôi có thắc mắc về trách nhiệm của chính quyền địa phương liên quan đến việc bảo vệ Cơ sở dữ liệu quốc gia về dân cư. Theo Luật Căn cước công dân 2014, Ủy ban nhân dân tỉnh có nhiệm vụ triển khai và tổ chức thực hiện các văn bản liên quan đến Cơ sở dữ liệu này tại địa phương. Tuy nhiên, tôi không thấy điều luật nào quy định cụ thể về trách nhiệm bảo đảm an toàn, chống rò rỉ, lộ lọt thông tin dân cư khi địa phương tiếp cận và sử dụng cơ sở dữ liệu này. Vậy xin hỏi: Khi Cơ sở dữ liệu quốc gia về dân cư được kết nối, chia sẻ đến các sở, ngành tại địa phương để phục vụ công tác quản lý, thì Ủy ban nhân dân tỉnh có trách nhiệm gì trong việc bảo đảm an ninh, an toàn thông tin, phòng chống hành vi truy cập, sử dụng trái phép hoặc làm thất thoát dữ liệu? Có văn bản pháp luật nào quy định chi tiết trách nhiệm này không?",
244
+ "entities": [
245
+ [
246
+ "cơ quan có thẩm quyền",
247
+ "CO_QUAN_THAM_QUYEN"
248
+ ],
249
+ [
250
+ "tôi",
251
+ "NGUOI"
252
+ ],
253
+ [
254
+ "chính quyền địa phương",
255
+ "TO_CHUC"
256
+ ],
257
+ [
258
+ "Ủy ban nhân dân tỉnh",
259
+ "CO_QUAN_THAM_QUYEN"
260
+ ],
261
+ [
262
+ "địa phương",
263
+ "BEN_THU_BA"
264
+ ],
265
+ [
266
+ "các sở, ngành tại địa phương",
267
+ "BEN_THU_BA"
268
+ ],
269
+ [
270
+ "Ủy ban nhân dân tỉnh",
271
+ "CO_QUAN_THAM_QUYEN"
272
+ ]
273
+ ]
274
+ },
275
+ {
276
+ "text": "Kính gửi Bộ Tài chính, Công ty chúng tôi là doanh nghiệp do Nhà nước nắm giữ 100% vốn điều lệ, chịu sự quản lý của Bộ Tài chính với tư cách là cơ quan đại diện chủ sở hữu. Hội đồng thành viên của công ty đang xem xét đề án về tiền lương, tiền thưởng và các quyền lợi khác cho Tổng Giám đốc trong năm tài chính tới. Chúng tôi có thắc mắc về trình tự, thủ tục cần tuân thủ như sau: Căn cứ vào Điều 32 và Điều 44 Luật Quản lý, sử dụng vốn Nhà nước đầu tư vào sản xuất, kinh doanh tại doanh nghiệp, đối với Tổng Giám đốc, việc quyết định tiền lương, thù lao, tiền thưởng và các quyền lợi khác thuộc thẩm quyền của Hội đồng thành viên. Tuy nhiên, tại khoản 2 Điều 44 cũng quy định một số nội dung Hội đồng thành viên phải quyết định sau khi cơ quan đại diện chủ sở hữu phê duyệt. Vậy xin hỏi: Khi Hội đồng thành viên quyết định về các khoản tiền thưởng và quyền lợi cho Tổng Giám đốc theo quy định tại điểm b khoản 3 Điều 44, có nhất thiết phải trình toàn bộ đề án này lên Bộ Tài chính (cơ quan đại diện chủ sở hữu) để xin phê duyệt trước như đối với việc \"bổ nhiệm, bổ nhiệm lại, miễn nhiệm, khen thưởng, kỷ luật đối với Tổng giám đốc\" (quy định tại điểm b khoản 2) hay không? Hay Hội đồng thành viên có thể tự ban hành quy chế và quyết định trực tiếp mà không cần sự phê duyệt trước của Bộ? Chúng tôi kính mong nhận được hướng dẫn cụ thể.",
277
+ "entities": [
278
+ [
279
+ "Bộ Tài chính",
280
+ "CO_QUAN_THAM_QUYEN"
281
+ ],
282
+ [
283
+ "Công ty chúng tôi",
284
+ "TO_CHUC"
285
+ ],
286
+ [
287
+ "doanh nghiệp do Nhà nước nắm giữ 100 % vốn điều lệ",
288
+ "CHUC_DANH"
289
+ ],
290
+ [
291
+ "cơ quan đại diện chủ sở hữu",
292
+ "CHUC_DANH"
293
+ ],
294
+ [
295
+ "Hội đồng thành viên của công ty",
296
+ "NHOM_NGUOI"
297
+ ],
298
+ [
299
+ "Tổng Giám đốc",
300
+ "CHUC_DANH"
301
+ ],
302
+ [
303
+ "Tổng Giám đốc",
304
+ "CHUC_DANH"
305
+ ],
306
+ [
307
+ "cơ quan đại diện chủ sở hữu",
308
+ "BEN_THU_BA"
309
+ ],
310
+ [
311
+ "Tổng Giám đốc",
312
+ "CHUC_DANH"
313
+ ],
314
+ [
315
+ "Bộ Tài chính",
316
+ "CO_QUAN_THAM_QUYEN"
317
+ ]
318
+ ]
319
+ },
320
+ {
321
+ "text": "Kính gửi Cục Quản lý cạnh tranh (Bộ Công Thương), Công ty tôi kinh doanh đồ chơi trực tuyến. Trong đợt kiểm tra gần đây, công ty bị phát hiện vi phạm quy định về thông tin sản phẩm, gây hiểu lầm cho người tiêu dùng và đã bị xử phạt vi phạm hành chính. Công ty đã chấp hành xong quyết định xử phạt. Hiện tại, công ty tôi đang xây dựng lại quy trình nội bộ. Xin được hỏi: 1. Trong trường hợp công ty đã bị xử lý vi phạm theo Luật Bảo vệ quyền lợi người tiêu dùng (có thể bị công khai thông tin cảnh báo theo Điều 40), thì có còn phải thực hiện trách nhiệm công khai quy trình tiếp nhận, giải quyết khiếu nại của người tiêu dùng tại địa điểm kinh doanh và trên trang web theo quy định tại khoản 3 Điều 31 Luật Bảo vệ quyền lợi người tiêu dùng nữa không? 2. Việc công khai quy trình nêu trên và việc công khai thông tin cảnh báo (nếu có) theo Điều 40 là hai trách nhiệm độc lập hay có sự thay thế, loại trừ lẫn nhau? Kính mong Cục giải đáp giúp để công ty tôi tuân thủ đúng quy định pháp luật. Trân trọng cảm ơn!",
322
+ "entities": [
323
+ [
324
+ "Cục Quản lý cạnh tranh ( Bộ Công Thương )",
325
+ "CO_QUAN_THAM_QUYEN"
326
+ ],
327
+ [
328
+ "Công ty tôi",
329
+ "TO_CHUC"
330
+ ],
331
+ [
332
+ "người tiêu dùng",
333
+ "NHOM_NGUOI"
334
+ ],
335
+ [
336
+ "công ty tôi",
337
+ "TO_CHUC"
338
+ ]
339
+ ]
340
+ },
341
+ {
342
+ "text": "Kính gửi Bộ Nội vụ. Tôi là viên chức đang làm việc tại một đơn vị sự nghiệp công lập, thuộc lĩnh vực giáo dục đào tạo. D��� kiến ngày 01/01/2025, tôi sẽ nghỉ hưu theo quy định. Tuy nhiên, đến thời điểm cuối năm 2024, tôi vẫn còn 12 ngày phép năm chưa sử dụng. Xin hỏi quý Bộ: Trường hợp của tôi, nếu sử dụng hết số ngày phép còn lại này ngay trước thời điểm nghỉ hưu thì có được thanh toán tiền cho những ngày không nghỉ hay không? Và việc sử dụng ngày phép này có ảnh hưởng gì đến thời điểm nghỉ hưu chính thức và các chế độ hưu trí của tôi không? Trân trọng cảm ơn!",
343
+ "entities": [
344
+ [
345
+ "Bộ Nội vụ",
346
+ "CO_QUAN_THAM_QUYEN"
347
+ ],
348
+ [
349
+ "Tôi",
350
+ "NGUOI"
351
+ ],
352
+ [
353
+ "viên chức",
354
+ "CHUC_DANH"
355
+ ],
356
+ [
357
+ "một đơn vị sự nghiệp công lập",
358
+ "TO_CHUC"
359
+ ]
360
+ ]
361
+ },
362
+ {
363
+ "text": "Kính gửi Bộ Thông tin và Truyền thông! Tôi là người đại diện theo pháp luật của một tổ chức đoàn thể. Trong quá trình tổ chức hoạt động, chúng tôi nhận thấy có nhiều cuộc gọi quấy rối, đe dọa từ một số số điện thoại gây ảnh hưởng đến an ninh trật tự nội bộ. Chúng tôi muốn yêu cầu cơ quan có thẩm quyền cung cấp thông tin về chủ sở hữu các số điện thoại nghi vấn này (gồm tên doanh nghiệp viễn thông đã phân bổ số và thông tin của thuê bao sử dụng) để có biện pháp xử lý, bảo vệ quyền lợi của tổ chức. Với tư cách là một tổ chức đoàn thể, việc chúng tôi yêu cầu cung cấp thông tin dựa trên các quy định tại Luật Tiếp cận thông tin (cho phép công dân yêu cầu thông qua tổ chức, đoàn thể) và liên quan đến việc quản lý, sử dụng mã số viễn thông, có được chấp nhận không? Trân trọng cảm ơn!",
364
+ "entities": [
365
+ [
366
+ "Bộ Thông tin và Truyền thông",
367
+ "CO_QUAN_THAM_QUYEN"
368
+ ],
369
+ [
370
+ "Tôi",
371
+ "NGUOI"
372
+ ],
373
+ [
374
+ "người đại diện theo pháp luật",
375
+ "CHUC_DANH"
376
+ ],
377
+ [
378
+ "một tổ chức đoàn thể",
379
+ "TO_CHUC"
380
+ ],
381
+ [
382
+ "chúng tôi",
383
+ "NHOM_NGUOI"
384
+ ],
385
+ [
386
+ "một số số điện thoại",
387
+ "BEN_THU_BA"
388
+ ],
389
+ [
390
+ "cơ quan có thẩm quyền",
391
+ "CO_QUAN_THAM_QUYEN"
392
+ ],
393
+ [
394
+ "doanh nghiệp viễn thông đã phân bổ số",
395
+ "BEN_THU_BA"
396
+ ],
397
+ [
398
+ "thuê bao sử dụng",
399
+ "BEN_THU_BA"
400
+ ],
401
+ [
402
+ "một tổ chức đoàn thể",
403
+ "TO_CHUC"
404
+ ]
405
+ ]
406
+ },
407
+ {
408
+ "text": "Kính gửi Cơ quan quản lý Căn cước! Tôi là công dân Việt Nam, đã có thẻ căn cước mới được tích hợp thông tin bảo hiểm y tế theo quy định. Tôi xin hỏi: Khi tôi đến bệnh viện để khám chữa bệnh theo chế độ bảo hiểm y tế, nếu tôi không mang theo thẻ bảo hiểm y tế bằng giấy (bản gốc) mà chỉ xuất trình thẻ căn cước có tích hợp thông tin bảo hiểm y tế, thì bệnh viện có được chấp nhận để thực hiện thủ tục khám chữa bệnh và thanh toán bảo hiểm y tế cho tôi hay không?",
409
+ "entities": [
410
+ [
411
+ "Cơ quan quản lý Căn cước",
412
+ "CO_QUAN_THAM_QUYEN"
413
+ ],
414
+ [
415
+ "Tôi",
416
+ "NGUOI"
417
+ ],
418
+ [
419
+ "công dân Việt Nam",
420
+ "CHUC_DANH"
421
+ ],
422
+ [
423
+ "Tôi",
424
+ "NGUOI"
425
+ ],
426
+ [
427
+ "bệnh viện",
428
+ "TO_CHUC"
429
+ ]
430
+ ]
431
+ },
432
+ {
433
+ "text": "Kính gửi Bộ Thông tin và Truyền thông! Công ty chúng tôi là doanh nghiệp viễn thông, trong quá trình vận hành mạng lưới đã tự nghiên cứu và phát triển một hệ thống phần mềm giám sát an ninh mạng. Phần mềm này được triển khai trên chính hạ tầng mạng viễn thông công cộng của chúng tôi và chỉ thu thập, phân tích lưu lượng mạng nội bộ nhằm mục đích tự giám sát, phát hiện sớm nguy cơ đe dọa, điểm yếu, lỗ hổng bảo mật để chủ động cảnh báo và khắc phục, đảm bảo an ninh cho hệ thống của mình. Chúng tôi không cung cấp phần mềm này như một dịch vụ cho bên thứ ba hay thu phí từ việc này. Xin hỏi: Hoạt động tự nghiên cứu, phát triển và sử dụng phần mềm giám sát an ninh mạng cho mục đích nội bộ như trên có được xem là hành vi \"sử dụng cơ sở hạ tầng viễn thông của doanh nghiệp viễn thông để kinh doanh dịch vụ viễn thông\" trái phép theo quy định tại điểm d khoản 2 Điều 15 Luật Viễn thông hay không? Việc này có cần đăng ký, xin phép cơ quan nhà nước có thẩm quyền về an ninh mạng không?",
434
+ "entities": [
435
+ [
436
+ "Bộ Thông tin và Truyền thông",
437
+ "CO_QUAN_THAM_QUYEN"
438
+ ],
439
+ [
440
+ "Công ty chúng tôi",
441
+ "TO_CHUC"
442
+ ],
443
+ [
444
+ "doanh nghiệp viễn thông",
445
+ "CHUC_DANH"
446
+ ],
447
+ [
448
+ "chúng tôi",
449
+ "TO_CHUC"
450
+ ],
451
+ [
452
+ "doanh nghiệp viễn thông",
453
+ "TO_CHUC"
454
+ ],
455
+ [
456
+ "cơ quan nhà nước có thẩm quyền về an ninh mạng",
457
+ "CO_QUAN_THAM_QUYEN"
458
+ ]
459
+ ]
460
+ },
461
+ {
462
+ "text": "Kính gửi cơ quan có thẩm quyền! Tôi đã tham gia một hội dân sự được thành lập hợp pháp cách đây vài năm. Gần đây, hội bị giải tán do vi phạm quy định của Luật Quy định quyền lập hội. Tôi chỉ là một thành viên thông thường, không thuộc ban sáng lập, ban chấp hành hay giữ bất kỳ vị trí quản lý nào trong hội. Sau khi hội bị giải tán, tôi vẫn tiếp tục tham gia vào các buổi gặp mặt, sinh hoạt do một số người trong nhóm tự phát tổ chức. Tôi xin hỏi: Trong trường hợp này, nếu việc sinh hoạt nhóm bị xác định là hoạt động tiếp tục của hội đã giải tán, tôi có bị truy cứu trách nhiệm hình sự hoặc xử phạt vi phạm hành chính theo Điều 6 Luật Quy định quyền lập hội không?",
463
+ "entities": [
464
+ [
465
+ "cơ quan có thẩm quyền",
466
+ "CO_QUAN_THAM_QUYEN"
467
+ ],
468
+ [
469
+ "Tôi",
470
+ "NGUOI"
471
+ ],
472
+ [
473
+ "một hội dân sự",
474
+ "TO_CHUC"
475
+ ],
476
+ [
477
+ "một số người trong nhóm",
478
+ "NHOM_NGUOI"
479
+ ],
480
+ [
481
+ "hội đã giải tán",
482
+ "TO_CHUC"
483
+ ]
484
+ ]
485
+ },
486
+ {
487
+ "text": "Tôi xin trình bày tình huống của tôi như sau: Tôi và người vợ cũ đã ly hôn vào năm 2020, có một con chung hiện 7 tuổi. Trong quá trình ly hôn, do mâu thuẫn, người cha (chồng cũ của tôi) từ chối công nhận và không thực hiện bất kỳ nghĩa vụ cấp dưỡng nào cho con. Tôi muốn thực hiện thủ tục xác định cha cho con để đảm bảo quyền lợi của cháu, nhưng người cha không hợp tác và phủ nhận quan hệ này. Tôi có thể yêu cầu Tòa án xác định cha cho con trong trường hợp này không? Và nếu được, tôi cần chuẩn bị những giấy tờ gì và thủ tục sẽ diễn ra như thế nào?",
488
+ "entities": [
489
+ [
490
+ "Tôi",
491
+ "NGUOI"
492
+ ],
493
+ [
494
+ "người vợ cũ",
495
+ "BEN_THU_BA"
496
+ ],
497
+ [
498
+ "người cha ( chồng cũ của tôi )",
499
+ "NGUOI"
500
+ ],
501
+ [
502
+ "người cha",
503
+ "BEN_THU_BA"
504
+ ],
505
+ [
506
+ "Tòa án",
507
+ "CO_QUAN_THAM_QUYEN"
508
+ ]
509
+ ]
510
+ },
511
+ {
512
+ "text": "Kính gửi Cơ quan có thẩm quyền giải thích pháp luật (Ví dụ: Bộ Tư pháp, Bộ Công an), Tôi có thắc mắc liên quan đến nội dung sửa đổi, bổ sung Luật Xử lý vi phạm hành chính (được trích dẫn là Luật sửa đổi, bổ sung một số điều của Luật XLVPHC). Cụ thể, tại điểm 18 Điều 1 của dự thảo luật sửa đổi (tương ứng với việc sửa đổi, bổ sung khoản 1 Điều 122 Luật XLVPHC số 15/2012/QH13), có bổ sung một trong các trường hợp được tạm giữ người theo thủ tục hành chính là: \"Để xác định tình trạng nghiện ma túy\". Trong khi đó, pháp luật hiện hành về phòng, chống ma túy đã có các quy định cụ thể về việc xét nghiệm chất ma túy, quản lý người nghiện, cai nghiện. Việc bổ sung căn cứ \"để xác định tình trạng nghiện ma túy\" vào các trường hợp được tạm giữ người theo thủ tục hành chính có vẻ rất rộng, vì \"nghi ngờ\" một người có thể nghiện ma túy là điều dễ xảy ra. Xin hỏi: 1. Việc bổ sung trường hợp này có phù hợp với nguyên tắc pháp chế, có đảm bảo tính minh bạch và hạn chế tùy tiện trong áp dụng biện pháp tạm giữ người hay không? Liệu nó có mâu thuẫn với các quy định về bảo vệ quyền con người, quyền công dân được Hiến pháp ghi nhận? 2. Trong thực tiễn, tiêu chí để \"nghi ngờ\" một người cần được tạm giữ để xác định tình trạng nghiện ma túy sẽ được áp dụng như thế nào để tránh lạm dụng? Có cần văn bản hướng dẫn cụ thể về điều kiện, trình tự, thủ tục cho trường hợp này không? Rất mong nhận được sự giải đáp của Quý cơ quan. Trân trọng cảm ơn!",
513
+ "entities": [
514
+ [
515
+ "Bộ Tư pháp",
516
+ "CO_QUAN_THAM_QUYEN"
517
+ ],
518
+ [
519
+ "Bộ Công an",
520
+ "CO_QUAN_THAM_QUYEN"
521
+ ],
522
+ [
523
+ "Tôi",
524
+ "NGUOI"
525
+ ]
526
+ ]
527
+ },
528
+ {
529
+ "text": "Kính gửi Bộ Giao thông vận tải! Doanh nghiệp chúng tôi đang vận chuyển hàng viện trợ nhân đạo khẩn cấp (thuốc men, lương thực) cho vùng bị ảnh hưởng bởi bão lụt. Để rút ngắn thời gian, đoàn xe của chúng tôi bắt buộc phải đi qua một tuyến đường cao tốc do công ty tư nhân A đầu tư, xây dựng và đang khai thác theo hình thức BOT. Chúng tôi được biết theo quy định tại Điều 46 Luật Đường bộ, Nhà nước khuyến khích tư nhân tham gia đầu tư đường cao tốc. Tuy nhiên, chúng tôi không rõ đối với các trường hợp vận chuyển nhân đạo khẩn cấp như của chúng tôi, việc thu phí sử dụng đường có được xem xét miễn giảm hay không? Nếu được, cơ quan nào (Bộ Giao thông vận tải, UBND tỉnh hay chủ đầu tư tư nhân) có thẩm quyền quyết định việc miễn giảm phí này? Rất mong Bộ giải đáp để chúng tôi có căn cứ thực hiện.",
530
+ "entities": [
531
+ [
532
+ "Bộ Giao thông vận tải",
533
+ "CO_QUAN_THAM_QUYEN"
534
+ ],
535
+ [
536
+ "Doanh nghiệp chúng tôi",
537
+ "TO_CHUC"
538
+ ],
539
+ [
540
+ "công ty tư nhân A",
541
+ "TO_CHUC"
542
+ ],
543
+ [
544
+ "Bộ Giao thông vận tải",
545
+ "CO_QUAN_THAM_QUYEN"
546
+ ],
547
+ [
548
+ "UBND tỉnh",
549
+ "CO_QUAN_THAM_QUYEN"
550
+ ],
551
+ [
552
+ "chủ đầu tư tư nhân",
553
+ "BEN_THU_BA"
554
+ ]
555
+ ]
556
+ },
557
+ {
558
+ "text": "Kính gửi Bộ Nội vụ! Tôi đã tốt nghiệp Cao đẳng chuyên ngành Lưu trữ học. Hiện nay, tôi có nguyện vọng được hành nghề lưu trữ và muốn làm thủ tục xin cấp Chứng chỉ hành nghề lưu trữ theo quy định tại Luật Lưu trữ 2024. Tôi xin được hỏi: Với bằng tốt nghiệp Cao đẳng ngành lưu trữ, tôi có cần phải tham gia và đạt yêu cầu kỳ kiểm tra nghiệp vụ do Bộ Nội vụ tổ chức để được cấp chứng chỉ hành nghề hay không? Xin chân thành cảm ơn!",
559
+ "entities": [
560
+ [
561
+ "Bộ Nội vụ",
562
+ "CO_QUAN_THAM_QUYEN"
563
+ ],
564
+ [
565
+ "Tôi",
566
+ "NGUOI"
567
+ ],
568
+ [
569
+ "Cao đẳng chuyên ngành Lưu trữ học",
570
+ "CHUC_DANH"
571
+ ],
572
+ [
573
+ "Tôi",
574
+ "NGUOI"
575
+ ],
576
+ [
577
+ "Bộ Nội vụ",
578
+ "CO_QUAN_THAM_QUYEN"
579
+ ]
580
+ ]
581
+ },
582
+ {
583
+ "text": "Kính gửi Cục Đường thủy nội địa Việt Nam, tôi là thuyền trưởng một tàu hàng trên sông. Tình huống cụ thể như sau: Do bão lũ, cơ quan quản lý đã có thông báo hạn chế giao thông đường thủy trên một đoạn sông, yêu cầu các phương tiện phải neo đậu tại bến quy định để tránh trú. Trong thời gian này, con tàu của tôi đang neo đậu theo lệnh thì bất ngờ bị đứt dây neo và mất chủ động, trôi dạt trên luồng vào ban ngày. Xin hỏi: Trong hoàn cảnh đang có lệnh hạn chế giao thông vì thiên tai, và phương tiện của tôi bị mất chủ động, tôi phải tuân thủ quy định báo hiệu nào: 1. Theo Điều 55 Luật Giao thông đường thủy nội địa (treo hai hình thoi đen ở vị trí cao nhất khi mất chủ động ban ngày), hay 2. Có cần tuân thủ thêm các biện pháp báo hiệu đặc biệt nào khác do lệnh hạn chế giao thông quy định không? Rất mong nhận được hướng dẫn cụ thể để đảm bảo an toàn và tuân thủ pháp luật.",
584
+ "entities": [
585
+ [
586
+ "Cục Đường thủy nội địa Việt Nam",
587
+ "CO_QUAN_THAM_QUYEN"
588
+ ],
589
+ [
590
+ "tôi",
591
+ "NGUOI"
592
+ ],
593
+ [
594
+ "thuyền trưởng",
595
+ "CHUC_DANH"
596
+ ],
597
+ [
598
+ "thuyền trưởng một tàu hàng trên sông",
599
+ "CHUC_DANH"
600
+ ],
601
+ [
602
+ "cơ quan quản lý",
603
+ "BEN_THU_BA"
604
+ ]
605
+ ]
606
+ },
607
+ {
608
+ "text": "Kính gửi Viện kiểm sát nhân dân tối cao! Tôi đang có một khiếu nại liên quan đến việc giải quyết tố tụng hình sự tại Tòa án nhân dân cấp huyện. Theo quy định tại Điều 30 Luật Tổ chức Viện kiểm sát nhân dân, Viện kiểm sát có thẩm quyền yêu cầu cơ quan có thẩm quyền giải quyết và ban hành kết luận kiểm sát. Vậy tôi xin hỏi: Trong trường hợp Viện kiểm sát đã yêu cầu Tòa án cấp huyện giải quyết khiếu nại nhưng Tòa án không giải quyết hoặc giải quyết không thỏa đáng, liệu Viện kiểm sát có được ban hành kết luận kiểm sát về việc giải quyết khiếu nại đó không, hay chỉ có thể kiến nghị, kháng nghị? Thủ tục và căn cứ để Viện kiểm sát ban hành kết luận kiểm sát trong trường hợp này được quy định như thế nào?",
609
+ "entities": [
610
+ [
611
+ "Viện kiểm sát nhân dân tối cao",
612
+ "CO_QUAN_THAM_QUYEN"
613
+ ],
614
+ [
615
+ "Tôi",
616
+ "NGUOI"
617
+ ],
618
+ [
619
+ "Tòa án nhân dân cấp huyện",
620
+ "CO_QUAN_THAM_QUYEN"
621
+ ],
622
+ [
623
+ "cơ quan có thẩm quyền",
624
+ "CO_QUAN_THAM_QUYEN"
625
+ ],
626
+ [
627
+ "tôi",
628
+ "NGUOI"
629
+ ],
630
+ [
631
+ "Tòa án cấp huyện",
632
+ "CO_QUAN_THAM_QUYEN"
633
+ ],
634
+ [
635
+ "Viện kiểm sát",
636
+ "CO_QUAN_THAM_QUYEN"
637
+ ]
638
+ ]
639
+ },
640
+ {
641
+ "text": "Kính gửi Tòa án nhân dân tối cao! Tôi có một vụ tranh chấp hợp đồng dân sự đang được thụ lý để hòa giải tại Tòa án theo quy định của Luật Hòa giải, đối thoại tại Tòa án. Quá trình hòa giải đã thành công, các bên đã đạt được thỏa thuận. Hòa giải viên đã ấn định thời gian tổ chức phiên họp ghi nhận kết quả hòa giải tại trụ sở Tòa án theo quy định tại Điều 27. Tuy nhiên, đến ngày diễn ra phiên họp, một trong các bên đương sự (bên A) không thể có mặt trực tiếp vì lý do công tác đột xuất ở tỉnh khác. Thay vào đó, bên A đã làm văn bản ủy quyền hợp lệ cho một luật sư đại diện tham dự phiên họp, với đầy đủ quyền ký kết biên bản ghi nhận kết quả hòa giải thay cho mình. Trong trường hợp này, xin Tòa án giải đáp giúp: 1. Phiên họp ghi nhận kết quả hòa giải có được tiến hành khi một bên không có mặt trực tiếp nhưng có người đại diện hợp pháp tham dự thay thế không? Hay đây được coi là trường hợp \"vắng mặt\" theo quy định tại điểm a khoản 1 Điều 29, buộc phải hoãn phiên họp? 2. Nếu phiên họp vẫn được tiến hành và người đại diện hợp pháp ký vào biên bản, thì kết quả hòa giải đó có được Tòa án công nhận và có giá trị pháp lý như trường hợp các bên có mặt trực tiếp hay không? Rất mong nhận được hướng dẫn của Tòa án để quá trình giải quyết vụ việc được đúng trình tự, bảo đảm quyền lợi của các bên.",
642
+ "entities": [
643
+ [
644
+ "Tòa án nhân dân tối cao",
645
+ "CO_QUAN_THAM_QUYEN"
646
+ ],
647
+ [
648
+ "Tôi",
649
+ "NGUOI"
650
+ ],
651
+ [
652
+ "Hòa giải viên",
653
+ "CHUC_DANH"
654
+ ],
655
+ [
656
+ "một trong các bên đương sự ( bên A )",
657
+ "BEN_THU_BA"
658
+ ],
659
+ [
660
+ "bên A",
661
+ "BEN_THU_BA"
662
+ ],
663
+ [
664
+ "người đại diện hợp pháp",
665
+ "CHUC_DANH"
666
+ ],
667
+ [
668
+ "người đại diện hợp pháp",
669
+ "CHUC_DANH"
670
+ ]
671
+ ]
672
+ },
673
+ {
674
+ "text": "Kính gửi Tòa án nhân dân tối cao, tôi là một Hòa giải viên đang công tác tại Tòa án nhân dân quận. Tôi đã kết thúc nhiệm kỳ 5 năm và đang làm thủ tục để được xem xét bổ nhiệm lại. Trong quá trình công tác, tôi luôn hoàn thành tốt nhiệm vụ được giao, số vụ việc hòa giải thành công cao và không thuộc nhóm 10% có mức độ hoàn thành nhiệm vụ thấp nhất. Tuy nhiên, gần đây tôi phát hiện mình mắc một bệnh mãn tính (tiểu đường type 2) cần điều trị lâu dài, nhưng bệnh này không ảnh hưởng đến khả năng làm việc và tư duy của tôi. Khi khám sức khỏe để làm hồ sơ, bác sĩ kết luận tôi \"đủ sức khỏe làm việc\" nhưng có ghi chú về bệnh nền. Tôi xin hỏi: Trong trường hợp của tôi, dù có bệnh nền nhưng vẫn được cấp giấy chứng nhận đủ sức khỏe làm việc và hoàn thành tốt nhiệm vụ, tôi có đủ điều kiện để được bổ nhiệm lại làm Hòa giải viên không? Rất mong nhận được hướng dẫn của Tòa án. Trân trọng cảm ơn!",
675
+ "entities": [
676
+ [
677
+ "Tòa án nhân dân tối cao",
678
+ "CO_QUAN_THAM_QUYEN"
679
+ ],
680
+ [
681
+ "tôi",
682
+ "NGUOI"
683
+ ],
684
+ [
685
+ "Hòa giải viên",
686
+ "CHUC_DANH"
687
+ ],
688
+ [
689
+ "Tòa án nhân dân quận",
690
+ "TO_CHUC"
691
+ ],
692
+ [
693
+ "bác sĩ",
694
+ "BEN_THU_BA"
695
+ ],
696
+ [
697
+ "Hòa giải viên",
698
+ "CHUC_DANH"
699
+ ]
700
+ ]
701
+ },
702
+ {
703
+ "text": "Kính gửi Bộ Nội vụ! Cơ quan chúng tôi hiện đang thực hiện việc số hóa tài liệu để nộp vào Lưu trữ lịch sử theo quy định. Trong quá trình này, chúng tôi có một thắc mắc cần được Bộ hướng dẫn cụ thể. Một số hồ sơ công việc quan trọng của cơ quan đã được tạo lập và lưu trữ song song cả dưới dạng văn bản giấy (bản gốc) và tệp tin điện tử (bản điện tử) ngay từ thời điểm giải quyết công việc. Bây giờ đến thời hạn nộp vào Lưu trữ lịch sử, theo quy định tại khoản 7 Điều 18 và khoản 1 Điều 4 của Luật Lưu trữ năm 2024, thì chúng tôi cần thu nộp tất cả các loại tài liệu này. Tuy nhiên, chúng tôi muốn được làm rõ: Trong trường hợp hồ sơ đã có bản điện tử đầy đủ, đáp ứng mọi yêu cầu về tính toàn vẹn, xác thực và có thể thay thế cho bản giấy để tra cứu, sử dụng lâu dài, thì chúng tôi có bắt buộc phải nộp cả bản gốc bằng giấy vào Lưu trữ lịch sử hay không? Hay chúng tôi chỉ cần nộp bản điện tử và được phép lưu giữ, hủy bản giấy theo quy định về hủy tài liệu trùng lặp? Rất mong nhận được hướng dẫn của Bộ để cơ quan chúng tôi thực hiện đúng quy định pháp luật.",
704
+ "entities": [
705
+ [
706
+ "Bộ Nội vụ",
707
+ "CO_QUAN_THAM_QUYEN"
708
+ ],
709
+ [
710
+ "Cơ quan chúng tôi",
711
+ "TO_CHUC"
712
+ ]
713
+ ]
714
+ },
715
+ {
716
+ "text": "Tôi là người dân xã B. Ông Nguyễn Văn A là tổ trưởng tổ hòa giải của xã. Trong một vụ việc hòa giải tranh chấp đất đai giữa hai hộ gia đình tại địa phương, ông A đã có lời nói và hành vi thiên vị, không khách quan theo đúng như phản ánh của một bên. Điều này được xác định là vi phạm nguyên tắc hòa giải ở cơ sở. Tôi xin hỏi: Trong tình huống này, việc ông A vi phạm nguyên tắc khi đang tiến hành hòa giải có dẫn đến việc ông ấy phải thôi làm hòa giải viên theo quy định tại Điều 11 Luật Hòa giải ở cơ sở, hay chỉ cần áp dụng Điều 18 để phân công hòa giải viên khác thực hiện vụ việc này và ông A vẫn tiếp tục giữ chức vụ tổ trưởng tổ hòa giải?",
717
+ "entities": [
718
+ [
719
+ "Tôi",
720
+ "NGUOI"
721
+ ],
722
+ [
723
+ "người dân xã B",
724
+ "NHOM_NGUOI"
725
+ ],
726
+ [
727
+ "Ông Nguyễn Văn A",
728
+ "NGUOI"
729
+ ],
730
+ [
731
+ "tổ trưởng tổ hòa giải của xã",
732
+ "CHUC_DANH"
733
+ ],
734
+ [
735
+ "hai hộ gia đình",
736
+ "NHOM_NGUOI"
737
+ ],
738
+ [
739
+ "ông A",
740
+ "NGUOI"
741
+ ],
742
+ [
743
+ "một bên",
744
+ "BEN_THU_BA"
745
+ ],
746
+ [
747
+ "hòa giải viên",
748
+ "CHUC_DANH"
749
+ ]
750
+ ]
751
+ },
752
+ {
753
+ "text": "Tôi là chủ một đại lý dịch vụ viễn thông của Công ty A. Gần đây, Công ty B (một doanh nghiệp viễn thông độc lập) có gửi công văn yêu cầu tôi cung cấp thông tin về cơ sở khách hàng, số thuê bao và tình hình cung cấp dịch vụ tại địa bàn do tôi phụ trách để phục vụ cho việc nghiên cứu thị trường và lập kế hoạch kết nối mạng. Theo quy định tại Điều 14 Luật Viễn thông, tôi có nghĩa vụ cung cấp thông tin theo hợp đồng đại lý với Công ty A. Tuy nhiên, theo quy định về kết nối viễn thông tại Điều 44, doanh nghiệp viễn thông có quyền yêu cầu kết nối. Vậy, với tư cách là một đại lý độc lập, tôi có trách nhiệm phải cung cấp các thông tin nêu trên cho Công ty B hay không? Nếu có, thời hạn cung cấp được áp dụng theo quy định nào: theo Luật Viễn thông, Luật Tiếp cận thông tin hay các văn bản hướng dẫn khác?",
754
+ "entities": [
755
+ [
756
+ "Tôi",
757
+ "NGUOI"
758
+ ],
759
+ [
760
+ "chủ một đại lý dịch vụ viễn thông",
761
+ "CHUC_DANH"
762
+ ],
763
+ [
764
+ "Công ty A",
765
+ "TO_CHUC"
766
+ ],
767
+ [
768
+ "Công ty B",
769
+ "TO_CHUC"
770
+ ],
771
+ [
772
+ "Công ty B ( một doanh nghiệp viễn thông độc lập )",
773
+ "TO_CHUC"
774
+ ],
775
+ [
776
+ "Công ty A",
777
+ "TO_CHUC"
778
+ ],
779
+ [
780
+ "doanh nghiệp viễn thông",
781
+ "BEN_THU_BA"
782
+ ]
783
+ ]
784
+ },
785
+ {
786
+ "text": "Kính gửi Tòa án nhân dân tỉnh. Chúng tôi là một hộ gia đình, có mâu thuẫn đất đai với hàng xóm liền kề. Chúng tôi đã được Hòa giải viên của tổ dân phố tiến hành hòa giải và đã đạt được thỏa thuận, lập văn bản hòa giải thành có chữ ký của hai bên và hòa giải viên. Theo thỏa thuận, bên kia phải trả lại một phần diện tích đất đã lấn chiếm và đền bù thiệt hại cho chúng tôi trong thời hạn 30 ngày kể từ ngày ký văn bản. Tuy nhiên, sau hơn 60 ngày, phía bên kia vẫn không chịu thực hiện bất kỳ nghĩa vụ nào trong thỏa thuận đã ký kết. Xin hỏi: 1. Trong trường hợp này, chúng tôi có quyền khởi kiện vụ án dân sự ra Tòa án để yêu cầu bên kia thực hiện thỏa thuận hòa giải thành hay không? 2. Văn bản hòa giải thành đã lập có giá trị pháp lý như thế nào và có được Tòa án thừa nhận là chứng cứ trong quá trình giải quyết vụ án không? Xin chân thành cảm ơn.",
787
+ "entities": [
788
+ [
789
+ "Tòa án nhân dân tỉnh",
790
+ "CO_QUAN_THAM_QUYEN"
791
+ ],
792
+ [
793
+ "Chúng tôi",
794
+ "NHOM_NGUOI"
795
+ ],
796
+ [
797
+ "hàng xóm liền kề",
798
+ "BEN_THU_BA"
799
+ ],
800
+ [
801
+ "Hòa giải viên của tổ dân phố",
802
+ "BEN_THU_BA"
803
+ ],
804
+ [
805
+ "hòa giải viên",
806
+ "CHUC_DANH"
807
+ ],
808
+ [
809
+ "bên kia",
810
+ "BEN_THU_BA"
811
+ ],
812
+ [
813
+ "Tòa án",
814
+ "CO_QUAN_THAM_QUYEN"
815
+ ],
816
+ [
817
+ "bên kia",
818
+ "BEN_THU_BA"
819
+ ]
820
+ ]
821
+ },
822
+ {
823
+ "text": "Chị A và chị B có mâu thuẫn do lời qua tiếng lại, dẫn đến xô xát khiến chị B bị thương nhẹ. Chị A sau đó đã tự nguyện bồi thường cho chị B số tiền 5 triệu đồng và hai bên không có bất kỳ thỏa thuận hay giấy tờ gì về việc này. Tuy nhiên, một thời gian sau, chị B vẫn cảm thấy bức xúc nên đã đề nghị Tổ hòa giải ở cơ sở tiến hành hòa giải vụ việc này. Xin hỏi: Trong tình huống chị A đã tự bồi thường trước, Tổ hòa giải có thể tiến hành hòa giải vụ việc trên không?",
824
+ "entities": [
825
+ [
826
+ "Chị A",
827
+ "NGUOI"
828
+ ],
829
+ [
830
+ "chị B",
831
+ "NGUOI"
832
+ ],
833
+ [
834
+ "Tổ hòa giải ở cơ sở",
835
+ "BEN_THU_BA"
836
+ ]
837
+ ]
838
+ },
839
+ {
840
+ "text": "Kính gửi Viện kiểm sát nhân dân! Trong đợt niêm yết danh sách cử tri vừa rồi, tôi phát hiện tên tôi bị ghi sai ngày sinh. Tuy nhiên, do công tác xa nên tôi không kịp làm đơn khiếu nại trong thời hạn 10 ngày theo quy định tại Điều 28 Luật Trưng cầu ý dân. Vừa qua, tôi đã trở về và có làm đơn gửi đến cơ quan lập danh sách cử tri nhưng họ từ chối tiếp nhận với lý do đã hết thời hạn khiếu nại. Trong tình huống này, khi tôi đã bỏ lỡ thời hạn khiếu nại về danh sách cử tri, tôi có còn quyền khởi kiện vụ việc này ra Tòa án nhân dân để yêu cầu sửa sai hay không? Rất mong nhận được hướng dẫn từ Quý cơ quan. Xin chân thành cảm ơn!",
841
+ "entities": [
842
+ [
843
+ "Viện kiểm sát nhân dân",
844
+ "CO_QUAN_THAM_QUYEN"
845
+ ],
846
+ [
847
+ "cơ quan lập danh sách cử tri",
848
+ "BEN_THU_BA"
849
+ ],
850
+ [
851
+ "Tòa án nhân dân",
852
+ "CO_QUAN_THAM_QUYEN"
853
+ ]
854
+ ]
855
+ },
856
+ {
857
+ "text": "Kính gửi Tổng Liên đoàn Lao động Việt Nam! Hiện nay, một số liên đoàn lao động tỉnh, thành phố trực thuộc trung ương muốn đề xuất điều chỉnh mức lương tối thiểu vùng để phù hợp với điều kiện kinh tế - xã hội tại địa phương. Trong hệ thống công đoàn Việt Nam, có nhiều cấp công đoàn (cấp trung ương, cấp tỉnh, cấp cơ sở). Căn cứ vào quy định tại Luật Công đoàn 2024, xin hỏi: 1. Liên đoàn lao động cấp tỉnh có thẩm quyền trình dự án luật (như dự án luật sửa đổi quy định về lương tối thiểu) trước Quốc hội hay không, hay chỉ Tổng Liên đoàn Lao động Việt Nam mới có thẩm quyền này? 2. Nếu liên đoàn lao động cấp tỉnh không có thẩm quyền trình trực tiếp, thì cơ chế nào để kiến nghị của cấp tỉnh được chuyển lên Tổng Liên đoàn Lao động Việt Nam để xem xét trình Quốc hội? Xin chân thành cảm ơn!",
858
+ "entities": [
859
+ [
860
+ "Tổng Liên đoàn Lao động Việt Nam",
861
+ "CO_QUAN_THAM_QUYEN"
862
+ ],
863
+ [
864
+ "một số liên đoàn lao động tỉnh, thành phố trực thuộc trung ương",
865
+ "TO_CHUC"
866
+ ],
867
+ [
868
+ "công đoàn Việt Nam",
869
+ "TO_CHUC"
870
+ ],
871
+ [
872
+ "Liên đoàn lao động cấp tỉnh",
873
+ "TO_CHUC"
874
+ ],
875
+ [
876
+ "Tổng Liên đoàn Lao động Việt Nam",
877
+ "TO_CHUC"
878
+ ],
879
+ [
880
+ "liên đoàn lao động cấp tỉnh",
881
+ "TO_CHUC"
882
+ ],
883
+ [
884
+ "Tổng Liên đoàn Lao động Việt Nam",
885
+ "TO_CHUC"
886
+ ]
887
+ ]
888
+ },
889
+ {
890
+ "text": "Kính gửi Ban Cơ yếu Chính phủ, tôi là công dân có nhu cầu tìm hiểu và nghiên cứu về chính sách đầu tư phát triển hạ tầng mật mã quốc gia (theo quy định tại điểm 2 Điều 4 Luật Cơ yếu 2011). Tôi được biết thông tin này có thể được công khai theo quy định của pháp luật về tiếp cận thông tin. Tôi xin hỏi: 1. Khi có nhu cầu tiếp cận thông tin liên quan đến chính sách đầu tư hạ tầng mật mã do Ban Cơ yếu Chính phủ nắm giữ, tôi cần làm thủ tục yêu cầu cung cấp thông tin như thế nào? 2. Việc cung cấp thông tin này có thuộc trường hợp phải trả phí, lệ phí theo quy định tại Điều 12 Luật Tiếp cận thông tin hay không? Tôi kính mong nhận được sự hướng dẫn cụ thể để thực hiện đúng quy định pháp luật.",
891
+ "entities": [
892
+ [
893
+ "Ban Cơ yếu Chính phủ",
894
+ "CO_QUAN_THAM_QUYEN"
895
+ ],
896
+ [
897
+ "tôi",
898
+ "NGUOI"
899
+ ],
900
+ [
901
+ "công dân",
902
+ "CHUC_DANH"
903
+ ],
904
+ [
905
+ "Ban Cơ yếu Chính phủ",
906
+ "TO_CHUC"
907
+ ]
908
+ ]
909
+ },
910
+ {
911
+ "text": "Kính gửi Bộ Công an, Bộ Quốc phòng! Tôi là chủ một doanh nghiệp tư nhân lớn chuyên về công nghệ thông tin, có vận hành hệ thống thông tin nội bộ và các sản phẩm, dịch vụ trực tuyến quan trọng. Trước tình hình mất an toàn thông tin và các cuộc tấn công mạng phức tạp hiện nay, doanh nghiệp tôi có nhu cầu xây dựng một đội ngũ chuyên môn, bài bản để chủ động bảo vệ hệ thống và thông tin của mình. Qua nghiên cứu Luật An ninh mạng, tôi hiểu được việc tuyển chọn, phát triển lực lượng bảo vệ an ninh mạng là rất cần thiết. Tuy nhiên, tôi có một số thắc mắc như sau: Theo Điều 32 của Luật, công dân có đủ tiêu chuẩn có thể được tuyển chọn vào lực lượng bảo vệ an ninh mạng, nhưng không rõ các tổ chức, doanh nghiệp thuộc khu vực tư nhân như công ty tôi có được tự mình thành lập và tổ chức một lực lượng bảo vệ an ninh mạng riêng để bảo vệ hệ thống thông tin của mình không? Nếu được, lực lượng này có cần đăng ký, thông báo với cơ quan chức năng nào (ví dụ: Bộ Công an, Bộ Quốc phòng) hay không? Và liệu họ có thể phối hợp, cung cấp hỗ trợ kỹ thuật cho lực lượng chuyên trách của Bộ Công an trong các vấn đề an ninh mạng theo quy định tại khoản 2c Điều 17 hay không? Xin cảm ơn.",
912
+ "entities": [
913
+ [
914
+ "Bộ Công an, Bộ Quốc phòng",
915
+ "CO_QUAN_THAM_QUYEN"
916
+ ],
917
+ [
918
+ "Tôi",
919
+ "NGUOI"
920
+ ],
921
+ [
922
+ "chủ một doanh nghiệp tư nhân lớn chuyên về công nghệ thông tin",
923
+ "CHUC_DANH"
924
+ ],
925
+ [
926
+ "doanh nghiệp tôi",
927
+ "TO_CHUC"
928
+ ],
929
+ [
930
+ "một đội ngũ chuyên môn, bài bản",
931
+ "NHOM_NGUOI"
932
+ ],
933
+ [
934
+ "công dân có đủ tiêu chuẩn",
935
+ "NHOM_NGUOI"
936
+ ],
937
+ [
938
+ "lực lượng bảo vệ an ninh mạng",
939
+ "CHUC_DANH"
940
+ ],
941
+ [
942
+ "các tổ chức, doanh nghiệp thuộc khu vực tư nhân",
943
+ "TO_CHUC"
944
+ ],
945
+ [
946
+ "Bộ Công an",
947
+ "CO_QUAN_THAM_QUYEN"
948
+ ],
949
+ [
950
+ "Bộ Quốc phòng",
951
+ "CO_QUAN_THAM_QUYEN"
952
+ ],
953
+ [
954
+ "lực lượng chuyên trách của Bộ Công an",
955
+ "BEN_THU_BA"
956
+ ]
957
+ ]
958
+ },
959
+ {
960
+ "text": "Kính gửi Tòa án nhân dân tối cao! Trường THPT A có một học sinh 16 tuổi (Nguyễn Văn B) thường xuyên vi phạm nội quy, có hành vi bạo lực học đường và có dấu hiệu liên quan đến tệ nạn xã hội bên ngoài nhà trường. Nhà trường đã nhiều lần nhắc nhở, kỷ luật nhưng học sinh này vẫn tái phạm. Căn cứ vào Luật Tư pháp người chưa thành niên, nhà trường đề nghị cơ quan có thẩm quyền xem xét áp dụng biện pháp \"hạn chế khung giờ đi lại\" (theo Điều 45) đối với học sinh này để hạn chế em ra ngoài vào ban đêm, từ đó giúp quản lý và giáo dục hiệu quả hơn. Xin hỏi: Trong trường hợp này, với tư cách là tổ chức nơi người chưa thành niên học tập, nhà trường có quyền đề nghị áp dụng biện pháp \"hạn chế khung giờ đi lại\" không? Nếu có, thủ tục đề nghị như thế nào? Trân trọng cảm ơn!",
961
+ "entities": [
962
+ [
963
+ "Tòa án nhân dân tối cao",
964
+ "CO_QUAN_THAM_QUYEN"
965
+ ],
966
+ [
967
+ "Trường THPT A",
968
+ "TO_CHUC"
969
+ ],
970
+ [
971
+ "Nguyễn Văn B",
972
+ "NGUOI"
973
+ ],
974
+ [
975
+ "Nhà trường",
976
+ "TO_CHUC"
977
+ ],
978
+ [
979
+ "nhà trường",
980
+ "TO_CHUC"
981
+ ],
982
+ [
983
+ "cơ quan có thẩm quyền",
984
+ "CO_QUAN_THAM_QUYEN"
985
+ ],
986
+ [
987
+ "tổ chức nơi ng��ời chưa thành niên học tập",
988
+ "TO_CHUC"
989
+ ],
990
+ [
991
+ "nhà trường",
992
+ "TO_CHUC"
993
+ ]
994
+ ]
995
+ },
996
+ {
997
+ "text": "Kính gửi Bộ Công Thương và Bộ Xây dựng! Công ty chúng tôi là doanh nghiệp sản xuất hóa chất đã được cấp Giấy phép sản xuất, kinh doanh hóa chất thuộc danh mục hạn chế. Do mở rộng sản xuất, Công ty nhận góp vốn từ một cá nhân bằng một ngôi nhà ở riêng lẻ (biệt thự) nằm trong khu dân cư. Ngôi nhà này chúng tôi dự định sử dụng làm kho chứa nguyên liệu hóa chất nguy hiểm (có trong danh mục hạn chế) phục vụ sản xuất. Chúng tôi xin hỏi: Với tư cách là đơn vị đã có giấy phép sản xuất, kinh doanh hóa chất hạn chế, việc chúng tôi sử dụng nhà ở đã được góp vốn hợp pháp (theo Luật Nhà ở) để làm kho cất giữ hóa chất nguy hiểm có được phép không? Nếu được, chúng tôi có phải đáp ứng các điều kiện về khoảng cách an toàn, cảnh báo và trang thiết bị ứng cứu theo Luật Hóa chất ngay tại địa điểm là nhà ở đó không, hay chỉ cần đáp ứng tại cơ sở sản xuất chính? Xin cảm ơn!",
998
+ "entities": [
999
+ [
1000
+ "Bộ Công Thương",
1001
+ "CO_QUAN_THAM_QUYEN"
1002
+ ],
1003
+ [
1004
+ "Bộ Công Thương và Bộ Xây dựng",
1005
+ "CO_QUAN_THAM_QUYEN"
1006
+ ],
1007
+ [
1008
+ "Bộ Xây dựng",
1009
+ "CO_QUAN_THAM_QUYEN"
1010
+ ],
1011
+ [
1012
+ "Công ty chúng tôi",
1013
+ "TO_CHUC"
1014
+ ],
1015
+ [
1016
+ "doanh nghiệp sản xuất hóa chất",
1017
+ "CHUC_DANH"
1018
+ ],
1019
+ [
1020
+ "một cá nhân",
1021
+ "NGUOI"
1022
+ ]
1023
+ ]
1024
+ },
1025
+ {
1026
+ "text": "Kính gửi Hội Bảo vệ quyền lợi người tiêu dùng tỉnh! Tôi là một người tiêu dùng. Gần đây, tôi đã mua một chiếc điện thoại di động thông qua trang web thương mại điện tử (giao dịch từ xa). Sau khi nhận hàng, tôi phát hiện ra rằng thông số kỹ thuật về dung lượng pin trên website bán hàng khác so với thực tế sản phẩm (thông tin không chính xác). Tôi đã sử dụng quyền của mình theo khoản 3 Điều 38 Luật Bảo vệ quyền lợi người tiêu dùng để đơn phương chấm dứt hợp đồng và yêu cầu hoàn tiền. Tuy nhiên, trong quá trình sử dụng ngắn trước khi trả hàng, tôi phát hiện thêm một lỗi phần cứng (khuyết tật) không liên quan đến thông tin sai về pin. Xin hỏi Hội: 1. Trong trường hợp này, ngoài việc được hoàn tiền theo quy định về giao dịch từ xa, tôi có quyền yêu cầu doanh nghiệp bán hàng bồi thường thiệt hại do hàng hóa có khuyết tật gây ra hay không? 2. Nếu có, tôi cần thực hiện thủ tục khiếu nại, yêu cầu bồi thường như thế nào, có cần phải thông qua Hội Bảo vệ quyền lợi người tiêu dùng hay không? Tôi xin chân thành cảm ơn.",
1027
+ "entities": [
1028
+ [
1029
+ "Hội Bảo vệ quyền lợi người tiêu dùng tỉnh",
1030
+ "CO_QUAN_THAM_QUYEN"
1031
+ ],
1032
+ [
1033
+ "Tôi",
1034
+ "NGUOI"
1035
+ ],
1036
+ [
1037
+ "một người tiêu dùng",
1038
+ "CHUC_DANH"
1039
+ ],
1040
+ [
1041
+ "website bán hàng",
1042
+ "BEN_THU_BA"
1043
+ ],
1044
+ [
1045
+ "doanh nghiệp bán hàng",
1046
+ "TO_CHUC"
1047
+ ],
1048
+ [
1049
+ "Hội Bảo vệ quyền lợi người tiêu dùng",
1050
+ "TO_CHUC"
1051
+ ]
1052
+ ]
1053
+ },
1054
+ {
1055
+ "text": "Kính gửi Tòa án nhân dân tối cao! Tôi có tình huống sau cần được giải đáp: - Ông A tặng cho ông B một chiếc máy cày đã qua sử dụng. Khi tặng, ông A biết máy có khuyết tật (hỏng hệ thống phanh) nhưng không thông báo cho ông B. - Sau khi nhận máy, ông B thuê anh C (thợ sửa máy nông nghiệp) đến sửa chữa. Trong quá trình sửa chữa, do sơ suất, anh C làm hỏng thêm động cơ máy, gây thiệt hại 50 triệu đồng. Xin hỏi: Trong trường hợp này, ông A (người tặng cho), ông B (chủ sở hữu máy) hay anh C (người làm công) có nghĩa vụ bồi thường thiệt hại 50 triệu đồng? Nếu nhiều người cùng phải bồi thường, trách nhiệm được phân chia thế nào?",
1056
+ "entities": [
1057
+ [
1058
+ "Tòa án nhân dân tối cao",
1059
+ "CO_QUAN_THAM_QUYEN"
1060
+ ],
1061
+ [
1062
+ "Tôi",
1063
+ "NGUOI"
1064
+ ],
1065
+ [
1066
+ "Ông A tặng",
1067
+ "NGUOI"
1068
+ ],
1069
+ [
1070
+ "ông B",
1071
+ "NGUOI"
1072
+ ],
1073
+ [
1074
+ "anh C",
1075
+ "NGUOI"
1076
+ ],
1077
+ [
1078
+ "anh C ( thợ sửa máy nông nghiệp )",
1079
+ "NGUOI"
1080
+ ],
1081
+ [
1082
+ "thợ sửa máy nông nghiệp",
1083
+ "CHUC_DANH"
1084
+ ],
1085
+ [
1086
+ "anh C",
1087
+ "NGUOI"
1088
+ ],
1089
+ [
1090
+ "ông A",
1091
+ "NGUOI"
1092
+ ],
1093
+ [
1094
+ "ông B",
1095
+ "NGUOI"
1096
+ ],
1097
+ [
1098
+ "chủ sở hữu máy",
1099
+ "CHUC_DANH"
1100
+ ],
1101
+ [
1102
+ "anh C",
1103
+ "NGUOI"
1104
+ ],
1105
+ [
1106
+ "anh C ( người làm công )",
1107
+ "NGUOI"
1108
+ ],
1109
+ [
1110
+ "người làm công",
1111
+ "CHUC_DANH"
1112
+ ]
1113
+ ]
1114
+ },
1115
+ {
1116
+ "text": "Kính gửi Tòa án nhân dân tối cao! Công ty chúng tôi là một doanh nghiệp có vốn đầu tư nước ngoài tại Việt Nam, có tranh chấp hợp đồng với một đối tác nước ngoài. Các bên đã thỏa thuận giải quyết tranh chấp bằng Trọng tài vụ việc tại Việt Nam và chọn tiếng Anh làm ngôn ngữ tố tụng theo quy định tại Điều 10 Luật Trọng tài thương mại. Hội đồng trọng tài đã ra phán quyết hoàn toàn bằng tiếng Anh. Xin hỏi: Khi chúng tôi nộp đơn yêu cầu đăng ký phán quyết này tại Tòa án theo Điều 62 Luật Trọng tài thương mại, Tòa án có chấp nhận hồ sơ chỉ bao gồm bản phán quyết bằng tiếng Anh (không kèm bản dịch tiếng Việt công chứng) hay không? Nếu cần bản dịch, văn bản pháp luật nào quy định cụ thể về yêu cầu này? Chúng tôi xin chân thành cảm ơn!",
1117
+ "entities": [
1118
+ [
1119
+ "Tòa án nhân dân tối cao",
1120
+ "CO_QUAN_THAM_QUYEN"
1121
+ ],
1122
+ [
1123
+ "Công ty chúng tôi",
1124
+ "TO_CHUC"
1125
+ ],
1126
+ [
1127
+ "một đối tác nước ngoài",
1128
+ "BEN_THU_BA"
1129
+ ],
1130
+ [
1131
+ "Hội đồng trọng tài",
1132
+ "BEN_THU_BA"
1133
+ ],
1134
+ [
1135
+ "Tòa án",
1136
+ "CO_QUAN_THAM_QUYEN"
1137
+ ]
1138
+ ]
1139
+ },
1140
+ {
1141
+ "text": "Kính gửi Bộ Công an! Tôi đang tư vấn cho một trường hợp: Ông A (70 tuổi, có nơi thường trú tại tỉnh Hải Dương) là người giám hộ cho cháu B (15 tuổi, bố mẹ đã mất). Hai người đang sống cùng nhau tại Hà Nội. Nay ông A qua đời. Cháu B muốn tiếp tục sinh sống, học tập tại Hà Nội và cần đăng ký tạm trú, thường trú tại đây. Theo quy định tại Điều 13 Luật Cư trú, nơi cư trú của người được giám hộ là nơi cư trú của người giám hộ hoặc có thể khác nếu được người giám hộ đồng ý. Tuy nhiên, trong trường hợp người giám hộ (ông A) đã chết, cháu B chưa có người giám hộ mới. Vậy: 1. Hiện nay, nơi cư trú của cháu B được xác định như thế nào? 2. Trên cơ sở đó, cháu B có thể làm thủ tục đăng ký tạm trú, thường trú tại Hà Nội không, hay phải trở về nơi thường trú trước đây của ông A (tỉnh Hải Dương)? Rất mong nhận được hướng dẫn cụ thể của Bộ.",
1142
+ "entities": [
1143
+ [
1144
+ "Bộ Công an",
1145
+ "CO_QUAN_THAM_QUYEN"
1146
+ ],
1147
+ [
1148
+ "Tôi",
1149
+ "NGUOI"
1150
+ ],
1151
+ [
1152
+ "Ông A",
1153
+ "NGUOI"
1154
+ ],
1155
+ [
1156
+ "người giám hộ",
1157
+ "CHUC_DANH"
1158
+ ],
1159
+ [
1160
+ "cháu B",
1161
+ "NGUOI"
1162
+ ],
1163
+ [
1164
+ "cháu B ( 15 tuổi, bố mẹ đã mất )",
1165
+ "NGUOI"
1166
+ ],
1167
+ [
1168
+ "người được giám hộ",
1169
+ "NGUOI"
1170
+ ],
1171
+ [
1172
+ "người giám hộ",
1173
+ "NGUOI"
1174
+ ],
1175
+ [
1176
+ "ông A",
1177
+ "NGUOI"
1178
+ ]
1179
+ ]
1180
+ },
1181
+ {
1182
+ "text": "Kính gửi Ban Cơ yếu Chính phủ, tôi là nhân viên làm công tác cơ yếu (không thuộc lực lượng quân đội, công an) đã đóng bảo hiểm xã hủ bắt buộc liên tục. Trong quá trình công tác, do sức khỏe giảm sút, tôi không còn đáp ứng đủ tiêu chuẩn về sức khỏe như quy định tại điểm c khoản 1 Điều 26 Luật Cơ yếu. Tôi đã công tác trong tổ chức cơ yếu được 22 năm (đủ 20 năm theo quy định cho nữ), trong đó có 10 năm trực tiếp làm công tác cơ yếu. Cơ quan hiện không còn nhu cầu bố trí công việc phù hợp cho tôi trong tổ chức cơ yếu. Xin hỏi: Trường hợp của tôi (không đáp ứng tiêu chuẩn do sức khỏe) có được xem xét cho nghỉ hưu trước tuổi theo quy định tại khoản 2 Điều 27 Luật Cơ yếu hay không? Nếu được, thủ tục thực hiện như thế nào? Trân trọng cảm ơn!",
1183
+ "entities": [
1184
+ [
1185
+ "Ban Cơ yếu Chính phủ",
1186
+ "CO_QUAN_THAM_QUYEN"
1187
+ ],
1188
+ [
1189
+ "tôi",
1190
+ "NGUOI"
1191
+ ],
1192
+ [
1193
+ "nhân viên làm công tác cơ yếu",
1194
+ "CHUC_DANH"
1195
+ ],
1196
+ [
1197
+ "tổ chức cơ yếu",
1198
+ "TO_CHUC"
1199
+ ],
1200
+ [
1201
+ "tổ chức cơ yếu",
1202
+ "TO_CHUC"
1203
+ ]
1204
+ ]
1205
+ },
1206
+ {
1207
+ "text": "Kính gửi Thường trực Hội đồng nhân dân tỉnh X, Đoàn giám sát chuyên đề của Hội đồng nhân dân tỉnh chúng tôi vừa tiến hành giám sát việc thực hiện một dự án đầu tư công trên địa bàn và đã có báo cáo kết quả giám sát gửi đến Thường trực Hội đồng nhân dân. Trong quá trình xem xét báo cáo tại phiên họp, Đoàn giám sát đã đưa ra một kết luận và kiến nghị nhất định. Tuy nhiên, khi Thường trực Hội đồng nhân dân thảo luận, có ý kiến khác với kết luận của Đoàn giám sát về cùng một vấn đề. Chúng tôi xin hỏi: 1. Trong tình huống này, trách nhiệm và thẩm quyền quyết định cuối cùng về nội dung kết luận, kiến nghị thuộc về Đoàn giám sát hay Thường trực Hội đồng nhân dân? 2. Trình tự, thủ tục để giải quyết sự khác biệt này được quy định cụ thể như thế nào để đảm bảo tính khách quan và hiệu lực của hoạt động giám sát? 3. Nếu Thường trực Hội đồng nhân dân có ý kiến khác, Đoàn giám sát có trách nhiệm phải điều chỉnh báo cáo của mình theo ý kiến đó hay không? Hay có cơ chế nào khác để trình bày và bảo vệ quan điểm của Đoàn giám sát? Kính mong Quý cơ quan giải đáp để công tác giám sát được thực hiện đúng quy định. Trân trọng cảm ơn!",
1208
+ "entities": [
1209
+ [
1210
+ "Thường trực Hội đồng nhân dân tỉnh X",
1211
+ "CO_QUAN_THAM_QUYEN"
1212
+ ],
1213
+ [
1214
+ "Đoàn giám sát chuyên đề của Hội đồng nhân dân tỉnh chúng tôi",
1215
+ "NHOM_NGUOI"
1216
+ ],
1217
+ [
1218
+ "Đoàn giám sát",
1219
+ "TO_CHUC"
1220
+ ],
1221
+ [
1222
+ "Đoàn giám sát",
1223
+ "TO_CHUC"
1224
+ ],
1225
+ [
1226
+ "Thường trực Hội đồng nhân dân",
1227
+ "TO_CHUC"
1228
+ ],
1229
+ [
1230
+ "Đoàn giám sát",
1231
+ "TO_CHUC"
1232
+ ]
1233
+ ]
1234
+ },
1235
+ {
1236
+ "text": "Kính gửi Bộ Xây dựng, Công ty chúng tôi đang chuẩn bị đầu tư Dự án khu đô thị mới tại tỉnh Đồng Nai. Dự án có quy mô khoảng 20 ha, bao gồm các hạng mục: khu nhà ở liền kề, chung cư cao tầng, trung tâm thương mại, trường học, công viên và bệnh viện. Trong quá trình lập và trình duyệt hồ sơ, chúng tôi có vướng mắc về cơ sở pháp lý như sau: Theo quy định tại Điều 17 Luật Nhà ở (đã được sửa đổi bởi Luật Xây dựng số 62/2020/QH14), dự án đầu tư xây dựng khu đô thị (điểm b khoản 1) và dự án sử dụng đất hỗn hợp, công trình sử dụng hỗn hợp (điểm c, d khoản 2) đều được xác định là dự án đầu tư xây dựng nhà ở. Xin hỏi: Đối với dự án hỗn hợp (có cả nhà ở và các công trình phi nhà ở như bệnh viện, trường học, thương mại) như của chúng tôi, việc đầu tư xây dựng có nhất thiết chỉ phải tuân thủ các quy định của Luật Nhà ở và pháp luật có liên quan (theo khoản 3) hay không? Hay chúng tôi còn phải đáp ứng đầy đủ các quy định về đầu tư xây dựng công trình theo Luật Xây dựng và các quy chuẩn, tiêu chuẩn kỹ thuật chuyên ngành đối với từng loại công trình cụ thể (ví dụ: quy chuẩn về bệnh viện, trường học)? Trân trọng cảm ơn!",
1237
+ "entities": [
1238
+ [
1239
+ "Bộ Xây dựng",
1240
+ "CO_QUAN_THAM_QUYEN"
1241
+ ],
1242
+ [
1243
+ "Công ty chúng tôi",
1244
+ "TO_CHUC"
1245
+ ],
1246
+ [
1247
+ "chúng tôi",
1248
+ "TO_CHUC"
1249
+ ],
1250
+ [
1251
+ "chúng tôi",
1252
+ "TO_CHUC"
1253
+ ]
1254
+ ]
1255
+ },
1256
+ {
1257
+ "text": "Kính gửi Bộ Tài nguyên và Môi trường! Tôi là đại diện của cộng đồng dân cư sinh sống gần một nhà máy sản xuất giấy mới được xây dựng. Chúng tôi rất lo ngại về các tác động môi trường tiềm ẩn từ hoạt động của nhà máy. Để giám sát và có ý kiến, chúng tôi có quyền được biết thông tin về môi trường theo Luật Bảo vệ môi trường. Vậy, xin hỏi: 1. Khi chúng tôi yêu cầu chủ dự án nhà máy cung cấp thông tin về bảo vệ môi trường, những loại thông tin cụ thể nào chúng tôi có quyền được tiếp cận? 2. Một phần nội dung trong Báo cáo đánh giá tác động môi trường (ĐTM) của dự án đề cập đến công nghệ xử lý nước thải được mô tả là \"công nghệ độc quyền\". Chủ dự án có thể từ chối công bố phần nội dung này với lý do \"bí mật kinh doanh\" theo quy định tại điểm c khoản 1 Điều 114 Luật Bảo vệ môi trường được không? Việc từ chối này có làm mất đi quyền được biết về hiệu quả xử lý môi trường của chúng tôi không? Kính mong Bộ sớm có văn b��n hướng dẫn hoặc giải đáp cụ thể để người dân chúng tôi có thể thực hiện đúng quyền và nghĩa vụ của mình trong việc tham gia bảo vệ môi trường.",
1258
+ "entities": [
1259
+ [
1260
+ "Bộ Tài nguyên và Môi trường",
1261
+ "CO_QUAN_THAM_QUYEN"
1262
+ ],
1263
+ [
1264
+ "Tôi",
1265
+ "NGUOI"
1266
+ ],
1267
+ [
1268
+ "đại diện của cộng đồng dân cư",
1269
+ "CHUC_DANH"
1270
+ ],
1271
+ [
1272
+ "cộng đồng dân cư",
1273
+ "NHOM_NGUOI"
1274
+ ],
1275
+ [
1276
+ "một nhà máy sản xuất giấy",
1277
+ "TO_CHUC"
1278
+ ],
1279
+ [
1280
+ "chủ dự án nhà máy",
1281
+ "TO_CHUC"
1282
+ ],
1283
+ [
1284
+ "Chủ dự án",
1285
+ "BEN_THU_BA"
1286
+ ],
1287
+ [
1288
+ "chúng tôi",
1289
+ "NHOM_NGUOI"
1290
+ ],
1291
+ [
1292
+ "người dân chúng tôi",
1293
+ "NHOM_NGUOI"
1294
+ ]
1295
+ ]
1296
+ },
1297
+ {
1298
+ "text": "Kính gửi Bộ Tài chính! Tôi đã hoàn thành chương trình đào tạo và được cấp Thẻ thẩm định viên về giá vào tháng 6/2025. Hiện tôi đang làm việc chính thức tại một doanh nghiệp thẩm định giá kể từ sau khi nhận thẻ. Theo tôi tìm hiểu tại Điều 45 Luật Giá, điều kiện đăng ký hành nghề thẩm định giá yêu cầu tổng thời gian thực tế làm việc tại doanh nghiệp thẩm định giá phải từ đủ 36 tháng. Đến thời điểm hiện tại (tháng 11/2025), tôi mới tích lũy được khoảng 5 tháng làm việc tại đây. Vậy xin hỏi Bộ Tài chính: Với trường hợp của tôi, đã có thẻ nhưng chưa đủ thời gian làm việc thực tế theo quy định, tôi có thể tiến hành đăng ký hành nghề thẩm định giá được không? Hay tôi bắt buộc phải chờ đủ 36 tháng thực tế làm việc mới được đăng ký? Rất mong nhận được hướng dẫn của Bộ Tài chính. Xin trân trọng cảm ơn!",
1299
+ "entities": [
1300
+ [
1301
+ "Bộ Tài chính",
1302
+ "CO_QUAN_THAM_QUYEN"
1303
+ ],
1304
+ [
1305
+ "một doanh nghiệp thẩm định giá",
1306
+ "TO_CHUC"
1307
+ ],
1308
+ [
1309
+ "doanh nghiệp thẩm định giá",
1310
+ "TO_CHUC"
1311
+ ]
1312
+ ]
1313
+ },
1314
+ {
1315
+ "text": "Kính gửi Công an thành phố Hà Nội. Tôi tham gia giao thông bằng xe máy trong nội thành. Hôm qua, khi đang di chuyển trên đường, tôi nhận cuộc gọi điện thoại di động khẩn cấp từ gia đình, nên đã tấp vào lề đường để nghe điện thoại (không dùng ô, không buông tay lái khi đang chạy). Ngay lúc đó, một cảnh sát giao thông yêu cầu tôi dừng xe để kiểm tra giấy tờ, mặc dù không có biển báo dừng xe hoặc tín hiệu tuần tra đặc biệt. Xin hỏi: 1. Cảnh sát giao thông có được quyền dừng xe máy để kiểm tra giấy tờ tùy ý mà không có biển báo hoặc tín hiệu cụ thể, chỉ dựa trên nhiệm vụ tuần tra theo Luật Giao thông đường bộ không? 2. Trong trường hợp tôi dừng xe để nghe điện thoại khẩn cấp (đã tấp vào lề đường an toàn, tắt máy, và không sử dụng điện thoại khi đang điều khiển xe), tôi có bị xử phạt vì hành vi này theo quy định tại điểm d khoản 3 Điều 28 Luật Giao thông đường bộ không? Tôi xin chân thành cảm ơn.",
1316
+ "entities": [
1317
+ [
1318
+ "Công an thành phố Hà Nội",
1319
+ "CO_QUAN_THAM_QUYEN"
1320
+ ],
1321
+ [
1322
+ "Tôi",
1323
+ "NGUOI"
1324
+ ],
1325
+ [
1326
+ "gia đình",
1327
+ "BEN_THU_BA"
1328
+ ],
1329
+ [
1330
+ "một cảnh sát giao thông",
1331
+ "BEN_THU_BA"
1332
+ ],
1333
+ [
1334
+ "Cảnh sát giao thông",
1335
+ "NHOM_NGUOI"
1336
+ ]
1337
+ ]
1338
+ },
1339
+ {
1340
+ "text": "Kính gửi Bộ Thông tin và Truyền thông! Công ty chúng tôi là doanh nghiệp cung cấp dịch vụ viễn thông. Chúng tôi đang muốn triển khai hình thức giao kết hợp đồng cung cấp và sử dụng mã số (ví dụ: số điện thoại cố định, đầu số 1800, 1900) với khách hàng doanh nghiệp thông qua phương thức điện tử, sử dụng chữ ký số. Chúng tôi có căn cứ vào quy định tại Điều 9 Luật Giao dịch điện tử về giá trị pháp lý của thông điệp dữ liệu. Tuy nhiên, việc phân bổ, cấp mã số viễn thông được quản lý chặt chẽ theo quy định của Luật Viễn thông. Xin hỏi: Trong trường hợp này, hợp đồng dịch vụ giữa công ty chúng tôi và khách hàng về việc cung cấp, sử dụng mã số viễn thông được ký kết bằng hình thức điện tử (thông điệp dữ liệu có chữ ký số) có được coi là hợp lệ, đáp ứng yêu cầu về hình thức văn bản theo quy định của pháp luật về viễn thông hay không?",
1341
+ "entities": [
1342
+ [
1343
+ "Bộ Thông tin và Truyền thông",
1344
+ "CO_QUAN_THAM_QUYEN"
1345
+ ],
1346
+ [
1347
+ "Công ty chúng tôi",
1348
+ "TO_CHUC"
1349
+ ],
1350
+ [
1351
+ "doanh nghiệp cung cấp dịch vụ viễn thông",
1352
+ "CHUC_DANH"
1353
+ ],
1354
+ [
1355
+ "Chúng tôi",
1356
+ "TO_CHUC"
1357
+ ],
1358
+ [
1359
+ "khách hàng doanh nghiệp",
1360
+ "BEN_THU_BA"
1361
+ ],
1362
+ [
1363
+ "công ty chúng tôi",
1364
+ "TO_CHUC"
1365
+ ],
1366
+ [
1367
+ "khách hàng",
1368
+ "BEN_THU_BA"
1369
+ ]
1370
+ ]
1371
+ },
1372
+ {
1373
+ "text": "Kính gửi Bộ Nội vụ và Bộ Tư pháp! Tôi là một công dân. Trong quá trình nghiên cứu, tôi phát hiện một cơ quan nhà nước địa phương có dấu hiệu vi phạm pháp luật về lưu trữ: không thực hiện việc bảo quản, phân loại theo quy định, dẫn đến một số tài liệu lưu trữ của Phông lưu trữ Nhà nước (thuộc diện phải được bảo vệ theo Luật Lưu trữ 2024) bị hư hỏng, thất lạc. Tôi đã gửi thông tin này cho một cơ quan báo chí. Cơ quan báo chí tiếp nhận thông tin tố cáo của tôi và đồng ý chuyển tố cáo đến cơ quan có thẩm quyền để giải quyết. Căn cứ vào Điều 6, Điều 9, Điều 10 Luật Lưu trữ 2024, tài liệu này thuộc Phông lưu trữ Nhà nước, và Bộ Nội vụ là cơ quan quản lý nhà nước về lưu trữ. Tuy nhiên, theo Điều 14 và Điều 26 Luật Tố cáo 2018, việc giải quyết tố cáo hành vi vi phạm pháp luật trong việc thực hiện nhiệm vụ, công vụ lại thuộc thẩm quyền của người đứng đầu cơ quan quản lý trực tiếp người bị tố cáo, hoặc cơ quan thanh tra, kiểm tra theo ngành dọc. Vụ việc này xảy ra tại một cơ quan nhà nước ở địa phương. Xin được hỏi: Trong trường hợp này, cơ quan báo chí nên chuyển tố cáo của tôi đến đâu là đúng thẩm quyền và trình tự theo quy định của pháp luật? Cụ thể là chuyển đến: 1. Bộ Nội vụ (vì là cơ quan quản lý nhà nước về lưu trữ theo Luật Lưu trữ)? 2. Chánh án Tòa án nhân dân hoặc Viện trưởng Viện kiểm sát nhân dân cấp có thẩm quyền (nếu liên quan đến công chức Tòa án, Kiểm sát theo Điều 14 Luật Tố cáo)? 3. Người đứng đầu cơ quan nhà nước nơi phát sinh hành vi vi phạm, hoặc cơ quan thanh tra cấp trên trực tiếp của cơ quan đó? 4. Thanh tra Bộ Nội vụ hoặc Thanh tra Chính phủ? Tôi rất mong nhận được hướng dẫn cụ thể để cơ quan báo chí có căn cứ thực hiện việc chuyển tố cáo đúng quy định, bảo đảm vụ việc được giải quyết kịp thời và hiệu quả. Trân trọng cảm ơn!",
1374
+ "entities": [
1375
+ [
1376
+ "Bộ Nội vụ và Bộ Tư pháp",
1377
+ "CO_QUAN_THAM_QUYEN"
1378
+ ],
1379
+ [
1380
+ "Tôi",
1381
+ "NGUOI"
1382
+ ],
1383
+ [
1384
+ "công dân",
1385
+ "CHUC_DANH"
1386
+ ],
1387
+ [
1388
+ "một cơ quan nhà nước địa phương",
1389
+ "TO_CHUC"
1390
+ ],
1391
+ [
1392
+ "Phông lưu trữ Nhà nước",
1393
+ "TO_CHUC"
1394
+ ],
1395
+ [
1396
+ "một cơ quan báo chí",
1397
+ "BEN_THU_BA"
1398
+ ],
1399
+ [
1400
+ "Phông lưu trữ Nhà nước",
1401
+ "CO_QUAN_THAM_QUYEN"
1402
+ ],
1403
+ [
1404
+ "Bộ Nội vụ",
1405
+ "CO_QUAN_THAM_QUYEN"
1406
+ ],
1407
+ [
1408
+ "người đứng đầu cơ quan quản lý trực tiếp người bị tố cáo",
1409
+ "BEN_THU_BA"
1410
+ ],
1411
+ [
1412
+ "cơ quan thanh tra, kiểm tra theo ngành dọc",
1413
+ "CO_QUAN_THAM_QUYEN"
1414
+ ],
1415
+ [
1416
+ "một cơ quan nhà nước ở địa phương",
1417
+ "CO_QUAN_THAM_QUYEN"
1418
+ ],
1419
+ [
1420
+ "cơ quan báo chí",
1421
+ "CO_QUAN_THAM_QUYEN"
1422
+ ],
1423
+ [
1424
+ "Bộ Nội vụ",
1425
+ "CO_QUAN_THAM_QUYEN"
1426
+ ],
1427
+ [
1428
+ "Chánh án Tòa án nhân dân",
1429
+ "CHUC_DANH"
1430
+ ],
1431
+ [
1432
+ "cơ quan thanh tra cấp trên trực tiếp của cơ quan đó",
1433
+ "CO_QUAN_THAM_QUYEN"
1434
+ ],
1435
+ [
1436
+ "Thanh tra Chính phủ",
1437
+ "CO_QUAN_THAM_QUYEN"
1438
+ ]
1439
+ ]
1440
+ },
1441
+ {
1442
+ "text": "Kính gửi Cục Cảnh sát Giao thông, Tôi được giao phụ trách an ninh giao thông cho một sự kiện thể thao đường phố (cuộc đua xe đạp không chuyên nghiên cứu trường) sẽ diễn ra trên một đoạn đường liên xã được phép tạm thời đóng đường. Trong số các phương tiện tham gia cổ vũ và phục vụ sự kiện, có một số xe gắn máy do ban tổ chức mượn từ các cá nhân để chở dụng cụ, nhưng những xe này chưa rõ nguồn gốc xuất xứ (không có giấy tờ mua bán), chưa đăng ký và không có biển số. Việc sử dụng những phương tiện này chỉ diễn ra trong phạm vi khu vực đường tạm thời bị cấm các phương tiện khác và dưới sự giám sát của lực lượng chức năng. Xin hỏi: 1. Việc cho phép những phương tiện chưa đăng ký, không rõ nguồn gốc tham gia hoạt động phục vụ sự kiện trên đường bộ (dù đã được phân luồng, cấm đường) có vi phạm quy định tại Điều 54 Luật Giao thông đường bộ về điều kiện cấp đăng ký, biển số hay không? 2. Trong trường hợp được phép sử dụng, nếu xảy ra tai nạn giao thông liên quan đến những phương tiện này (ví dụ: va chạm với người tham gia cổ vũ hoặc hỏng hóc gây ùn tắc), trách nhiệm pháp lý sẽ thuộc về chủ sở hữu xe, người điều khiển hay ban tổ chức sự kiện đã cho phép và sử dụng xe? 3. Nếu vi phạm, cơ quan nào (Cảnh sát giao thông, chính quyền địa phương đã cấp phép sự kiện, hay cơ quan quản lý đường bộ) có thẩm quyền xử lý và hình thức xử lý có thể là gì? Rất mong nhận được hướng dẫn cụ thể để công tác tổ chức đảm bảo an toàn và tuân thủ pháp luật. Xin chân thành cảm ơn!",
1443
+ "entities": [
1444
+ [
1445
+ "Cục Cảnh sát Giao thông",
1446
+ "CO_QUAN_THAM_QUYEN"
1447
+ ],
1448
+ [
1449
+ "Tôi",
1450
+ "NGUOI"
1451
+ ],
1452
+ [
1453
+ "phụ trách an ninh giao thông",
1454
+ "CHUC_DANH"
1455
+ ],
1456
+ [
1457
+ "ban tổ chức",
1458
+ "TO_CHUC"
1459
+ ],
1460
+ [
1461
+ "các cá nhân",
1462
+ "NHOM_NGUOI"
1463
+ ],
1464
+ [
1465
+ "lực lượng chức năng",
1466
+ "BEN_THU_BA"
1467
+ ],
1468
+ [
1469
+ "người tham gia cổ vũ",
1470
+ "NHOM_NGUOI"
1471
+ ],
1472
+ [
1473
+ "chủ sở hữu xe",
1474
+ "BEN_THU_BA"
1475
+ ],
1476
+ [
1477
+ "người điều khiển",
1478
+ "BEN_THU_BA"
1479
+ ],
1480
+ [
1481
+ "Cảnh sát giao thông",
1482
+ "BEN_THU_BA"
1483
+ ],
1484
+ [
1485
+ "chính quyền địa phương đã cấp phép sự kiện",
1486
+ "BEN_THU_BA"
1487
+ ],
1488
+ [
1489
+ "cơ quan quản lý đường bộ",
1490
+ "BEN_THU_BA"
1491
+ ]
1492
+ ]
1493
+ },
1494
+ {
1495
+ "text": "Kính gửi Bộ Tư pháp! Luật Nhà ở số 27/2023/QH15 được Quốc hội thông qua ngày 27/11/2023, quy định tại Điều 197 về hiệu lực thi hành như sau: \"1. Luật này có hiệu lực thi hành từ ngày 01 tháng 01 năm 2025. 2. Chính phủ quy định chi tiết các điều, khoản được giao trong Luật.\". Tương tự, Luật Kinh doanh bất động sản số 29/2023/QH15 cũng được thông qua cùng thời điểm, quy định tại khoản 1 Điều 82: \"Luật này có hiệu lực thi hành từ ngày 01 tháng 01 năm 2025.\". Gần đây, Quốc hội ban hành Luật số 43/2024/QH15 sửa đổi, bổ sung một số điều của 4 Luật nói trên, trong đó tại Điều 2 và Điều 3 sửa đổi lần lượt khoản 1 Điều 197 Luật Nhà ở và khoản 1 Điều 82 Luật Kinh doanh bất động sản, thay thế ngày có hiệu lực từ 01/01/2025 thành 01/08/2024. Vậy xin hỏi: Việc điều chỉnh này có làm thay đổi thời điểm áp dụng các quy định chuyển tiếp cụ thể đã được quy định trong các Điều khoản chuyển tiếp của Luật Nhà ở 2023 (Ví dụ: Điều 194 về hiệu lực đối với hợp đồng, giao dịch đã ký kết trước ngày Luật có hiệu lực) và Luật Kinh doanh bất động sản 2023 hay không? Hay các quy định chuyển tiếp đó vẫn được áp dụng kể từ ngày 01/01/2025 như quy định ban đầu, chỉ có các quy định chung mới được áp dụng từ 01/08/2024?",
1496
+ "entities": [
1497
+ [
1498
+ "Bộ Tư pháp",
1499
+ "CO_QUAN_THAM_QUYEN"
1500
+ ],
1501
+ [
1502
+ "Quốc hội",
1503
+ "CO_QUAN_THAM_QUYEN"
1504
+ ],
1505
+ [
1506
+ "Quốc hội",
1507
+ "TO_CHUC"
1508
+ ]
1509
+ ]
1510
+ },
1511
+ {
1512
+ "text": "Kính gửi Sở Giao thông Vận tải tỉnh Tuyên Quang. Hộ gia đình tôi có một mảnh đất ở tại xã Hợp Thành, huyện Sơn Dương, tỉnh Tuyên Quang. Mảnh đất này có Giấy chứng nhận quyền sử dụng đất, quyền sở hữu nhà ở và tài sản khác gắn liền với đất do UBND huyện Sơn Dương cấp năm 2020. Đất ở hiện tại có hiện trạng là đất trống, chưa có nhà. Chủ trương của gia đình tôi là sẽ xây dựng một ngôi nhà ở trên mảnh đất này. Tuy nhiên, qua xác minh của địa phương, thì mảnh đất này có một phần diện tích nằm trong phạm vi hành lang an toàn đường bộ thuộc tuyến đường tỉnh lộ 226 (tính từ mép ngoài nền đường mở rộng ra mỗi bên theo quy định). Xin hỏi Sở Giao thông Vận tải tỉnh Tuyên Quang giúp tôi: Trong trường hợp này, gia đình tôi có được phép xây dựng nhà ở trên phần đất đã có sổ đỏ nhưng nằm trong hành lang an toàn đường bộ hay không? Nếu được phép thì cần làm những thủ tục gì và phải đáp ứng những điều kiện cụ thể nào?",
1513
+ "entities": [
1514
+ [
1515
+ "Sở Giao thông Vận tải tỉnh Tuyên Quang",
1516
+ "CO_QUAN_THAM_QUYEN"
1517
+ ],
1518
+ [
1519
+ "Hộ gia đình tôi",
1520
+ "NHOM_NGUOI"
1521
+ ],
1522
+ [
1523
+ "UBND huyện Sơn Dương",
1524
+ "CO_QUAN_THAM_QUYEN"
1525
+ ],
1526
+ [
1527
+ "địa phương",
1528
+ "BEN_THU_BA"
1529
+ ],
1530
+ [
1531
+ "Sở Giao thông Vận tải tỉnh Tuyên Quang",
1532
+ "CO_QUAN_THAM_QUYEN"
1533
+ ],
1534
+ [
1535
+ "gia đình tôi",
1536
+ "NHOM_NGUOI"
1537
+ ]
1538
+ ]
1539
+ },
1540
+ {
1541
+ "text": "Kính gửi Bộ Công Thương, Công ty chúng tôi là một doanh nghiệp tư nhân chuyên sản xuất linh kiện điện tử, một sản phẩm thuộc nhóm công nghiệp trọng điểm được đề cập trong dự thảo Luật. Hiện nay, công ty đang có kế hoạch đầu tư đổi mới công nghệ, nhập khẩu dây chuyền sản xuất hiện đại để nâng cao chất lượng sản phẩm và sức cạnh tranh. Từ việc nghiên cứu dự thảo Luật Công nghiệp trọng điểm, chúng tôi nhận thấy có quy định về \"Chương trình quốc gia về Phát triển công nghiệp\" và các hỗ trợ cho hoạt động \"Ứng dụng, chuyển giao công nghệ\" để sản xuất sản phẩm công nghiệp chủ lực. Vì vậy, tôi xin được hỏi: 1. Khi Dự thảo Luật này được thông qua và có hiệu lực, công ty tư nhân như chúng tôi có được phép tham gia, đề xuất hoặc hưởng lợi từ \"Chương trình quốc gia về Phát triển công nghiệp\" hay không? 2. Để nhận được các hỗ trợ về kinh phí đổi mới công nghệ (theo Điều 35), công ty chúng tôi cần đáp ứng những điều kiện, tiêu chí cụ thể nào và thủ tục đăng ký ra sao? Chúng tôi rất mong nhận được sự hướng dẫn từ Bộ để chủ động chuẩn bị kế hoạch phát triển phù hợp với chính sách mới. Trân trọng cảm ơn!",
1542
+ "entities": [
1543
+ [
1544
+ "Bộ Công Thương",
1545
+ "CO_QUAN_THAM_QUYEN"
1546
+ ],
1547
+ [
1548
+ "Công ty chúng tôi",
1549
+ "TO_CHUC"
1550
+ ],
1551
+ [
1552
+ "doanh nghiệp tư nhân chuyên sản xuất linh kiện điện tử",
1553
+ "CHUC_DANH"
1554
+ ]
1555
+ ]
1556
+ },
1557
+ {
1558
+ "text": "Kính gửi Bộ Tư pháp! Tôi là một trọng tài viên đang giải quyết một vụ tranh chấp hợp đồng xây dựng về chất lượng công trình. Trong quá trình tố tụng, Tòa án đã trưng cầu một tổ chức giám định tư pháp về xây dựng để đánh giá hiện trạng và nguyên nhân hư hỏng của công trình. Kết luận giám định có đề cập đến các dấu hiệu quan sát được tại hiện trường (ví dụ: vết nứt, độ lún...). Tuy nhiên, khi tôi yêu cầu cung cấp hồ sơ giám định để kiểm tra tính khách quan và đầy đủ, tổ chức giám định chỉ cung cấp bản kết luận, biên bản giao nhận và các tài liệu có sẵn. Họ cho rằng các quan sát tại hiện trường đã được mô tả trong văn bản ghi nhận quá trình thực hiện giám định và không nhất thiết phải có ảnh chụp hiện trạng làm bằng chứng trực quan trong hồ sơ. Xin hỏi: Theo quy định của Luật Giám định tư pháp, đối với trường hợp giám định đòi hỏi quan sát thực tế hiện trường, hồ sơ giám định có bắt buộc phải có ảnh tư liệu (ảnh chụp, video) ghi nhận hiện trạng tại thời điểm giám định hay không? Nếu không có ảnh thì hồ sơ có bị coi là thiếu sót, ảnh hưởng đến giá trị pháp lý của kết luận giám định không?",
1559
+ "entities": [
1560
+ [
1561
+ "Bộ Tư pháp",
1562
+ "CO_QUAN_THAM_QUYEN"
1563
+ ],
1564
+ [
1565
+ "Tôi",
1566
+ "NGUOI"
1567
+ ],
1568
+ [
1569
+ "trọng tài viên",
1570
+ "CHUC_DANH"
1571
+ ],
1572
+ [
1573
+ "một tổ chức giám định tư pháp về xây dựng",
1574
+ "TO_CHUC"
1575
+ ],
1576
+ [
1577
+ "tổ chức giám định",
1578
+ "TO_CHUC"
1579
+ ],
1580
+ [
1581
+ "các quan sát tại hiện trường",
1582
+ "BEN_THU_BA"
1583
+ ]
1584
+ ]
1585
+ },
1586
+ {
1587
+ "text": "Kính gửi Bộ Công an. Tôi đã được cấp Căn cước công dân gắn chip và đăng ký sử dụng căn cước điện tử. Gần đây, tôi nhận được tin nhắn thông báo căn cước điện tử của tôi đã bị khóa do \"vi phạm thỏa thuận sử dụng ứng dụng định danh quốc gia\" theo quy định tại điểm b khoản 1 Điều 34 Luật Căn cước. Tuy nhiên, thông báo này không nêu rõ tôi đã vi phạm điều khoản cụ thể nào, cũng như các bước cần thực hiện để khắc phục vi phạm. Tôi đã thử liên hệ với cơ quan Công an nơi cấp thẻ nhưng chưa nhận được hướng dẫn chi tiết. Trong khi đó, việc căn cước điện tử bị khóa đã ảnh hưởng đến nhiều giao dịch điện tử và thủ tục hành chính trực tuyến của tôi. Vậy, tôi xin hỏi: 1. Cơ quan quản lý căn cước có trách nhiệm thông báo chi tiết về lý do vi phạm và hướng dẫn cụ thể các bước khắc phục cho người dân khi khóa căn cước điện tử theo điểm b khoản 1 Điều 34 hay không? 2. Nếu có, quy trình và thời hạn để tôi có thể khắc phục vi phạm và đề nghị mở khóa căn cước điện tử là như thế nào? Tôi kính mong Bộ Công an giải đáp để tôi có thể sớm khắc phục và tiếp tục sử dụng thuận tiện căn cước điện tử.",
1588
+ "entities": [
1589
+ [
1590
+ "Bộ Công an",
1591
+ "CO_QUAN_THAM_QUYEN"
1592
+ ],
1593
+ [
1594
+ "Tôi",
1595
+ "NGUOI"
1596
+ ],
1597
+ [
1598
+ "cơ quan Công an nơi cấp thẻ",
1599
+ "BEN_THU_BA"
1600
+ ],
1601
+ [
1602
+ "Cơ quan quản lý căn cước",
1603
+ "CO_QUAN_THAM_QUYEN"
1604
+ ],
1605
+ [
1606
+ "người dân",
1607
+ "NHOM_NGUOI"
1608
+ ]
1609
+ ]
1610
+ },
1611
+ {
1612
+ "text": "Kính gửi Bộ Tư pháp! Ông Nguyễn Văn A là công chứng viên, đã được Sở Tư pháp thành phố Hà Nội cấp thẻ công chứng viên để hành nghề tại Phòng công chứng X. Hiện ông A chấm dứt hợp đồng lao động và chuyển sang làm việc tại Văn phòng công chứng Y. Khi đó, thẻ công chứng viên đã cấp cho ông A tại Phòng công chứng X bị thu hồi theo quy định tại khoản 4 Điều 38 Luật Công chứng 2024. Tại Văn phòng công chứng Y, ông A chưa được cấp thẻ công chứng viên mới. Vậy, trong thời gian chờ cấp thẻ mới, nếu có khách hàng yêu cầu công chứng các loại văn bản như hợp đồng thế chấp bất động sản, di chúc, văn bản phân chia di sản (theo quy định tại Điều 55 và Điều 59 Luật Công chứng 2024), ông Nguyễn Văn A có được thực hiện thủ tục công chứng cho các văn bản này hay không? Nếu không được, văn bản công chứng đã thực hiện trong thời gian đó có giá trị pháp lý không? Xin cảm ơn.",
1613
+ "entities": [
1614
+ [
1615
+ "Bộ Tư pháp",
1616
+ "CO_QUAN_THAM_QUYEN"
1617
+ ],
1618
+ [
1619
+ "Ông Nguyễn Văn A",
1620
+ "NGUOI"
1621
+ ],
1622
+ [
1623
+ "công chứng viên",
1624
+ "CHUC_DANH"
1625
+ ],
1626
+ [
1627
+ "Sở Tư pháp thành phố Hà Nội",
1628
+ "CO_QUAN_THAM_QUYEN"
1629
+ ],
1630
+ [
1631
+ "Phòng công chứng X",
1632
+ "TO_CHUC"
1633
+ ],
1634
+ [
1635
+ "Văn phòng công chứng Y",
1636
+ "TO_CHUC"
1637
+ ],
1638
+ [
1639
+ "công chứng viên",
1640
+ "CHUC_DANH"
1641
+ ],
1642
+ [
1643
+ "Phòng công chứng X",
1644
+ "TO_CHUC"
1645
+ ],
1646
+ [
1647
+ "Văn phòng công chứng Y",
1648
+ "TO_CHUC"
1649
+ ],
1650
+ [
1651
+ "khách hàng",
1652
+ "BEN_THU_BA"
1653
+ ]
1654
+ ]
1655
+ },
1656
+ {
1657
+ "text": "Kính gửi Viện trưởng Viện kiểm sát nhân dân tối cao, Tôi có tình huống cần được giải đáp liên quan đến thủ tục xem xét miễn nhiệm, cách chức Kiểm sát viên Viện kiểm sát nhân dân tối cao theo quy định tại Điều 86 Luật Tổ chức Viện kiểm sát nhân dân. Giả sử trong cùng một đợt làm việc, Ủy ban kiểm sát Viện kiểm sát nhân dân tối cao đề nghị xem xét miễn nhiệm đối với 02 Kiểm sát viên (ông A và ông B) và cách chức đối với 01 Kiểm sát viên (ông C). Hội đồng tuyển chọn Kiểm sát viên Viện kiểm sát nhân dân tối cao đã họp và xem xét, quyết định thông qua cả 03 trường hợp này. Xin hỏi: Trong tình huống trên, việc \"Viện trưởng Viện kiểm sát nhân dân tối cao trình Chủ tịch nước\" miễn nhiệm đối với ông A, ông B và cách chức đối với ông C được thực hiện như thế nào? Có phải Viện trưởng sẽ phải làm 03 văn bản trình riêng biệt (01 văn bản cho ông A, 01 văn bản cho ông B, 01 văn bản cho ông C) hay có thể gộp chung vào một văn bản trình duy nhất để trình Chủ tịch nước xem xét, quyết định? Trân trọng cảm ơn.",
1658
+ "entities": [
1659
+ [
1660
+ "Viện trưởng Viện kiểm sát nhân dân tối cao",
1661
+ "CO_QUAN_THAM_QUYEN"
1662
+ ],
1663
+ [
1664
+ "Tôi",
1665
+ "NGUOI"
1666
+ ],
1667
+ [
1668
+ "Kiểm sát viên Viện kiểm sát nhân dân tối cao",
1669
+ "CHUC_DANH"
1670
+ ],
1671
+ [
1672
+ "Ủy ban kiểm sát Viện kiểm sát nhân dân tối cao",
1673
+ "TO_CHUC"
1674
+ ],
1675
+ [
1676
+ "Kiểm sát viên",
1677
+ "CHUC_DANH"
1678
+ ],
1679
+ [
1680
+ "ông A",
1681
+ "NGUOI"
1682
+ ],
1683
+ [
1684
+ "ông B",
1685
+ "NGUOI"
1686
+ ],
1687
+ [
1688
+ "ông C",
1689
+ "NGUOI"
1690
+ ],
1691
+ [
1692
+ "Hội đồng tuyển chọn Kiểm sát viên Viện kiểm sát nhân dân tối cao",
1693
+ "TO_CHUC"
1694
+ ],
1695
+ [
1696
+ "Viện trưởng Viện kiểm sát nhân dân tối cao",
1697
+ "CHUC_DANH"
1698
+ ],
1699
+ [
1700
+ "Chủ tịch nước",
1701
+ "CHUC_DANH"
1702
+ ],
1703
+ [
1704
+ "ông A",
1705
+ "NGUOI"
1706
+ ],
1707
+ [
1708
+ "ông B",
1709
+ "NGUOI"
1710
+ ],
1711
+ [
1712
+ "ông C",
1713
+ "NGUOI"
1714
+ ],
1715
+ [
1716
+ "ông A",
1717
+ "NGUOI"
1718
+ ],
1719
+ [
1720
+ "ông B",
1721
+ "NGUOI"
1722
+ ],
1723
+ [
1724
+ "ông C",
1725
+ "NGUOI"
1726
+ ],
1727
+ [
1728
+ "Chủ tịch nước",
1729
+ "CHUC_DANH"
1730
+ ]
1731
+ ]
1732
+ },
1733
+ {
1734
+ "text": "Kính gửi Bộ Tư pháp! Trong quá trình thi hành công vụ, ông A (là cán bộ công chức tại Sở Tài nguyên và Môi trường tỉnh X) đã có quyết định hành chính trái pháp luật, gây thiệt hại cho hộ gia đình ông B. Theo quyết định của cơ quan có thẩm quyền, ông A phải hoàn trả một phần tiền bồi thường cho Nhà nước. Tuy nhiên, tại thời điểm có quyết định hoàn trả, ông A đã nghỉ hưu và không còn thuộc biên chế, quản lý của Sở Tài nguyên và Môi trường nữa. Hiện ông A nhận lương hưu từ Bảo hiểm xã hội tỉnh X. Vậy xin hỏi, trong trường hợp này, cơ quan nào có trách nhiệm tổ chức việc thu tiền hoàn trả của ông A theo quy định của Luật Trách nhiệm bồi thường của Nhà nước? Trân trọng cảm ơn!",
1735
+ "entities": [
1736
+ [
1737
+ "Bộ Tư pháp",
1738
+ "CO_QUAN_THAM_QUYEN"
1739
+ ],
1740
+ [
1741
+ "ông A",
1742
+ "NGUOI"
1743
+ ],
1744
+ [
1745
+ "cán bộ công chức",
1746
+ "CHUC_DANH"
1747
+ ],
1748
+ [
1749
+ "Sở Tài nguyên và Môi trường tỉnh X",
1750
+ "TO_CHUC"
1751
+ ],
1752
+ [
1753
+ "hộ gia đình ông B",
1754
+ "NHOM_NGUOI"
1755
+ ],
1756
+ [
1757
+ "ông B",
1758
+ "NGUOI"
1759
+ ],
1760
+ [
1761
+ "Sở Tài nguyên và Môi trường",
1762
+ "TO_CHUC"
1763
+ ],
1764
+ [
1765
+ "Bảo hiểm xã hội tỉnh X",
1766
+ "TO_CHUC"
1767
+ ]
1768
+ ]
1769
+ }
1770
+ ]
0_ent_175_negs_hr_05_wr25_1/results/all_splits/0_ent_175_negs_hr_05_wr25_1_predict_result_split_3.json ADDED
The diff for this file is too large to render. See raw diff
 
0_ent_175_negs_hr_05_wr25_1/results/all_splits/0_ent_175_negs_hr_05_wr25_1_predict_result_split_4.json ADDED
The diff for this file is too large to render. See raw diff
 
0_ent_175_negs_hr_05_wr25_1/results/all_splits/0_ent_175_negs_hr_05_wr25_1_predict_result_split_5.json ADDED
The diff for this file is too large to render. See raw diff
 
0_ent_175_negs_hr_05_wr25_1/results/all_splits/0_ent_175_negs_hr_05_wr25_1_predict_result_split_6.json ADDED
The diff for this file is too large to render. See raw diff
 
0_ent_175_negs_hr_05_wr25_1/results/all_splits/0_ent_175_negs_hr_05_wr25_1_predict_result_split_7.json ADDED
The diff for this file is too large to render. See raw diff
 
0_ent_175_negs_hr_05_wr25_1/results/all_splits/0_ent_175_negs_hr_05_wr25_1_predict_result_split_8.json ADDED
The diff for this file is too large to render. See raw diff
 
0_ent_175_negs_hr_05_wr25_1/results/all_splits/0_ent_175_negs_hr_05_wr25_1_predict_result_split_9.json ADDED
The diff for this file is too large to render. See raw diff