truong-xuan-linh commited on
Commit
4589b64
1 Parent(s): 2d111cb
.gitignore ADDED
@@ -0,0 +1,2 @@
 
 
 
1
+ __pycache__
2
+ *test*
app.py ADDED
@@ -0,0 +1,60 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import streamlit as st
2
+ from PIL import Image
3
+
4
+ #Trick to not init function multitime
5
+ if "get_comment" not in st.session_state:
6
+ print("INIT MODEL")
7
+ from src.comment import GetComment
8
+ st.session_state.get_comment = GetComment()
9
+ print("DONE INIT MODEL")
10
+
11
+ st.set_page_config(page_title="Auto Comment Generation", layout="wide", page_icon = "./storage/linhai.jpeg")
12
+ hide_menu_style = """
13
+ <style>
14
+ footer {visibility: hidden;}
15
+ </style>
16
+ """
17
+ st.markdown(hide_menu_style, unsafe_allow_html= True)
18
+
19
+ st.markdown(
20
+ """
21
+ <style>
22
+ [data-testid="stSidebar"][aria-expanded="true"] > div:first-child{
23
+ width: 400px;
24
+ }
25
+ [data-testid="stSidebar"][aria-expanded="false"] > div:first-child{
26
+ margin-left: -400px;
27
+ }
28
+
29
+ """,
30
+ unsafe_allow_html=True,
31
+ )
32
+
33
+ left_col, right_col = st.columns(2)
34
+
35
+ #Sidebar
36
+ num_comments = st.sidebar.slider("Number of comments generated", 1, 10, 1)
37
+ type_generation = st.sidebar.radio("Type of comment generation", options=[0,1])
38
+
39
+ #LEFT COLUMN
40
+ with left_col:
41
+ content = st.text_input("Enter your status", value="Hôm nay trời đẹp quá nhỉ")
42
+ images = st.file_uploader("Choose an image file", key=1, accept_multiple_files=True, type=["jpg", "jpeg", "png", "webp", ])
43
+
44
+ if left_col.button("Generate"):
45
+ info = {
46
+ "content": content,
47
+ "medias": images,
48
+ "type_generation": type_generation,
49
+ "num_comments": num_comments
50
+ }
51
+
52
+ #RIGHT COLUMN
53
+ with right_col:
54
+ st.write("**STATUS:** ", info["content"])
55
+ st.write("**IMAGES:** ")
56
+ st.image(info["medias"], width=100, caption=list(range(1, len(images) +1)))
57
+
58
+ comments = st.session_state.get_comment.generator(info)
59
+ for i, comment in enumerate(comments):
60
+ st.write(f"**Comment {i+1}**: {comment}")
config/comment_generator.yaml ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
 
1
+ model:
2
+ device: cpu
3
+ url: https://drive.google.com/uc?id=1-Fyh5nBbbUKwVayg3USuSYtjJQcmuFrV
4
+ dir: ./storage/last_vit_base_vit5_base_input_256_output_32_v4_thresh_2.0.pt
5
+ input_maxlen: 256
6
+ output_maxlen: 32
7
+ num_comment: 10
requirements.txt ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
 
1
+ torch==2.0.1
2
+ gdown
3
+ transformers==4.32.0
4
+ Pillow==9.5.0
5
+ streamlit==1.26.0
src/comment.py ADDED
@@ -0,0 +1,58 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from src.model.model import CommentGenerator
2
+ from src.model.text_process import TextPreprocess
3
+
4
+ class GetComment():
5
+ def __init__(self) -> None:
6
+ """Get Comment init funtion
7
+ """
8
+ self.CommentGenerator = CommentGenerator()
9
+ self.text_preprocess = TextPreprocess()
10
+ self.inputs = {}
11
+
12
+ def generator(self, info):
13
+ """Generation function
14
+
15
+ Args:
16
+ info (Dict): info extract from kafka message
17
+
18
+ Returns:
19
+ List: List of comment
20
+ """
21
+
22
+ content = info["content"]
23
+ content = self.text_preprocess.preprocess(content)
24
+ medias = info["medias"]
25
+ if not medias:
26
+ medias = [None]
27
+
28
+ print(medias)
29
+ typfeed = info["type_generation"]
30
+ num_comments = info["num_comments"]
31
+ mapper = {
32
+ 0: "bảng tin",
33
+ 1: "trải nghiệm"
34
+ }
35
+
36
+ comments_prefix = ["thứ một",
37
+ "thứ hai",
38
+ "thứ ba"]
39
+
40
+ comments = []
41
+ for i, comment_prefix in enumerate(comments_prefix):
42
+ content_w_prefix = f"{mapper[typfeed]}: {comment_prefix}: {content}"
43
+ self.inputs[f"content_{i}"] = self.CommentGenerator.get_text_feature(content_w_prefix)
44
+
45
+ while len(comments) < num_comments:
46
+ for i, media in enumerate(medias):
47
+ print(i)
48
+ if i not in self.inputs:
49
+ self.inputs[i] = self.CommentGenerator.get_image_feature_from_url(media, is_local=True)
50
+ image_feature, image_mask = self.inputs[i]
51
+ for i in range(len(comments_prefix)):
52
+ content_feature, content_mask = self.inputs[f"content_{i}"]
53
+ comment = self.CommentGenerator.inference(content_feature, content_mask, image_feature, image_mask)[0]
54
+ comments.append(comment)
55
+ comments = list(set(comments))
56
+ if len(comments) >= num_comments:
57
+ return comments
58
+
src/model/init.py ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
 
1
+ import os
2
+ import gdown
3
+
4
+ def download_model(url, output):
5
+ if os.path.isfile(output):
6
+ return
7
+ gdown.download(url, output, quiet=True)
src/model/model.py ADDED
@@ -0,0 +1,79 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import os
2
+ import torch
3
+ import requests
4
+ from PIL import Image
5
+
6
+ from utils.config import Config
7
+ from src.model.init import download_model
8
+ from transformers import AutoImageProcessor, ViTModel, AutoTokenizer, T5EncoderModel
9
+
10
+ class CommentGenerator():
11
+ def __init__(self) -> None:
12
+
13
+ self.config = Config("./config/comment_generator.yaml").__get_config__()
14
+ download_model(self.config['model']['url'], self.config['model']['dir'])
15
+
16
+ #Get model
17
+ self.tokenizer = AutoTokenizer.from_pretrained("VietAI/vit5-base")
18
+ self.model = torch.load(self.config["model"]["dir"], map_location=torch.device(self.config["model"]['device']))
19
+
20
+
21
+ #Image
22
+ self.vit_image_processor = AutoImageProcessor.from_pretrained("google/vit-base-patch16-224-in21k")
23
+ self.vit_model = ViTModel.from_pretrained("google/vit-base-patch16-224-in21k")
24
+ self.vit_model.to(self.config["model"]["device"])
25
+
26
+ #Content
27
+ self.vit5_model = T5EncoderModel.from_pretrained("VietAI/vit5-base")
28
+ self.vit5_model.to(self.config["model"]["device"])
29
+
30
+ def get_text_feature(self, content):
31
+ inputs = self.tokenizer(content,
32
+ padding="max_length",
33
+ truncation=True,
34
+ max_length=self.config["model"]["input_maxlen"],
35
+ return_tensors="pt").to(self.config["model"]["device"])
36
+ with torch.no_grad():
37
+ outputs = self.vit5_model(**inputs)
38
+ last_hidden_states = outputs.last_hidden_state
39
+ return last_hidden_states.to(self.config["model"]["device"]), inputs.attention_mask.to(self.config["model"]["device"])
40
+
41
+
42
+ def get_image_feature_from_url(self, image_url, is_local=False):
43
+ if not image_url:
44
+ print(f"WARNING not image url {image_url}")
45
+ return torch.zeros((1, 197, 768)).to(self.config["model"]["device"]), torch.zeros((1, 197)).to(self.config["model"]["device"])
46
+ if not is_local:
47
+ try:
48
+ images = Image.open(requests.get(image_url, stream=True).raw).convert("RGB")
49
+ except:
50
+ print(f"READ IMAGE ERR: {image_url}")
51
+ return torch.zeros((1, 197, 768)).to(self.config["model"]["device"]), torch.zeros((1, 197)).to(self.config["model"]["device"])
52
+ else:
53
+ images = Image.open(image_url).convert("RGB")
54
+ inputs = self.vit_image_processor(images, return_tensors="pt").to(self.config["model"]["device"])
55
+ with torch.no_grad():
56
+ outputs = self.vit_model(**inputs)
57
+ last_hidden_states = outputs.last_hidden_state
58
+ attention_mask = torch.ones((last_hidden_states.shape[0], last_hidden_states.shape[1]))
59
+
60
+ return last_hidden_states.to(self.config["model"]["device"]), attention_mask.to(self.config["model"]["device"])
61
+
62
+ def inference(self, content_feature, content_mask, image_feature, image_mask):
63
+
64
+ inputs_embeds = torch.cat((image_feature[0], content_feature[0]), 0)
65
+ inputs_embeds = torch.unsqueeze(inputs_embeds, 0)
66
+ attention_mask = torch.cat((image_mask[0], content_mask[0]), 0)
67
+ attention_mask = torch.unsqueeze(attention_mask, 0)
68
+ with torch.no_grad():
69
+ generated_ids = self.model.generate(
70
+ inputs_embeds=inputs_embeds,
71
+ attention_mask=attention_mask,
72
+ num_beams=2,
73
+ max_length=self.config["model"]["output_maxlen"],
74
+ # num_return_sequences=2
75
+ # skip_special_tokens=True,
76
+ # clean_up_tokenization_spaces=True
77
+ )
78
+ comments = [self.tokenizer.decode(generated_id, skip_special_tokens=True) for generated_id in generated_ids]
79
+ return comments
src/model/text_process.py ADDED
@@ -0,0 +1,41 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import re
2
+
3
+ class TextPreprocess():
4
+ def __init__(self, teencode_dir="./storage/teencode.txt"):
5
+ self.get_teencode(teencode_dir)
6
+
7
+ def get_teencode(self, teencode_dir):
8
+ with open(teencode_dir, "r", encoding="utf-8") as f:
9
+ teencode_original = f.readlines()
10
+ teencode_json = {}
11
+ for teencode in teencode_original:
12
+ key, value = teencode.split("\t")
13
+ value = value.replace("\n", "")
14
+ teencode_json[key] = value
15
+ self.teencode_json = teencode_json
16
+
17
+ def teencode_normalize(self, text):
18
+ text_split = text.split()
19
+ return " ".join([self.teencode_json.get(txt, txt) for txt in text_split])
20
+
21
+ def clean_text(self, text):
22
+ # Xóa hashtag (dấu #)
23
+ text = re.sub(r'#\w+', '', text)
24
+
25
+ # Xóa liên kết (URL)
26
+ text = re.sub(r'http\S+', '', text)
27
+
28
+ # Xóa các ký tự số
29
+ text = re.sub(r'\d+', '', text)
30
+
31
+ # Xóa ký tự đặc biệt
32
+ text = re.sub(r'[^\w\s]', '', text)
33
+
34
+ text = " ".join(text.split())
35
+ text = text.lower()
36
+ return text
37
+
38
+ def preprocess(self, text):
39
+ cleaned_text = self.clean_text(text)
40
+ cleaned_text = self.teencode_normalize(cleaned_text)
41
+ return cleaned_text
storage/linhai.jpeg ADDED
storage/teencode.txt ADDED
@@ -0,0 +1,422 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ctrai con trai
2
+ khôg không
3
+ bme bố mẹ
4
+ cta chúng ta
5
+ mih mình
6
+ mqh mối quan hệ
7
+ cgai con gái
8
+ nhữg những
9
+ mng mọi người
10
+ svtn sinh viên tình nguyện
11
+ r rồi
12
+ qtam quan tâm
13
+ thươg thương
14
+ qtâm quan tâm
15
+ chug chung
16
+ trườg trường
17
+ thoy thôi
18
+ đki đăng ký
19
+ atsm ảo tưởng sức mạnh
20
+ ạk ạ
21
+ cv công việc
22
+ vch vãi chưởng
23
+ cùg cùng
24
+ pn bạn
25
+ pjt biết
26
+ thjk thích
27
+ keke ce ce
28
+ ktra kiểm tra
29
+ nek nè
30
+ cgái con gái
31
+ nthe như thế
32
+ chúg chúng
33
+ kái cái
34
+ tìh tình
35
+ phòg phòng
36
+ lòg lòng
37
+ từg từng
38
+ rằg rằng
39
+ sốg sống
40
+ thuj thôi
41
+ thuơng thương
42
+ càg càng
43
+ đky đăng ký
44
+ bằg bằng
45
+ sviên sinh viên
46
+ ák á
47
+ đág đáng
48
+ nvay như vậy
49
+ nhjeu nhiều
50
+ xg xuống
51
+ zồi rồi
52
+ trag trang
53
+ zữ dữ
54
+ atrai anh trai
55
+ kte kinh tế
56
+ độg động
57
+ lmht liên minh huyền thoại
58
+ gắg gắng
59
+ đzai đẹp trai
60
+ thgian thời gian
61
+ plz pờ ly
62
+ đồg đồng
63
+ btrai bạn trai
64
+ nthê như thế
65
+ hìhì hì hì
66
+ vọg vọng
67
+ hihe hi he
68
+ đôg đông
69
+ răg răng
70
+ thườg thường
71
+ tcảm tình cảm
72
+ đứg đứng
73
+ ksao không sao
74
+ dz đẹp trai
75
+ hjxhjx hix hix
76
+ cmày chúng mày
77
+ xuốg xuống
78
+ nkư như
79
+ lquan liên quan
80
+ tiếg tiếng
81
+ hajz hai
82
+ xih xinh
83
+ hìh hình
84
+ thàh thành
85
+ ngke nghe
86
+ dzậy dậy
87
+ teencode tin cốt
88
+ tnào thế nào
89
+ tưởg tưởng
90
+ ctrinh chương trình
91
+ phog phong
92
+ hôg không
93
+ zìa gì
94
+ kũg cũng
95
+ ntnao như thế nào
96
+ trọg trọng
97
+ nthế như thế
98
+ năg năng
99
+ ngđó người đó
100
+ lquen làm quen
101
+ riêg riêng
102
+ ngag ngang
103
+ hêhê hê hê
104
+ bnhiu bao nhiêu
105
+ ngốk ngốc
106
+ kậu cậu
107
+ highland hai lừn
108
+ kqua kết quả
109
+ htrc hôm trước
110
+ địh định
111
+ gđình gia đinh
112
+ giốg giống
113
+ csống cuộc sống
114
+ xug xùng
115
+ zùi rồi
116
+ bnhiêu bao nhiêu
117
+ cbị chuẩn bị
118
+ kòn còn
119
+ buôg buông
120
+ csong cuộc sống
121
+ chàg chàng
122
+ chăg chăng
123
+ ngàh ngành
124
+ llac liên lạc
125
+ nkưng nhưng
126
+ nắg nắng
127
+ tíh tính
128
+ khoảg khoảng
129
+ thík thích
130
+ ngđo người đó
131
+ ngkhác người khác
132
+ thẳg thẳng
133
+ kảm cảm
134
+ dàh dành
135
+ júp giúp
136
+ lặg lặng
137
+ vđê vấn đề
138
+ bbè bạn bè
139
+ bóg bóng
140
+ dky đăng ký
141
+ dòg dòng
142
+ uốg uống
143
+ tyêu tình yêu
144
+ snvv sinh nhật vui vẻ
145
+ đthoại điện thoại
146
+ qhe quan hệ
147
+ cviec công việc
148
+ tượg tượng
149
+ qà quà
150
+ thjc thích
151
+ nhưq nhưng
152
+ cđời cuộc đời
153
+ bthường bình thường
154
+ zà già
155
+ đáh đánh
156
+ xloi xin lỗi
157
+ zám dám
158
+ qtrọng quan trọng
159
+ bìh bình
160
+ lzi làm gì
161
+ qhệ quan hệ
162
+ đhbkhn đại học bách khoa hà nội
163
+ hajzz hai
164
+ kủa của
165
+ lz làm gì
166
+ đhkhtn đại học khoa học tự nhiên
167
+ đóg đóng
168
+ cka cha
169
+ lgi làm gì
170
+ nvậy như vậy
171
+ qả quả
172
+ đkiện điều kiện
173
+ nèk nè
174
+ tlai tương lai
175
+ bsĩ bác sĩ
176
+ hkì học kỳ
177
+ đcsvn đảng cộng sản việt nam
178
+ vde vấn đề
179
+ chta chúng ta
180
+ òy rồi
181
+ ltinh linh tinh
182
+ ngyeu người yêu
183
+ đthoai điện thoại
184
+ snghĩ suy nghĩ
185
+ nặg nặng
186
+ họk học
187
+ dừg dừng
188
+ hphúc hạnh phúc
189
+ hiha hi ha
190
+ wtâm quan tâm
191
+ thíck thích
192
+ chuện chuyện
193
+ lạh lạnh
194
+ fây phây
195
+ ntnày như thế này
196
+ lúk lúc
197
+ haj hai
198
+ ngía nghía
199
+ mớj mới
200
+ hsơ hồ sơ
201
+ ctraj con trai
202
+ nyêu người yêu
203
+ điiiiiii đi
204
+ rồii rồi
205
+ c chị
206
+ kih kinh
207
+ kb kết bạn
208
+ hixxx hích
209
+ dthương dễ thương
210
+ nhiềuuu nhiều
211
+ ctrình chương trình
212
+ mìnk mình
213
+ mjh mình
214
+ ng người
215
+ vc vợ chồng
216
+ uhm ừm
217
+ thỳ thì
218
+ nyc người yêu cũ
219
+ tks thanks
220
+ nàg nàng
221
+ thôii thôi
222
+ đjên điên
223
+ bgái bạn gái
224
+ vớii với
225
+ xink xinh
226
+ hđộng hành động
227
+ đhọc đại học
228
+ mk mình
229
+ bn bạn
230
+ thik thích
231
+ cj chị
232
+ mn mọi người
233
+ nguoi người
234
+ nógn nóng
235
+ hok không
236
+ ko không
237
+ bik biết
238
+ vs với
239
+ cx cũng
240
+ mik mình
241
+ wtf what the fuck
242
+ đc được
243
+ cmt comment
244
+ ck chồng
245
+ chk chồng
246
+ ngta người ta
247
+ gđ gia đình
248
+ oh ồ
249
+ vk vợ
250
+ ctác công tác
251
+ sg sài gòn
252
+ ae anh em
253
+ ah à
254
+ ạh ạ
255
+ rì gì
256
+ ms mới
257
+ vn việt nam
258
+ nhaa nha
259
+ cũg cũng
260
+ đag đang
261
+ ơiii ơi
262
+ hic hích
263
+ ace anh chị em
264
+ àk à
265
+ uh ừ
266
+ cmm con mẹ mày
267
+ cmnr con mẹ nó rồi
268
+ ơiiii ơi
269
+ hnay hôm nay
270
+ ukm ừm
271
+ tq trung quốc
272
+ ctr chương trình
273
+ đii đi
274
+ nch nói chuyện
275
+ trieu triệu
276
+ hahah ha ha
277
+ nta người ta
278
+ ngèo nghèo
279
+ kêh kênh
280
+ ak à
281
+ ad admin
282
+ j gì
283
+ ny người yêu
284
+ dc được
285
+ qc quảng cáo
286
+ baoh bao giờ
287
+ zui vui
288
+ zẻ vẻ
289
+ tym tim
290
+ aye anh yêu em
291
+ eya em yêu anh
292
+ fb facebook
293
+ insta instagram
294
+ z vậy
295
+ thich thích
296
+ vcl vờ cờ lờ
297
+ đt điện thoại
298
+ acc account
299
+ lol lồn
300
+ loz lồn
301
+ lozz lồn
302
+ trc trước
303
+ chs chẳng hiểu sao
304
+ đhs đéo hiểu sao
305
+ qá quá
306
+ ntn như thế nào
307
+ wá quá
308
+ zậy vậy
309
+ zô vô
310
+ ytb youtube
311
+ vđ vãi đái
312
+ vchg vãi chưởng
313
+ sml sấp mặt lờ
314
+ xl xin lỗi
315
+ cmn con mẹ nó
316
+ face facebook
317
+ hjhj hi hi
318
+ vv vui vẻ
319
+ ns nói
320
+ iu yêu
321
+ vcđ vãi cải đái
322
+ in4 info
323
+ qq quằn què
324
+ sub subcribe
325
+ kh không
326
+ zạ vậy
327
+ oy rồi
328
+ jo giờ
329
+ clmm cái lồn mẹ mày
330
+ bsvv buổi sáng vui vẻ
331
+ troai trai
332
+ wa quá
333
+ hjx hix
334
+ e em
335
+ ik đi
336
+ ji gì
337
+ ce chị em
338
+ lm làm
339
+ đz đẹp giai
340
+ sr sorry
341
+ ib inbox
342
+ hoy thôi
343
+ đbh đéo bao giờ
344
+ k không
345
+ vd ví dụ
346
+ a anh
347
+ cũng z cũng vậy
348
+ z là vậy là
349
+ unf unfriend
350
+ my fen my friend
351
+ fen friend
352
+ cty công ty
353
+ on lai online
354
+ u hai ba u23
355
+ kô không
356
+ đtqg đội tuyển quốc gia
357
+ hqua hôm qua
358
+ xog xong
359
+ uh ừ
360
+ uk ừ
361
+ nhoé nhé
362
+ biet biết
363
+ quí quý
364
+ stk số tài khoản
365
+ hong kong hồng kông
366
+ đươc được
367
+ nghành ngành
368
+ nvqs nghĩa vụ quân sự
369
+ ngừoi người
370
+ trog trong
371
+ tgian thời gian
372
+ biêt biết
373
+ fải phải
374
+ nguời người
375
+ tđn thế đéo nào
376
+ bth bình thường
377
+ vcđ vãi cả đái
378
+ tgdd thế giới di động
379
+ khg không
380
+ nhưg nhưng
381
+ thpt trung học phổ thông
382
+ thằg thằng
383
+ đuợc được
384
+ dc được
385
+ đc được
386
+ ah à
387
+ àh à
388
+ ku cu
389
+ thým thím
390
+ onl online
391
+ zô dô
392
+ zú vú
393
+ cmnd chứng minh nhân dân
394
+ sđt số điện thoại
395
+ klq không liên quan
396
+ t mình
397
+ vại vậy
398
+ v vậy
399
+ z vậy
400
+ cám ơn cảm ơn
401
+ mún muốn
402
+ thặc thật
403
+ gấc rất
404
+ zị vậy
405
+ cf cà phê
406
+ kout cao
407
+ thưn thương
408
+ rùi rồi
409
+ thui thôi
410
+ hong không
411
+ khum không
412
+ chòi trời
413
+ b bạn
414
+ lém lắm
415
+ c chị
416
+ gòi rồi
417
+ zị vậy
418
+ chài trời
419
+ lun luôn
420
+ = bằng
421
+ đsung đúng
422
+ tr trời
utils/config.py ADDED
@@ -0,0 +1,18 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import yaml
2
+
3
+ class Config():
4
+ def __init__(self, dir) -> None:
5
+ """Init function for Config class
6
+
7
+ Args:
8
+ dir (String): path to config file
9
+ """
10
+ self.dir = dir
11
+
12
+ def __get_config__(self):
13
+ """get config
14
+
15
+ Returns:
16
+ yaml: Yaml config
17
+ """
18
+ return yaml.load((open(self.dir)), Loader=yaml.SafeLoader)
utils/get_logging.py ADDED
@@ -0,0 +1,18 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import pytz
2
+ import logging
3
+ import datetime
4
+
5
+ def get_logging(log_dir):
6
+ """Get logging function
7
+
8
+ Args:
9
+ log_dir (String): location directory (relative path)
10
+
11
+ Returns:
12
+ logging: custom logging
13
+ """
14
+
15
+ logging.Formatter.converter = logging.Formatter.converter = lambda *args: datetime.datetime.now(tz=pytz.timezone('Asia/Ho_Chi_Minh')).timetuple()
16
+ logging.basicConfig(filename=log_dir, level=logging.INFO, format = '[%(asctime)s] - [%(levelname)s] - [%(funcName)s] - [%(lineno)d] - %(message)s',
17
+ filemode="w")
18
+ return logging