strongpear
commited on
Commit
•
0beb932
1
Parent(s):
49fe48c
create data_preprocessing.py
Browse files- data_preprocessing.py +177 -0
data_preprocessing.py
ADDED
@@ -0,0 +1,177 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
# -*- coding: utf-8 -*-
|
2 |
+
"""
|
3 |
+
Created on Fri Jul 28 08:29:31 2023
|
4 |
+
|
5 |
+
@author: ASUS
|
6 |
+
"""
|
7 |
+
import pandas as pd
|
8 |
+
import os
|
9 |
+
import glob
|
10 |
+
import re
|
11 |
+
|
12 |
+
import unicodedata2
|
13 |
+
from underthesea import word_tokenize
|
14 |
+
|
15 |
+
path = 'raw_data/'
|
16 |
+
files = glob.glob(os.path.join(path, "*.csv"))
|
17 |
+
|
18 |
+
def read_csv_file(file):
|
19 |
+
|
20 |
+
raw_df = pd.DataFrame()
|
21 |
+
|
22 |
+
for file in files:
|
23 |
+
drop_idx = []
|
24 |
+
df = pd.read_csv(file)
|
25 |
+
for index, row in df.iterrows():
|
26 |
+
if len(row['comments'].split(" ")) < 10:
|
27 |
+
drop_idx.append(index)
|
28 |
+
|
29 |
+
df = df.drop(drop_idx, axis=0)
|
30 |
+
df.reset_index(inplace=True)
|
31 |
+
|
32 |
+
raw_df = pd.concat([raw_df, df], ignore_index=True)
|
33 |
+
|
34 |
+
raw_df.drop(['index', 'Unnamed: 0'], axis=1, inplace=True)
|
35 |
+
raw_df = raw_df.drop_duplicates()
|
36 |
+
|
37 |
+
return raw_df
|
38 |
+
|
39 |
+
def remove_xem_them(text):
|
40 |
+
text = text.replace("Xem thêm", "")
|
41 |
+
text = text.replace("xem thêm", "")
|
42 |
+
|
43 |
+
return text
|
44 |
+
|
45 |
+
# remove emojis
|
46 |
+
def remove_emojis(text):
|
47 |
+
emoj = re.compile("["
|
48 |
+
u"\U0001F600-\U0001F64F" # emoticons
|
49 |
+
u"\U0001F300-\U0001F5FF" # symbols & pictographs
|
50 |
+
u"\U0001F680-\U0001F6FF" # transport & map symbols
|
51 |
+
u"\U0001F1E0-\U0001F1FF" # flags (iOS)
|
52 |
+
u"\U00002500-\U00002BEF" # chinese char
|
53 |
+
u"\U00002702-\U000027B0"
|
54 |
+
u"\U00002702-\U000027B0"
|
55 |
+
u"\U000024C2-\U0001F251"
|
56 |
+
u"\U0001f926-\U0001f937"
|
57 |
+
u"\U00010000-\U0010ffff"
|
58 |
+
u"\u2640-\u2642"
|
59 |
+
u"\u2600-\u2B55"
|
60 |
+
u"\u200d"
|
61 |
+
u"\u23cf"
|
62 |
+
u"\u23e9"
|
63 |
+
u"\u231a"
|
64 |
+
u"\ufe0f" # dingbats
|
65 |
+
u"\u3030"
|
66 |
+
"]+", re.UNICODE)
|
67 |
+
|
68 |
+
return re.sub(emoj, ' ', text)
|
69 |
+
|
70 |
+
def remove_hastag(text):
|
71 |
+
pattern = re.compile(r'([\#]+)((\w)*)(\s*)')
|
72 |
+
matches = pattern.finditer(text + " ")
|
73 |
+
for m in matches:
|
74 |
+
text = text.replace(m.group(), '')
|
75 |
+
|
76 |
+
return text
|
77 |
+
|
78 |
+
def remove_stopwords(text):
|
79 |
+
stopwords = []
|
80 |
+
|
81 |
+
f = open('vietnamese-stopwords.txt', encoding='utf8')
|
82 |
+
for line in f:
|
83 |
+
stopwords.append(line.rstrip('\n'))
|
84 |
+
|
85 |
+
new_text = ' '.join([i for i in text.split() if i not in stopwords])
|
86 |
+
|
87 |
+
return new_text
|
88 |
+
|
89 |
+
# split word with punctuation
|
90 |
+
def format_punctuation(text):
|
91 |
+
pattern = re.compile(r'(([\!\"\#\$\%\&\,\.\-\_\+\:\;\?\^\•])+)(\w+)')
|
92 |
+
matches = pattern.finditer(text + " ")
|
93 |
+
for m in matches:
|
94 |
+
text = text.replace(m.group()[0], ' ')
|
95 |
+
|
96 |
+
return text
|
97 |
+
|
98 |
+
# remove punctuation
|
99 |
+
def remove_punctuation(text):
|
100 |
+
punc = "'!\"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~‘’“”•…‼‼‼⁃₫√≧≦–"
|
101 |
+
new_text = "".join([i for i in text if i not in punc])
|
102 |
+
|
103 |
+
return new_text
|
104 |
+
|
105 |
+
def format_price(text):
|
106 |
+
pattern = re.compile(r'([0-9]+)(\s*)(k)(?=\W)')
|
107 |
+
matches = pattern.finditer(text + " ")
|
108 |
+
prices = []
|
109 |
+
new_prices = []
|
110 |
+
for m in matches:
|
111 |
+
prices.append(m.group())
|
112 |
+
new_prices.append(m.group().replace('k', '') + " nghìn_đồng")
|
113 |
+
|
114 |
+
pattern = re.compile(r'([0-9]+)(\s*)(tr |m )(([0-9]*))')
|
115 |
+
matches = pattern.finditer(text + " ")
|
116 |
+
for m in matches:
|
117 |
+
prices.append(m.group())
|
118 |
+
for r in ["tr ", "m "]:
|
119 |
+
if r in m.group():
|
120 |
+
n_p = m.group().replace(r, " triệu ")
|
121 |
+
break
|
122 |
+
tmp = n_p.split("triệu")
|
123 |
+
if tmp[1] == " ":
|
124 |
+
n_p += "_đồng "
|
125 |
+
else :
|
126 |
+
if int(tmp[1]) < 10:
|
127 |
+
tmp[1] = int(tmp[1]) * 100
|
128 |
+
if int(tmp[1]) < 100:
|
129 |
+
tmp[1] = int(tmp[1]) * 10
|
130 |
+
n_p = tmp[0] + "_triệu " + str(tmp[1]) + " nghìn_đồng"
|
131 |
+
new_prices.append(n_p)
|
132 |
+
|
133 |
+
for i in range(len(prices)):
|
134 |
+
text = text.replace(prices[i], new_prices[i])
|
135 |
+
|
136 |
+
text = text.replace("nghìn đồng", "nghìn_đồng")
|
137 |
+
text = text.replace("triệu đồng", "triệu_đồng")
|
138 |
+
|
139 |
+
return text
|
140 |
+
|
141 |
+
def format_price_v2(text):
|
142 |
+
pattern = re.compile(r'([0-9]+)(\s*)(triệu_đồng|nghìn_đồng|nghìn)')
|
143 |
+
matches = pattern.finditer(text + " ")
|
144 |
+
old = []
|
145 |
+
new = []
|
146 |
+
for m in matches:
|
147 |
+
old.append(m.group())
|
148 |
+
new.append("_".join(m.group().split()))
|
149 |
+
for i in range(len(old)):
|
150 |
+
text = text.replace(old[i], new[i])
|
151 |
+
|
152 |
+
return text
|
153 |
+
|
154 |
+
def clean_text(text):
|
155 |
+
text = text.lower()
|
156 |
+
rp_dict = {"cty":"công ty", "\"":"", "'":"", "\n":" ", " k ":" không ", " h ":" giờ ", " ko ":" không ", " cf ":" cà phê ", " cofe ":" cà phê ", " coffee ":" cà phê ", " cofee ":" cà phê ", " cafe ":" cà phê ", " cafee ":" cà phê ",
|
157 |
+
" j ":" gì ", ".000":" nghìn", "vnd":" đồng", "vnđ":" đồng", " r ":" rồi ", " đc ":" được ", " dc ":" được ", " pv ":" phục vụ ", " pvu ":" phục vụ ", " pvụ ":" phục vụ ",
|
158 |
+
" nv ":" nhân viên ", " nvien ":" nhân viên ", " nviên ": " nhân viên ", " b ":" bạn ", " m ":" mình ", " ng ":" người ", " cx ":" cũng ", "oder":"order", "ita":"ít",
|
159 |
+
"vaie":"vải", "chie":"chỉ", "cb":"chuẩn bị", "nc":"nước", "khoog":"không", "bânh":"bánh", "lug":"lung", "nhiêm":"nhiên", "nguời":"người", "ntn":"như thế này", "nuớc":"nước",
|
160 |
+
"lẫu":"lẩu", "dẻ":"rẻ", "siu":"siêu", "ni":"này"}
|
161 |
+
|
162 |
+
for key, value in rp_dict.items():
|
163 |
+
text = text.replace(key, value)
|
164 |
+
|
165 |
+
text = re.sub('\n', '' , text)
|
166 |
+
|
167 |
+
return text
|
168 |
+
|
169 |
+
def normalize_format(text):
|
170 |
+
return unicodedata2.normalize('NFC', text)
|
171 |
+
|
172 |
+
def word_segment(text):
|
173 |
+
try:
|
174 |
+
text = word_tokenize(text, format='text')
|
175 |
+
except:
|
176 |
+
return "Lỗi"
|
177 |
+
return text
|