nhanne24 commited on
Commit
a560dfb
·
verified ·
1 Parent(s): e87a8e7
Files changed (6) hide show
  1. DockerFile +14 -0
  2. app.py +54 -0
  3. classify_model.py +185 -0
  4. normal_dataset.json +564 -0
  5. requirements.txt +11 -0
  6. toxic_dataset.json +666 -0
DockerFile ADDED
@@ -0,0 +1,14 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+
2
+ FROM python:3.9
3
+
4
+ RUN useradd -m -u 1000 user
5
+ USER user
6
+ ENV PATH="/home/user/.local/bin:$PATH"
7
+
8
+ WORKDIR /app
9
+
10
+ COPY --chown=user ./requirements.txt requirements.txt
11
+ RUN pip install --no-cache-dir --upgrade -r requirements.txt
12
+
13
+ COPY --chown=user . /app
14
+ CMD ["uvicorn", "app:app", "--host", "0.0.0.0", "--port", "7860"]
app.py ADDED
@@ -0,0 +1,54 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from flask import Flask, request, jsonify
2
+ from classify_model import model, tokenizer
3
+ import torch
4
+ import numpy as np
5
+ import os
6
+ os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'
7
+ import gdown
8
+ from underthesea import word_tokenize
9
+
10
+
11
+ if not os.path.exists("save_weights.pt"):
12
+ file_id = "1JeQ100QELbCCjCozF5SsHT1ca08Vvfuw"
13
+ url = f"https://drive.google.com/uc?id={file_id}"
14
+ print("Downloading save_weights.pt from Google Drive...")
15
+ gdown.download(url, "save_weights.pt", quiet=False)
16
+ if not os.path.exists("save_weights.pt"):
17
+ raise FileNotFoundError("Failed to download save_weights.pt")
18
+
19
+ model.load_state_dict(torch.load("save_weights.pt"))
20
+ model.eval()
21
+
22
+ app = Flask(__name__)
23
+
24
+ def predict_toxic(sentence):
25
+ # tokens = rdrsegmenter.tokenize(sentence)
26
+ # statement = ""
27
+ # for token in tokens:
28
+ # statement += " ".join(token)
29
+ # sentence = statement
30
+ sentence = word_tokenize(sentence, format="text")
31
+ sequence = tokenizer.encode(sentence)
32
+ while len(sequence) == 20:
33
+ sequence.insert(0, 0)
34
+ padded = torch.tensor([sequence])
35
+ with torch.no_grad():
36
+ preds = model(padded)
37
+ preds = np.argmax(preds.cpu().numpy(), axis=1)
38
+ return preds[0]
39
+
40
+
41
+ @app.route('/predict', methods=['POST'])
42
+ def predict():
43
+ data = request.json
44
+ sentence = data.get('sentence', '')
45
+ if not sentence:
46
+ return jsonify({'error': 'No sentence provided'}), 400
47
+ result = predict_toxic(sentence)
48
+ print("Dự đoán:", result, type(result))
49
+ return jsonify({'toxic': int(result)})
50
+
51
+ if __name__ == "__main__":
52
+ port = int(os.environ.get("PORT", 5000))
53
+ app.run(host="0.0.0.0", port=port)
54
+ # app.run(host="0.0.0.0", port=5001)
classify_model.py ADDED
@@ -0,0 +1,185 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import numpy as np
2
+ import pandas as pd
3
+ import torch
4
+ import torch.nn as nn
5
+ from sklearn.model_selection import train_test_split
6
+ from sklearn.metrics import classification_report
7
+ from torch.optim import optimizer
8
+ import transformers
9
+ from transformers import AutoModel, AutoTokenizer
10
+ from keras.preprocessing.sequence import pad_sequences
11
+ import json
12
+ #from vncorenlp import VnCoreNLP
13
+ from sklearn.utils import shuffle
14
+ from torch.optim import AdamW
15
+ from torch.utils.data import TensorDataset, DataLoader, RandomSampler
16
+ from underthesea import word_tokenize
17
+
18
+ #Đọc dữ liệu
19
+ def get_data(all_path):
20
+ sentences=[]
21
+ labels=[]
22
+ for i in all_path:
23
+ try:
24
+ with open(i, "r", encoding='utf-8') as f:
25
+ datastore = json.load(f)
26
+ except FileNotFoundError:
27
+ print(f"Error: File {i} not found")
28
+ continue
29
+ except json.JSONDecodeError:
30
+ print(f"Error: File {i} contains invalid JSON")
31
+ continue
32
+ for item in datastore:
33
+ sentences.append(item["sentences"])
34
+ labels.append(item["toxic"])
35
+ return sentences, labels
36
+
37
+
38
+ #Tách từ tiếng việt
39
+ # rdrsegmenter=VnCoreNLP("vncorenlp/VnCoreNLP-1.1.1.jar", annotators="wseg", max_heap_size='-Xmx500m')
40
+ # def sentences_segment(sentences):
41
+ # for i in range(len(sentences)):
42
+ # tokens=rdrsegmenter.tokenize(sentences[i])
43
+ # statement=""
44
+ # for token in tokens:
45
+ # statement+=" ".join(token)
46
+ # sentences[i]=statement
47
+ def sentences_segment(sentences):
48
+ for i in range(len(sentences)):
49
+ # word_tokenize trả về chuỗi các từ cách nhau bằng dấu space
50
+ sentences[i] = word_tokenize(sentences[i], format="text")
51
+
52
+ #Mã hóa các câu thành Token ID và pad chuỗi về độ dài maxlen
53
+ phobert=AutoModel.from_pretrained('vinai/phobert-base')
54
+ tokenizer=AutoTokenizer.from_pretrained('vinai/phobert-base')
55
+ def shuffle_and_tokenize(sentences,labels,maxlen):
56
+ sentences,labels=shuffle(sentences,labels)
57
+ sequences=[tokenizer.encode(i) for i in sentences]
58
+ labels=[int(i) for i in labels]
59
+ padded=pad_sequences(sequences, maxlen=maxlen, padding="pre")
60
+ return padded, labels
61
+
62
+ def check_maxlen(sentences):
63
+ sentences_len=[len(i.split()) for i in sentences]
64
+ return max(sentences_len)
65
+
66
+
67
+ #Chia dữ liệu huấn luyện/val/test
68
+ def split_data(padded, labels):
69
+ padded=torch.tensor(padded)
70
+ labels=torch.tensor(labels)
71
+ X_train,X_,y_train,y_=train_test_split(padded, labels,random_state=2018, train_size=0.8, stratify=labels)
72
+ X_val,X_test, y_val, y_test=train_test_split(X_, y_, random_state=2018, train_size=0.5, stratify=y_)
73
+ return X_train,X_val,X_test, y_train,y_val, y_test
74
+
75
+
76
+ #Tạo DataLoader
77
+ def Data_Loader(X_train,X_val,y_train,y_val):
78
+ train_data=TensorDataset(X_train,y_train)
79
+ train_sampler=RandomSampler(train_data)
80
+ train_dataloader=DataLoader(train_data, sampler=train_sampler,batch_size=2)
81
+ val_data=TensorDataset(X_val,y_val)
82
+ val_sampler=RandomSampler(val_data)
83
+ val_dataloader=DataLoader(val_data, sampler=val_sampler,batch_size=2)
84
+ return train_dataloader, val_dataloader
85
+
86
+ # Chuẩn bị dữ liệu (chỉ chạy 1 lần ở train_model.py)
87
+ sentences,labels=get_data(['toxic_dataset.json','normal_dataset.json'])
88
+ sentences_segment(sentences)
89
+ padded,labels=shuffle_and_tokenize(sentences,labels,check_maxlen(sentences))
90
+ X_train,X_val,X_test, y_train,y_val, y_test=split_data(padded, labels)
91
+ train_dataloader, val_dataloader=Data_Loader(X_train,X_val,y_train,y_val)
92
+
93
+ # Freeze PhoBERT để không train lại
94
+ for param in phobert.parameters():
95
+ param.requires_grad=False
96
+
97
+ class classify(nn.Module):
98
+ def __init__(self, phobert, number_of_category):
99
+ super(classify,self).__init__()
100
+ self.phobert=phobert
101
+ self.relu=nn.ReLU()
102
+ self.dropout=nn.Dropout(0.1)
103
+ self.first_function=nn.Linear(768, 512)
104
+ self.second_function=nn.Linear(512, 32)
105
+ self.third_function=nn.Linear(32,number_of_category)
106
+ self.softmax=nn.LogSoftmax(dim=1)
107
+
108
+ def forward(self, input):
109
+ x=self.phobert(input)
110
+ x=self.first_function(x[1])
111
+ x=self.relu(x)
112
+ x=self.dropout(x)
113
+ x=self.second_function(x)
114
+ x=self.relu(x)
115
+ x=self.third_function(x)
116
+ x=self.softmax(x)
117
+ return x
118
+
119
+ cross_entropy=nn.NLLLoss()
120
+ model=classify(phobert,2)
121
+ optimizer=AdamW(model.parameters(),lr=1e-5)
122
+
123
+ #Train / Evaluate
124
+ def train():
125
+ model.train()
126
+ total_loss=0
127
+ total_preds=[]
128
+ for step , batch in enumerate(train_dataloader):
129
+ if step%50==0 and step!=0:
130
+ print("BATCH {} of {}".format(step, len(train_dataloader)))
131
+
132
+ input,labels=batch
133
+ model.zero_grad()
134
+ preds=model(input)
135
+ loss=cross_entropy(preds, labels)
136
+ total_loss+=loss.item()
137
+ loss.backward()
138
+ torch.nn.utils.clip_grad_norm_(model.parameters(), 1.0)
139
+ optimizer.step()
140
+ preds=preds.detach().cpu().numpy()
141
+ total_preds.append(preds)
142
+ avg_loss=total_loss/len(train_dataloader)
143
+ total_preds=np.concatenate(total_preds,axis=0)
144
+ return avg_loss, total_preds
145
+
146
+ def evaluate():
147
+ model.eval()
148
+ total_loss=0
149
+ total_preds=[]
150
+ for step, batch in enumerate(val_dataloader):
151
+ if step%50==0 and step!=0:
152
+ print("BATCH {} of {}".format(step, len(val_dataloader)))
153
+ input,labels=batch
154
+ with torch.no_grad():
155
+ preds=model(input)
156
+ loss=cross_entropy(preds, labels)
157
+ total_loss+=loss.item()
158
+ preds=preds.detach().cpu().numpy()
159
+ total_preds.append(preds)
160
+ avg_loss=total_loss/len(val_dataloader)
161
+ total_preds=np.concatenate(total_preds,axis=0)
162
+ return avg_loss, total_preds
163
+
164
+
165
+ #Huấn luyện toàn bộ
166
+ def run(epochs):
167
+ best_valid_loss=float("inf")
168
+ train_losses=[]
169
+ valid_losses=[]
170
+ for epoch in range(epochs):
171
+ print("EPOCH {}/{}".format(epoch+1, epochs))
172
+ train_loss,_ =train()
173
+ valid_loss,_ =evaluate()
174
+ if valid_loss < best_valid_loss:
175
+ best_valid_loss = valid_loss
176
+ torch.save(model.state_dict(),"save_weights.pt")
177
+ train_losses.append(train_loss)
178
+ valid_losses.append(valid_loss)
179
+ print(f"Train Loss: {train_loss}, Val Loss: {valid_loss}")
180
+ #print(f"Train Loss: {train_loss:.4f}, Val Loss: {valid_loss:.4f}")
181
+ # print(train_loss)
182
+ # print(valid_loss)
183
+
184
+ if __name__ == "__main__":
185
+ print("Module classify_model.py đã được load. Không chạy trực tiếp.")
normal_dataset.json ADDED
@@ -0,0 +1,564 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [
2
+ {
3
+ "sentences": "đồng hồ đẹp quá, đúng gu của mình luôn",
4
+ "toxic": "0"
5
+ },
6
+ {
7
+ "sentences": "giao hàng nhanh, sản phẩm như mô tả",
8
+ "toxic": "0"
9
+ },
10
+ {
11
+ "sentences": "mình đã mua tặng bố, rất ưng ý",
12
+ "toxic": "0"
13
+ },
14
+ {
15
+ "sentences": "bài viết rất hay, giúp mình hiểu rõ hơn về cách chọn đồng hồ",
16
+ "toxic": "0"
17
+ },
18
+ {
19
+ "sentences": "mình thích kiểu dáng này, sang trọng và tinh tế",
20
+ "toxic": "0"
21
+ },
22
+ {
23
+ "sentences": "dịch vụ chăm sóc khách hàng tốt, nhân viên tư vấn nhiệt tình",
24
+ "toxic": "0"
25
+ },
26
+ {
27
+ "sentences": "bài blog chia sẻ kiến thức rất bổ ích",
28
+ "toxic": "0"
29
+ },
30
+ {
31
+ "sentences": "đồng hồ lên tay nhẹ, đeo cả ngày không mỏi",
32
+ "toxic": "0"
33
+ },
34
+ {
35
+ "sentences": "sản phẩm có hộp đựng chắc chắn, sang xịn",
36
+ "toxic": "0"
37
+ },
38
+ {
39
+ "sentences": "web load nhanh, dễ tìm kiếm sản phẩm",
40
+ "toxic": "0"
41
+ },
42
+ {
43
+ "sentences": "thiết kế website đẹp mắt, dễ dùng trên điện thoại",
44
+ "toxic": "0"
45
+ },
46
+ {
47
+ "sentences": "giá cả hợp lý với chất lượng sản phẩm",
48
+ "toxic": "0"
49
+ },
50
+ {
51
+ "sentences": "mình đã giới thiệu cho bạn bè vì thấy đáng tiền",
52
+ "toxic": "0"
53
+ },
54
+ {
55
+ "sentences": "bài chia sẻ rõ ràng, hình ảnh minh hoạ dễ hiểu",
56
+ "toxic": "0"
57
+ },
58
+ {
59
+ "sentences": "cảm ơn shop đã hỗ trợ đổi size dây nhanh chóng",
60
+ "toxic": "0"
61
+ },
62
+ {
63
+ "sentences": "đã mua lần thứ 2 ở đây, vẫn rất hài lòng",
64
+ "toxic": "0"
65
+ },
66
+ {
67
+ "sentences": "blog cập nhật xu hướng đồng hồ liên tục, mình thích điều này",
68
+ "toxic": "0"
69
+ },
70
+ {
71
+ "sentences": "đồng hồ phù hợp để đeo đi làm lẫn đi chơi",
72
+ "toxic": "0"
73
+ },
74
+ {
75
+ "sentences": "màu sắc giống hình, không bị lệch màu",
76
+ "toxic": "0"
77
+ },
78
+ {
79
+ "sentences": "mình tìm được mẫu đồng hồ yêu thích nhờ bài viết này",
80
+ "toxic": "0"
81
+ },
82
+ {
83
+ "sentences": "Đồng hồ chạy rất êm, pin trâu dùng được lâu",
84
+ "toxic": "0"
85
+ },
86
+ {
87
+ "sentences": "Shop đóng gói cẩn thận, hộp không bị méo mó gì cả",
88
+ "toxic": "0"
89
+ },
90
+ {
91
+ "sentences": "Mặt đồng hồ sáng bóng, nhìn rõ số dưới ánh sáng yếu",
92
+ "toxic": "0"
93
+ },
94
+ {
95
+ "sentences": "Dây da mềm, không bị cấn hay ngứa khi đeo",
96
+ "toxic": "0"
97
+ },
98
+ {
99
+ "sentences": "Nhận được quà tặng kèm từ shop, bất ngờ và vui lắm ạ",
100
+ "toxic": "0"
101
+ },
102
+ {
103
+ "sentences": "Kiểu dáng unisex, cả nam lẫn nữ đeo đều đẹp",
104
+ "toxic": "0"
105
+ },
106
+ {
107
+ "sentences": "Chính sách bảo hành rõ ràng, yên tâm khi mua",
108
+ "toxic": "0"
109
+ },
110
+ {
111
+ "sentences": "Mẫu mã đa dạng, tha hồ lựa chọn theo sở thích",
112
+ "toxic": "0"
113
+ },
114
+ {
115
+ "sentences": "Nhân viên gọi điện xác nhận đơn hàng rất chuyên nghiệp",
116
+ "toxic": "0"
117
+ },
118
+ {
119
+ "sentences": "Đồng hồ nhỏ gọn nhưng hiển thị đầy đủ thông tin cần thiết",
120
+ "toxic": "0"
121
+ },
122
+ {
123
+ "sentences": "Chất liệu chống xước tốt, dùng 2 tháng vẫn như mới",
124
+ "toxic": "0"
125
+ },
126
+ {
127
+ "sentences": "Bấm giờ thể thao chính xác, phù hợp cho người tập gym",
128
+ "toxic": "0"
129
+ },
130
+ {
131
+ "sentences": "Lần đầu mua đồng hồ online mà trải nghiệm suôn sẻ",
132
+ "toxic": "0"
133
+ },
134
+ {
135
+ "sentences": "Video review sản phẩm chi tiết giúp mình quyết định nhanh hơn",
136
+ "toxic": "0"
137
+ },
138
+ {
139
+ "sentences": "Chế độ hậu mãi tốt, được nhắc thay pin miễn phí",
140
+ "toxic": "0"
141
+ },
142
+ {
143
+ "sentences": "Thiết kế độc đáo, đi đâu cũng được khen",
144
+ "toxic": "0"
145
+ },
146
+ {
147
+ "sentences": "Đèn nền đồng hồ sáng rõ, xem giờ ban đêm dễ dàng",
148
+ "toxic": "0"
149
+ },
150
+ {
151
+ "sentences": "Chống nước tốt, đi mưa nhỏ không lo hỏng",
152
+ "toxic": "0"
153
+ },
154
+ {
155
+ "sentences": "Phụ kiện đi kèm đầy đủ từ khăn lau đến hướng dẫn sử dụng",
156
+ "toxic": "0"
157
+ },
158
+ {
159
+ "sentences": "Màu đồng hồ dễ phối đồ, mặc áo gì cũng hợp",
160
+ "toxic": "0"
161
+ },
162
+ {
163
+ "sentences": "Cảm ơn shop đã tư vấn size dây vừa vặn với cổ tay mình",
164
+ "toxic": "0"
165
+ },
166
+ {
167
+ "sentences": "Đồng hồ nhẹ hơn mình tưởng, đeo rất thoải mái",
168
+ "toxic": "0"
169
+ },
170
+ {
171
+ "sentences": "Giao hàng đúng hẹn, shipper thân thiện",
172
+ "toxic": "0"
173
+ },
174
+ {
175
+ "sentences": "Đã mua 3 cái ở đây làm quà tặng đều được đánh giá cao",
176
+ "toxic": "0"
177
+ },
178
+ {
179
+ "sentences": "Chức năng đếm bước chân hoạt động chính xác",
180
+ "toxic": "0"
181
+ },
182
+ {
183
+ "sentences": "Mặt kính cứng cáp, va chạm nhẹ không bị trầy",
184
+ "toxic": "0"
185
+ },
186
+ {
187
+ "sentences": "Hướng dẫn sử dụng bằng tiếng Việt rất dễ hiểu",
188
+ "toxic": "0"
189
+ },
190
+ {
191
+ "sentences": "Thích nhất là chế độ báo thức êm ái không gây giật mình",
192
+ "toxic": "0"
193
+ },
194
+ {
195
+ "sentences": "Đồng hồ kết nối bluetooth ổn định với điện thoại",
196
+ "toxic": "0"
197
+ },
198
+ {
199
+ "sentences": "Mua trúng đợt khuyến mãi nên giá rất tốt",
200
+ "toxic": "0"
201
+ },
202
+ {
203
+ "sentences": "Nhân viên tư vấn rất am hiểu, giúp mình chọn được mẫu đồng hồ ưng ý",
204
+ "toxic": "0"
205
+ },
206
+ {
207
+ "sentences": "Bạn tư vấn viên tên Linh rất dễ thương, hỗ trợ mình từ A-Z",
208
+ "toxic": "0"
209
+ },
210
+ {
211
+ "sentences": "Mình hỏi đêm mà nhân viên vẫn trả lời nhanh, nhiệt tình quá!",
212
+ "toxic": "0"
213
+ },
214
+ {
215
+ "sentences": "Tư vấn đúng nhu cầu, không ép mua hàng đắt tiền",
216
+ "toxic": "0"
217
+ },
218
+ {
219
+ "sentences": "Nhân viên gọi điện tư vấn kỹ về chế độ bảo hành trước khi mua",
220
+ "toxic": "0"
221
+ },
222
+ {
223
+ "sentences": "Rất cảm ơn bạn tư vấn đã giúp mình đổi size dây nhanh chóng",
224
+ "toxic": "0"
225
+ },
226
+ {
227
+ "sentences": "Nhân viên tư vấn rõ ràng, không lan man, đúng trọng tâm mình cần",
228
+ "toxic": "0"
229
+ },
230
+ {
231
+ "sentences": "Mình được tư vấn kỹ về cách sử dụng đồng hồ thông minh, rất hữu ích",
232
+ "toxic": "0"
233
+ },
234
+ {
235
+ "sentences": "Nhân viên còn gửi thêm video hướng dẫn sử dụng qua Zalo, quá chu đáo!",
236
+ "toxic": "0"
237
+ },
238
+ {
239
+ "sentences": "Tư vấn viên biết cách phối đồng hồ theo phong cách, mình rất thích",
240
+ "toxic": "0"
241
+ },
242
+ {
243
+ "sentences": "Đặt sáng nhận chiều, nhanh hơn cả mong đợi!",
244
+ "toxic": "0"
245
+ },
246
+ {
247
+ "sentences": "Giao hàng tốc độ, shipper thân thiện, đóng gói kỹ càng",
248
+ "toxic": "0"
249
+ },
250
+ {
251
+ "sentences": "Mới đặt hôm qua trưa, sáng nay đã nhận được rồi",
252
+ "toxic": "0"
253
+ },
254
+ {
255
+ "sentences": "Hộp đồng hồ được bọc xốp kín, không một vết trầy xước",
256
+ "toxic": "0"
257
+ },
258
+ {
259
+ "sentences": "Dù ở xa nhưng shop giao cực nhanh, chỉ 2 ngày đã nhận hàng",
260
+ "toxic": "0"
261
+ },
262
+ {
263
+ "sentences": "Shipper gọi điện trước khi giao, đúng giờ hẹn",
264
+ "toxic": "0"
265
+ },
266
+ {
267
+ "sentences": "Đóng gói chắc chắn, có cả tem chống hàng giả",
268
+ "toxic": "0"
269
+ },
270
+ {
271
+ "sentences": "Free ship mà vẫn giao nhanh, quá đã!",
272
+ "toxic": "0"
273
+ },
274
+ {
275
+ "sentences": "Nhận hàng đúng ngày sinh nhật, cảm ơn shop nhiều!",
276
+ "toxic": "0"
277
+ },
278
+ {
279
+ "sentences": "Giao hàng nhanh đến mức mình không kịp mong ngóng",
280
+ "toxic": "0"
281
+ },
282
+ {
283
+ "sentences": "Web load nhanh như chớp, lướt không bị giật",
284
+ "toxic": "0"
285
+ },
286
+ {
287
+ "sentences": "Giao diện đẹp, bố cục rõ ràng, dễ tìm sản phẩm",
288
+ "toxic": "0"
289
+ },
290
+ {
291
+ "sentences": "Thanh toán một lần là xong, không bị lỗi như nhiều web khác",
292
+ "toxic": "0"
293
+ },
294
+ {
295
+ "sentences": "Tìm kiếm thông minh, gõ vài chữ đã ra đúng mẫu mình cần",
296
+ "toxic": "0"
297
+ },
298
+ {
299
+ "sentences": "Có chế độ xem ảnh 360 độ, nhìn đồng hồ rất rõ nét",
300
+ "toxic": "0"
301
+ },
302
+ {
303
+ "sentences": "Web hiển thị tốt trên cả điện thoại, không bị vỡ giao diện",
304
+ "toxic": "0"
305
+ },
306
+ {
307
+ "sentences": "Có bộ lọc theo giá, màu sắc, thương hiệu rất tiện",
308
+ "toxic": "0"
309
+ },
310
+ {
311
+ "sentences": "Thông báo giảm giá hiển thị rõ ràng, không bị pop-up quảng cáo rác",
312
+ "toxic": "0"
313
+ },
314
+ {
315
+ "sentences": "Có section 'Sản phẩm đã xem' giúp mình so sánh dễ dàng",
316
+ "toxic": "0"
317
+ },
318
+ {
319
+ "sentences": "Web còn có chế độ ban đêm, đỡ hại mắt khi mua hàng đêm khuya",
320
+ "toxic": "0"
321
+ },
322
+ {
323
+ "sentences": "Bài viết so sánh đồng hồ nam và nữ giúp mình chọn quà dễ dàng",
324
+ "toxic": "0"
325
+ },
326
+ {
327
+ "sentences": "Hướng dẫn phân biệt đồng hồ chính hãng rất chi tiết, cảm ơn tác giả!",
328
+ "toxic": "0"
329
+ },
330
+ {
331
+ "sentences": "Mình đọc xong bài '5 tiêu chí chọn đồng hồ đi làm' và quyết định mua luôn",
332
+ "toxic": "0"
333
+ },
334
+ {
335
+ "sentences": "Blog cập nhật xu hướng đồng hồ 2024 hay quá, mình bookmark ngay",
336
+ "toxic": "0"
337
+ },
338
+ {
339
+ "sentences": "Bài review đồng hồ thể thao có video minh họa rất trực quan",
340
+ "toxic": "0"
341
+ },
342
+ {
343
+ "sentences": "Đọc xong bài 'Cách bảo quản đồng hồ da' mới biết mình từng sai lầm",
344
+ "toxic": "0"
345
+ },
346
+ {
347
+ "sentences": "Tác gi�� viết dễ hiểu, không dùng từ ngữ quá chuyên môn",
348
+ "toxic": "0"
349
+ },
350
+ {
351
+ "sentences": "Mỗi bài đều có phần FAQ giải đáp thắc mắc, rất thiết thực",
352
+ "toxic": "0"
353
+ },
354
+ {
355
+ "sentences": "Bài viết có link dẫn đến sản phẩm liên quan, tiện cho người đọc",
356
+ "toxic": "0"
357
+ },
358
+ {
359
+ "sentences": "Blog còn chia sẻ phong thủy đeo đồng hồ theo tuổi, thú vị ghê!",
360
+ "toxic": "0"
361
+ },
362
+ {
363
+ "sentences": "Được bảo hành miễn phí thêm 6 tháng so với cam kết",
364
+ "toxic": "0"
365
+ },
366
+ {
367
+ "sentences": "Shop gửi email nhắc lịch bảo dưỡng đồng hồ định kỳ",
368
+ "toxic": "0"
369
+ },
370
+ {
371
+ "sentences": "Đổi trả dễ dàng trong 7 ngày, không hỏi nhiều lý do",
372
+ "toxic": "0"
373
+ },
374
+ {
375
+ "sentences": "Mua 1 lần được tặng voucher 10% cho lần sau",
376
+ "toxic": "0"
377
+ },
378
+ {
379
+ "sentences": "Chính sách tích điểm đổi quà hấp dẫn, mình đã đổi được túi xách",
380
+ "toxic": "0"
381
+ },
382
+ {
383
+ "sentences": "Đang đợt sale lớn, mua 1 được giảm thêm 20% nữa, hời quá!",
384
+ "toxic": "0"
385
+ },
386
+ {
387
+ "sentences": "Giá sale chỉ bằng nửa giá gốc, chất lượng vẫn đỉnh",
388
+ "toxic": "0"
389
+ },
390
+ {
391
+ "sentences": "Mua đồng hồ cao cấp mà được giảm tận 3 triệu, đúng là trúng quà",
392
+ "toxic": "0"
393
+ },
394
+ {
395
+ "sentences": "Flash sale 12h toàn sản phẩm hot, tranh thủ mua liền tay",
396
+ "toxic": "0"
397
+ },
398
+ {
399
+ "sentences": "Khuyến mãi cuối năm, đồng hồ đẹp mà giá chỉ từ 500k",
400
+ "toxic": "0"
401
+ },
402
+ {
403
+ "sentences": "Mua 2 tặng 1, tha hồ mix đồng hồ đi làm và đi chơi",
404
+ "toxic": "0"
405
+ },
406
+ {
407
+ "sentences": "Được tặng kèm dây đeo silicon xịn khi mua đồng hồ thông minh",
408
+ "toxic": "0"
409
+ },
410
+ {
411
+ "sentences": "Giảm giá 50% cho sinh viên, chỉ cần show thẻ là được ưu đãi",
412
+ "toxic": "0"
413
+ },
414
+ {
415
+ "sentences": "Sale đồng hồ nữ dịp 8/3, mua ngay kẻo hết",
416
+ "toxic": "0"
417
+ },
418
+ {
419
+ "sentences": "Mua combo 2 đồng hồ được free ship toàn quốc",
420
+ "toxic": "0"
421
+ },
422
+ {
423
+ "sentences": "Được tặng thêm hộp đựng sang xịn trị giá 500k",
424
+ "toxic": "0"
425
+ },
426
+ {
427
+ "sentences": "Quà tặng là bộ vệ sinh đồng hồ, dùng rất tiện",
428
+ "toxic": "0"
429
+ },
430
+ {
431
+ "sentences": "Mua đồng hồ trên 5 triệu được tặng thêm 1 năm bảo hành",
432
+ "toxic": "0"
433
+ },
434
+ {
435
+ "sentences": "Tặng kèm bảo hiểm rơi vỡ trong 6 tháng, yên tâm hẳn",
436
+ "toxic": "0"
437
+ },
438
+ {
439
+ "sentences": "Nhận được voucher 300k cho lần mua tiếp theo",
440
+ "toxic": "0"
441
+ },
442
+ {
443
+ "sentences": "Tặng thêm 2 dây đeo màu khác nhau, tha hồ phối đồ",
444
+ "toxic": "0"
445
+ },
446
+ {
447
+ "sentences": "Quà sinh nhật là phiếu giảm giá 15%, mừng quá!",
448
+ "toxic": "0"
449
+ },
450
+ {
451
+ "sentences": "Được tặng kèm sổ tay hướng dẫn sử dụng chi tiết",
452
+ "toxic": "0"
453
+ },
454
+ {
455
+ "sentences": "Mua hàng trúng thẻ cào 100k, may mắn quá!",
456
+ "toxic": "0"
457
+ },
458
+ {
459
+ "sentences": "Tặng miễn phí khắc tên lên đồng hồ, độc quyền luôn",
460
+ "toxic": "0"
461
+ },
462
+
463
+ {
464
+ "sentences": "Sale Black Friday, đồng hồ Thụy Sĩ giảm sốc 50%",
465
+ "toxic": "0"
466
+ },
467
+ {
468
+ "sentences": "Dịp Tết được tặng thêm lì xì may mắn trị giá 200k",
469
+ "toxic": "0"
470
+ },
471
+ {
472
+ "sentences": "Khuyến mãi 20/10, mua 1 tặng 1 cho chị em phụ nữ",
473
+ "toxic": "0"
474
+ },
475
+ {
476
+ "sentences": "Giảm giá 30% toàn bộ sản phẩm nhân ngày thành lập shop",
477
+ "toxic": "0"
478
+ },
479
+ {
480
+ "sentences": "Mua đồng hồ đôi được giảm thêm 15% dịp Valentine",
481
+ "toxic": "0"
482
+ },
483
+ {
484
+ "sentences": "Ưu đãi back to school, sinh viên được giảm thêm 10%",
485
+ "toxic": "0"
486
+ },
487
+ {
488
+ "sentences": "Sale cuối năm, xả kho giá rẻ bất ngờ",
489
+ "toxic": "0"
490
+ },
491
+ {
492
+ "sentences": "Tri ân khách hàng, tặng voucher 500k cho đơn từ 3 triệu",
493
+ "toxic": "0"
494
+ },
495
+ {
496
+ "sentences": "Ngày Singles’ Day 11/11, giảm giá đến 60%",
497
+ "toxic": "0"
498
+ },
499
+ {
500
+ "sentences": "Mừng khai trương, free ship cho mọi đơn hàng",
501
+ "toxic": "0"
502
+ },
503
+ {
504
+ "sentences": "Đăng ký nhận thông báo sale sớm để không bỏ lỡ deal hot",
505
+ "toxic": "0"
506
+ },
507
+ {
508
+ "sentences": "Mua vào giờ vàng được giảm thêm 10% nữa đấy!",
509
+ "toxic": "0"
510
+ },
511
+ {
512
+ "sentences": "Kết hợp mã giảm giá và tích điểm để tiết kiệm tối đa",
513
+ "toxic": "0"
514
+ },
515
+ {
516
+ "sentences": "Theo dõi fanpage shop để nhận mã giảm giá hàng tuần",
517
+ "toxic": "0"
518
+ },
519
+ {
520
+ "sentences": "Mua hàng trả góp 0% qua thẻ tín dụng, nhẹ ví hẳn",
521
+ "toxic": "0"
522
+ },
523
+ {
524
+ "sentences": "Tích 5 điểm được giảm 1 triệu, mình đã đổi thành công",
525
+ "toxic": "0"
526
+ },
527
+ {
528
+ "sentences": "Thành viên VIP được ưu tiên giữ hàng trước khi sale",
529
+ "toxic": "0"
530
+ },
531
+ {
532
+ "sentences": "Mua hàng tích điểm đổi quà, năm nay đổi được balo xịn",
533
+ "toxic": "0"
534
+ },
535
+ {
536
+ "sentences": "Chương trình Vip member giảm thêm 10% mọi đơn hàng",
537
+ "toxic": "0"
538
+ },
539
+ {
540
+ "sentences": "Được tặng điểm thưởng gấp đôi vào ngày sinh nhật",
541
+ "toxic": "0"
542
+ },
543
+ {
544
+ "sentences": "Tích luỹ 10 triệu được nâng cấp lên thẻ Platinum",
545
+ "toxic": "0"
546
+ },
547
+ {
548
+ "sentences": "Ưu đãi đặc biệt cho khách hàng thân thiết mỗi tháng",
549
+ "toxic": "0"
550
+ },
551
+ {
552
+ "sentences": "Nhận được email ưu đãi riêng vì là khách quen",
553
+ "toxic": "0"
554
+ },
555
+ {
556
+ "sentences": "Điểm tích lũy không bị mất sau 1 năm như nhiều shop khác",
557
+ "toxic": "0"
558
+ },
559
+ {
560
+ "sentences": "Mỗi lần mua hàng đều được cộng thêm điểm vào tài khoản",
561
+ "toxic": "0"
562
+ }
563
+
564
+ ]
requirements.txt ADDED
@@ -0,0 +1,11 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
+ numpy==1.23.5
2
+ pandas==1.5.3
3
+ torch==2.7.0
4
+ transformers==4.52.4
5
+ keras==2.15.0
6
+ # vncorenlp==1.0.3
7
+ scikit-learn==1.6.1
8
+ Flask==3.1.1
9
+ gdown==5.1.0
10
+ tensorflow-cpu==2.15.0
11
+ underthesea==6.6.0
toxic_dataset.json ADDED
@@ -0,0 +1,666 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [
2
+ {
3
+ "sentences": "đồng hồ gì mà nhìn như đồ chợ, quá thất vọng",
4
+ "toxic": "1"
5
+ },
6
+ {
7
+ "sentences": "mua cái đồng hồ này phí tiền thật sự",
8
+ "toxic": "1"
9
+ },
10
+ {
11
+ "sentences": "viết blog mà như spam, chẳng có tí thông tin hữu ích nào",
12
+ "toxic": "1"
13
+ },
14
+ {
15
+ "sentences": "web lag kinh khủng, bấm hoài không ra sản phẩm",
16
+ "toxic": "1"
17
+ },
18
+ {
19
+ "sentences": "giao hàng chậm như rùa, không hiểu làm ăn kiểu gì",
20
+ "toxic": "1"
21
+ },
22
+ {
23
+ "sentences": "tư vấn kiểu qua loa, hỏi gì cũng không biết",
24
+ "toxic": "1"
25
+ },
26
+ {
27
+ "sentences": "đồng hồ nhìn ngoài khác xa hình, như bị lừa",
28
+ "toxic": "1"
29
+ },
30
+ {
31
+ "sentences": "đồng hồ fake mà dám bán giá thật, quá tệ",
32
+ "toxic": "1"
33
+ },
34
+ {
35
+ "sentences": "blog viết như học sinh lớp 1, lỗi chính tả đầy ra",
36
+ "toxic": "1"
37
+ },
38
+ {
39
+ "sentences": "shop này bán đồ như lừa đảo vậy, mua xong im re",
40
+ "toxic": "1"
41
+ },
42
+ {
43
+ "sentences": "dịch vụ tệ chưa từng thấy, gọi không nghe, nhắn không trả lời",
44
+ "toxic": "1"
45
+ },
46
+ {
47
+ "sentences": "bài viết lan man nhảm nhí, đọc mất thời gian",
48
+ "toxic": "1"
49
+ },
50
+ {
51
+ "sentences": "khách hàng bị đối xử như rác, quá chán",
52
+ "toxic": "1"
53
+ },
54
+ {
55
+ "sentences": "đồng hồ kiểu gì mới đeo 1 tuần đã tróc sơn",
56
+ "toxic": "1"
57
+ },
58
+ {
59
+ "sentences": "nhìn hình thì sang, nhận về như đồ chơi trẻ con",
60
+ "toxic": "1"
61
+ },
62
+ {
63
+ "sentences": "mua hàng kiểu này chỉ muốn chửi",
64
+ "toxic": "1"
65
+ },
66
+ {
67
+ "sentences": "blog toàn chém gió, thông tin sai lệch",
68
+ "toxic": "1"
69
+ },
70
+ {
71
+ "sentences": "đừng có tin vào mấy cái review ảo này",
72
+ "toxic": "1"
73
+ },
74
+ {
75
+ "sentences": "hàng lỗi mà không chịu đổi, quá coi thường khách",
76
+ "toxic": "1"
77
+ },
78
+ {
79
+ "sentences": "xem xong blog chỉ muốn tắt tab, tệ thật sự",
80
+ "toxic": "1"
81
+ },
82
+ {
83
+ "sentences": "shop bán hàng như cặc, tư vấn ngu như bò",
84
+ "toxic": "1"
85
+ },
86
+ {
87
+ "sentences": "địt mẹ cái đồng hồ, chưa gì đã hỏng",
88
+ "toxic": "1"
89
+ },
90
+ {
91
+ "sentences": "viết blog như cứt, đọc mà tức vãi lồn",
92
+ "toxic": "1"
93
+ },
94
+ {
95
+ "sentences": "giao hàng kiểu lồn gì vậy, 10 ngày chưa tới",
96
+ "toxic": "1"
97
+ },
98
+ {
99
+ "sentences": "mẹ nó chứ, mất tiền ngu mua cái đồng hồ lởm",
100
+ "toxic": "1"
101
+ },
102
+ {
103
+ "sentences": "sản phẩm như lồn, dịch vụ còn như chó",
104
+ "toxic": "1"
105
+ },
106
+ {
107
+ "sentences": "bọn này lừa đảo, mua 1 lần không bao giờ quay lại",
108
+ "toxic": "1"
109
+ },
110
+ {
111
+ "sentences": "cút mẹ đi, tư vấn kiểu này thì bán cho ai",
112
+ "toxic": "1"
113
+ },
114
+ {
115
+ "sentences": "chửi tụi mày là còn nhẹ, làm ăn như cc",
116
+ "toxic": "1"
117
+ },
118
+ {
119
+ "sentences": "mua cái đồng hồ như cái đồ chơi rẻ tiền, bực mình vãi",
120
+ "toxic": "1"
121
+ },
122
+ {
123
+ "sentences": "đồng hồ rẻ mạt như đồ nhựa, xứng đáng 1 sao",
124
+ "toxic": "1"
125
+ },
126
+ {
127
+ "sentences": "shop toàn lừa đảo, đổi trả khó hơn lên trời",
128
+ "toxic": "1"
129
+ },
130
+ {
131
+ "sentences": "não chó à? Giao hàng sai mà còn cãi",
132
+ "toxic": "1"
133
+ },
134
+ {
135
+ "sentences": "web như cứt, load 10 phút không xong",
136
+ "toxic": "1"
137
+ },
138
+ {
139
+ "sentences": "nhân viên vô học, trả lời như đang khinh khách",
140
+ "toxic": "1"
141
+ },
142
+ {
143
+ "sentences": "đồng hồ đeo 2 ngày chết pin, hàng lậu chắc?",
144
+ "toxic": "1"
145
+ },
146
+ {
147
+ "sentences": "mua xong mới biết bị lừa, đúng là lũ rác rưởi",
148
+ "toxic": "1"
149
+ },
150
+ {
151
+ "sentences": "chính sách đổi trả như cái quần què",
152
+ "toxic": "1"
153
+ },
154
+ {
155
+ "sentences": "tưởng uy tín ai ngờ toàn review mua",
156
+ "toxic": "1"
157
+ },
158
+ {
159
+ "sentences": "khuyến mãi lừa đảo, tính giá cắt cổ",
160
+ "toxic": "1"
161
+ },
162
+ {
163
+ "sentences": "đm cái thằng tư vấn, nói dối trắng trợn",
164
+ "toxic": "1"
165
+ },
166
+ {
167
+ "sentences": "hàng Trung Quốc dán mác Thụy Sĩ, đồ đểu!",
168
+ "toxic": "1"
169
+ },
170
+ {
171
+ "sentences": "bịp bợm từ A-Z, tố cáo cho chết shop",
172
+ "toxic": "1"
173
+ },
174
+ {
175
+ "sentences": "không biết xấu hổ là gì à? Bán đồ rác!",
176
+ "toxic": "1"
177
+ },
178
+ {
179
+ "sentences": "đóng gói cẩu thả, nhận hàng như đồ bỏ",
180
+ "toxic": "1"
181
+ },
182
+ {
183
+ "sentences": "tiền mất tật mang, đúng là lũ lừa đảo",
184
+ "toxic": "1"
185
+ },
186
+ {
187
+ "sentences": "chụp hình thì đẹp, hàng thực tế như ve chai",
188
+ "toxic": "1"
189
+ },
190
+ {
191
+ "sentences": "thà đốt tiền còn hơn mua đồ ở đây",
192
+ "toxic": "1"
193
+ },
194
+ {
195
+ "sentences": "không biết ngu hay cố tình lừa khách",
196
+ "toxic": "1"
197
+ },
198
+ {
199
+ "sentences": "cảm ơn shop đã cho tôi bài học đắt giá",
200
+ "toxic": "1"
201
+ },
202
+ {
203
+ "sentences": "đồng hồ chạy sai số, bảo hành như đùa",
204
+ "toxic": "1"
205
+ },
206
+ {
207
+ "sentences": "shop toàn thớt, khách sập bẫy xong block luôn",
208
+ "toxic": "1"
209
+ },
210
+ {
211
+ "sentences": "đm đồ rởm, tiền triệu mà như đồng hồ trẻ em",
212
+ "toxic": "1"
213
+ },
214
+ {
215
+ "sentences": "không biết xấu hổ khi bán đồ kém chất lượng",
216
+ "toxic": "1"
217
+ },
218
+ {
219
+ "sentences": "từng chữ trong blog toàn là nói dối",
220
+ "toxic": "1"
221
+ },
222
+ {
223
+ "sentences": "óc chó à? Bán đồ fake mà đòi giá chính hãng",
224
+ "toxic": "1"
225
+ },
226
+ {
227
+ "sentences": "shop này toàn lũ ăn cắp tiền thiên hạ",
228
+ "toxic": "1"
229
+ },
230
+ {
231
+ "sentences": "đm đồ rác rưởi, vứt đi còn thấy phí chỗ",
232
+ "toxic": "1"
233
+ },
234
+ {
235
+ "sentences": "nhân viên tư vấn ngu như con lợn",
236
+ "toxic": "1"
237
+ },
238
+ {
239
+ "sentences": "mua hàng xong mới biết não mình có vấn đề",
240
+ "toxic": "1"
241
+ },
242
+ {
243
+ "sentences": "web như shit, vừa vào đã muốn nổ máy tính",
244
+ "toxic": "1"
245
+ },
246
+ {
247
+ "sentences": "địt mẹ thằng CEO, đào tạo nhân viên như cứt",
248
+ "toxic": "1"
249
+ },
250
+ {
251
+ "sentences": "hàng nhái mà bày đặt sang chảnh",
252
+ "toxic": "1"
253
+ },
254
+ {
255
+ "sentences": "cái blog viết như cái thùng rác di động",
256
+ "toxic": "1"
257
+ },
258
+ {
259
+ "sentences": "không biết shop này sống bằng nghề lừa đảo à?",
260
+ "toxic": "1"
261
+ },
262
+ {
263
+ "sentences": "đm mất 3 triệu mua cục sắt vụn",
264
+ "toxic": "1"
265
+ },
266
+ {
267
+ "sentences": "bọn mày không xứng đáng làm kinh doanh",
268
+ "toxic": "1"
269
+ },
270
+ {
271
+ "sentences": "gọi điện chửi cho sấp mặt mới hả dạ",
272
+ "toxic": "1"
273
+ },
274
+ {
275
+ "sentences": "shop toàn lũ rác rưởi xã hội",
276
+ "toxic": "1"
277
+ },
278
+ {
279
+ "sentences": "tưởng mua đồ hiệu ai ngờ mua phải đồ thải",
280
+ "toxic": "1"
281
+ },
282
+ {
283
+ "sentences": "đm cái thứ đồng hồ chó đeo",
284
+ "toxic": "1"
285
+ },
286
+ {
287
+ "sentences": "chế độ bảo hành như trò đùa của thằng điên",
288
+ "toxic": "1"
289
+ },
290
+ {
291
+ "sentences": "mua hàng xong muốn đập nát vào mặt shop",
292
+ "toxic": "1"
293
+ },
294
+ {
295
+ "sentences": "lần đầu tiên thấy shop tồi như lồn thế này",
296
+ "toxic": "1"
297
+ },
298
+ {
299
+ "sentences": "địt mẹ thằng nào viết cái blog vô dụng này",
300
+ "toxic": "1"
301
+ },
302
+ {
303
+ "sentences": "shop này nên đổi tên thành 'Lừa Đảo Chuyên Nghiệp'",
304
+ "toxic": "1"
305
+ },
306
+ {
307
+ "sentences": "sản phẩm như đồng nát mà dám tính tiền triệu",
308
+ "toxic": "1"
309
+ },
310
+ {
311
+ "sentences": "không có tiền thì đừng mở shop làm gì cho nhục",
312
+ "toxic": "1"
313
+ },
314
+ {
315
+ "sentences": "tôi sẽ đảm bảo không ai dại dột mua ở đây nữa",
316
+ "toxic": "1"
317
+ },
318
+ {
319
+ "sentences": "thất vọng không thể nào thất vọng hơn",
320
+ "toxic": "1"
321
+ },
322
+ {
323
+ "sentences": "đúng là lũ ăn tiền bằng mồ hôi nước mắt người khác",
324
+ "toxic": "1"
325
+ },
326
+ {
327
+ "sentences": "shop này xứng đáng bị sập tiệm trong êm đẹp",
328
+ "toxic": "1"
329
+ },
330
+ {
331
+ "sentences": "mua hàng xong chỉ muốn chửi thề cả ngày",
332
+ "toxic": "1"
333
+ },
334
+ {
335
+ "sentences": "đm cái kiểu làm ăn bẩn thỉu này",
336
+ "toxic": "1"
337
+ },
338
+ {
339
+ "sentences": "tôi sẽ đăng bài này khắp nơi để cảnh báo mọi người",
340
+ "toxic": "1"
341
+ },
342
+ {
343
+ "sentences": "shop này là minh chứng cho sự suy đồi đạo đức kinh doanh",
344
+ "toxic": "1"
345
+ },
346
+ {
347
+ "sentences": "bài review như cứt chó, viết mà chẳng hiểu gì về sản phẩm",
348
+ "toxic": "1"
349
+ },
350
+ {
351
+ "sentences": "nội dung bài viết dở ẹc, đọc xong còn tức hơn là mua phải hàng giả",
352
+ "toxic": "1"
353
+ },
354
+ {
355
+ "sentences": "so sánh sản phẩm kiểu gì mà ngu học vậy? Khác hoàn toàn thực tế!",
356
+ "toxic": "1"
357
+ },
358
+ {
359
+ "sentences": "đm bài viết toàn nói tốt cho sản phẩm rác, chắc được shop trả tiền",
360
+ "toxic": "1"
361
+ },
362
+ {
363
+ "sentences": "review như lồn, đúng kiểu chưa dùng đã phán",
364
+ "toxic": "1"
365
+ },
366
+ {
367
+ "sentences": "tác giả chắc bị mù hay sao mà khen cái đồng hồ nhựa dẻo này",
368
+ "toxic": "1"
369
+ },
370
+ {
371
+ "sentences": "bài phân tích sản phẩm viết bằng chân à? Toàn thông tin sai lệch",
372
+ "toxic": "1"
373
+ },
374
+ {
375
+ "sentences": "so sánh hàng real vs fake mà như đấm vào mặt người đọc",
376
+ "toxic": "1"
377
+ },
378
+ {
379
+ "sentences": "nội dung copy paste khắp nơi, đạo văn còn không biết xấu hổ",
380
+ "toxic": "1"
381
+ },
382
+ {
383
+ "sentences": "review 5 sao nhưng toàn nói xấu, đéo hiểu kiểu gì",
384
+ "toxic": "1"
385
+ },
386
+ {
387
+ "sentences": "viết bài kiểu này thì tốt nhất câm mồm lại",
388
+ "toxic": "1"
389
+ },
390
+ {
391
+ "sentences": "tưởng có thông tin hữu ích ai ngờ đọc xong chỉ thấy ngu người",
392
+ "toxic": "1"
393
+ },
394
+ {
395
+ "sentences": "bài viết đánh giá mà như quảng cáo rẻ tiền",
396
+ "toxic": "1"
397
+ },
398
+ {
399
+ "sentences": "so sánh kiểu đầu buồi, hàng A với hàng B đéo liên quan",
400
+ "toxic": "1"
401
+ },
402
+ {
403
+ "sentences": "tác giả viết bài chắc uống rượu xong viết à? Toàn sai sự thật",
404
+ "toxic": "1"
405
+ },
406
+ {
407
+ "sentences": "đm đọc bài xong mua hàng mới biết bị lừa như chó",
408
+ "toxic": "1"
409
+ },
410
+ {
411
+ "sentences": "nội dung nhảm nhí, hình ảnh thì photoshop trắng trợn",
412
+ "toxic": "1"
413
+ },
414
+ {
415
+ "sentences": "review không trung thực, tôi sẽ kiện vì thông tin sai lệch",
416
+ "toxic": "1"
417
+ },
418
+ {
419
+ "sentences": "bài viết chất lượng như rác, tác giả nên đi học lại lớp 1",
420
+ "toxic": "1"
421
+ },
422
+ {
423
+ "sentences": "so sánh khập khiễng, đúng kiểu nói cho có nói",
424
+ "toxic": "1"
425
+ },
426
+ {
427
+ "sentences": "đánh giá sản phẩm kiểu này thì thà đốt tiền còn hơn",
428
+ "toxic": "1"
429
+ },
430
+ {
431
+ "sentences": "tác giả có não không? Khen sản phẩm kém chất lượng thế này",
432
+ "toxic": "1"
433
+ },
434
+ {
435
+ "sentences": "nội dung bài viết là trò cười cho cả cộng đồng",
436
+ "toxic": "1"
437
+ },
438
+ {
439
+ "sentences": "review như con cặc, chụp hình hàng real nhưng giao hàng fake",
440
+ "toxic": "1"
441
+ },
442
+ {
443
+ "sentences": "bài viết này xứng đáng bị report vì lừa đảo độc giả",
444
+ "toxic": "1"
445
+ },
446
+ {
447
+ "sentences": "so sánh đểu cáng, cố tình hạ thấp đối thủ",
448
+ "toxic": "1"
449
+ },
450
+ {
451
+ "sentences": "đọc xong bài viết muốn ném điện thoại vì tức",
452
+ "toxic": "1"
453
+ },
454
+ {
455
+ "sentences": "tác giả chắc bị shop mua chuộc nên mới viết tốt cho đồ rác",
456
+ "toxic": "1"
457
+ },
458
+ {
459
+ "sentences": "nội dung dối trá, hình ảnh lừa đảo, đúng kiểu review ảo",
460
+ "toxic": "1"
461
+ },
462
+ {
463
+ "sentences": "review không đúng trọng tâm, toàn nói nhảm về thứ không liên quan",
464
+ "toxic": "1"
465
+ },
466
+ {
467
+ "sentences": "chó mới tin mấy bài review dỏm này, toàn tiền PR bẩn",
468
+ "toxic": "1"
469
+ },
470
+ {
471
+ "sentences": "nội dung viết như cái quần què, đọc xong óc chó còn thông minh hơn",
472
+ "toxic": "1"
473
+ },
474
+ {
475
+ "sentences": "so sánh cc gì mà đem đồng hồ Thụy Sĩ ra đặt cạnh đồ Trung Quốc",
476
+ "toxic": "1"
477
+ },
478
+ {
479
+ "sentences": "tác giả não phẳng à? Điểm yếu sản phẩm toàn viết nhẹ như veo",
480
+ "toxic": "1"
481
+ },
482
+ {
483
+ "sentences": "bài viết chất lượng như rác thải, admin nên đốt blog đi là vừa",
484
+ "toxic": "1"
485
+ },
486
+ {
487
+ "sentences": "review kiểu đầu buồi, chụp hình đẹp nhưng thực tế hàng như cứt",
488
+ "toxic": "1"
489
+ },
490
+ {
491
+ "sentences": "đm cả bài dài toàn nước, không có tí giá trị thực tế",
492
+ "toxic": "1"
493
+ },
494
+ {
495
+ "sentences": "so sánh khập khiễng như đít với đầu, đéo liên quan gì nhau",
496
+ "toxic": "1"
497
+ },
498
+ {
499
+ "sentences": "tưởng đọc được cái gì hay hoá ra bài PR trá hình",
500
+ "toxic": "1"
501
+ },
502
+ {
503
+ "sentences": "viết lách lủng củng như óc lợn, đọc xong phí cả đời",
504
+ "toxic": "1"
505
+ },
506
+ {
507
+ "sentences": "shop này review ảo thế mà không ai kiểm duyệt à?",
508
+ "toxic": "1"
509
+ },
510
+ {
511
+ "sentences": "nội dung nhạt như nước ốc, xem xong muốn đấm vào mồm tác giả",
512
+ "toxic": "1"
513
+ },
514
+ {
515
+ "sentences": "so sánh kiểu gì mà đem Rolex so với đồng hồ trẻ em?",
516
+ "toxic": "1"
517
+ },
518
+ {
519
+ "sentences": "bài viết này xứng đáng 0 sao, tác giả nên đi học lại cấp 1",
520
+ "toxic": "1"
521
+ },
522
+ {
523
+ "sentences": "review như lồn, chê 1 câu rồi khen 10 câu kiểu gì?",
524
+ "toxic": "1"
525
+ },
526
+ {
527
+ "sentences": "nội dung copy khắp nơi, đạo văn còn không biết ngượng",
528
+ "toxic": "1"
529
+ },
530
+ {
531
+ "sentences": "đm đọc xong bài viết này muốn ném điện thoại qua cửa sổ",
532
+ "toxic": "1"
533
+ },
534
+ {
535
+ "sentences": "so sánh đểu, cố tình nâng bi sản phẩm chủ shop",
536
+ "toxic": "1"
537
+ },
538
+ {
539
+ "sentences": "tác giả chắc bị shop nó dúi tiền nên mới viết tốt thế",
540
+ "toxic": "1"
541
+ },
542
+ {
543
+ "sentences": "bài viết rác rưởi, hình minh hoạ toàn photoshop lòi ra",
544
+ "toxic": "1"
545
+ },
546
+ {
547
+ "sentences": "review không công tâm, đúng kiểu ăn tiền viết láo",
548
+ "toxic": "1"
549
+ },
550
+ {
551
+ "sentences": "nội dung lê thê như đít trâu, đọc 10 phút không hiểu gì",
552
+ "toxic": "1"
553
+ },
554
+ {
555
+ "sentences": "so sánh ngu học, đem iPhone so với Nokia cục gạch",
556
+ "toxic": "1"
557
+ },
558
+ {
559
+ "sentences": "tác giả viết bài bằng mông à? Toàn thông tin vớ vẩn",
560
+ "toxic": "1"
561
+ },
562
+ {
563
+ "sentences": "đm đọc xong muốn xin lỗi bộ não vì phải tiếp nhận rác này",
564
+ "toxic": "1"
565
+ },
566
+ {
567
+ "sentences": "review kiểu bố láo, chê 1 tí rồi khen như thánh",
568
+ "toxic": "1"
569
+ },
570
+ {
571
+ "sentences": "nội dung như cái thùng rác, tác giả nên đi chữa não",
572
+ "toxic": "1"
573
+ },
574
+ {
575
+ "sentences": "so sánh lố bịch, đem xe đạp so với xe hơi Mercedes",
576
+ "toxic": "1"
577
+ },
578
+ {
579
+ "sentences": "bài viết này là minh chứng cho sự xuống cấp của báo chí",
580
+ "toxic": "1"
581
+ },
582
+ {
583
+ "sentences": "review fake như chó, chắc viết mà chưa dùng sản phẩm",
584
+ "toxic": "1"
585
+ },
586
+ {
587
+ "sentences": "Khuyến mãi gì mà toàn hàng lỗi, đừng có lừa người tiêu dùng",
588
+ "toxic": "1"
589
+ },
590
+ {
591
+ "sentences": "Sale rồi mà giá vẫn đắt hơn chợ, bốc phét vừa thôi",
592
+ "toxic": "1"
593
+ },
594
+ {
595
+ "sentences": "Quảng cáo giảm giá 50% xong vào thì chỉ có 10%, đúng kiểu lừa đảo",
596
+ "toxic": "1"
597
+ },
598
+ {
599
+ "sentences": "Đồng hồ sale toàn hàng tồn kho cũ mèm, nhìn là biết",
600
+ "toxic": "1"
601
+ },
602
+ {
603
+ "sentences": "Nhân viên tư vấn như robot, hỏi cái gì cũng không biết",
604
+ "toxic": "1"
605
+ },
606
+ {
607
+ "sentences": "Shop lừa đảo! Mua đồng hồ sale về được 2 ngày đã hỏng",
608
+ "toxic": "1"
609
+ },
610
+ {
611
+ "sentences": "Khuyến mãi kiểu gì mà tính tiền giá gốc? Đồ ăn cướp trắng trợn!",
612
+ "toxic": "1"
613
+ },
614
+ {
615
+ "sentences": "Nhân viên não tôm à? Đã không biết gì còn cãi ngược khách",
616
+ "toxic": "1"
617
+ },
618
+ {
619
+ "sentences": "Website như cc, treo máy khi thanh toán xong mất luôn đơn hàng",
620
+ "toxic": "1"
621
+ },
622
+ {
623
+ "sentences": "Bảo hành kiểu gì mà mang đến cửa hàng lại bị đuổi về?",
624
+ "toxic": "1"
625
+ },
626
+ {
627
+ "sentences": "Đm shop chó này, bán hàng dỏm mà dám nhận tiền người ta",
628
+ "toxic": "1"
629
+ },
630
+ {
631
+ "sentences": "Mày tưởng bố mày dễ bị lừa à? Tao sẽ kiện đến cùng cho shop sập tiệm",
632
+ "toxic": "1"
633
+ },
634
+ {
635
+ "sentences": "Lũ nhân viên như lợn, ăn nói vô văn hóa, đúng là đồ súc vật",
636
+ "toxic": "1"
637
+ },
638
+ {
639
+ "sentences": "Khuyến mãi cái lồn! Toàn trò bịp bợm để moi tiền thiên hạ",
640
+ "toxic": "1"
641
+ },
642
+ {
643
+ "sentences": "Tao sẽ đăng bài khắp MXH cho thiên hạ biết shop lừa đảo thế nào",
644
+ "toxic": "1"
645
+ },
646
+ {
647
+ "sentences": "Cái lồn má mày, sale hàng fake mà dám nhận là chính hãng",
648
+ "toxic": "1"
649
+ },
650
+ {
651
+ "sentences": "Địt mẹ cái shop chó đẻ, bán đồ như shit mà đòi tiền triệu",
652
+ "toxic": "1"
653
+ },
654
+ {
655
+ "sentences": "Tao sẽ đốt cửa hàng của mày nếu không trả tiền lại đây",
656
+ "toxic": "1"
657
+ },
658
+ {
659
+ "sentences": "Lũ nhân viên như con đĩ, chỉ biết cười nhạo khách hàng",
660
+ "toxic": "1"
661
+ },
662
+ {
663
+ "sentences": "Khuyến mãi cái buồi! Toàn trò lừa bịp của lũ khốn nạn",
664
+ "toxic": "1"
665
+ }
666
+ ]