Spaces:
Build error
Build error
Commit
•
4589b64
1
Parent(s):
2d111cb
init
Browse files- .gitignore +2 -0
- app.py +60 -0
- config/comment_generator.yaml +7 -0
- requirements.txt +5 -0
- src/comment.py +58 -0
- src/model/init.py +7 -0
- src/model/model.py +79 -0
- src/model/text_process.py +41 -0
- storage/linhai.jpeg +0 -0
- storage/teencode.txt +422 -0
- utils/config.py +18 -0
- utils/get_logging.py +18 -0
.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
|