trangngiosds commited on
Commit
fadd436
·
1 Parent(s): a0297e4

initial commit

Browse files
.gitignore ADDED
@@ -0,0 +1,278 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Created by https://www.toptal.com/developers/gitignore/api/linux,macos,direnv,python,windows,jupyternotebooks,visualstudiocode
2
+ # Edit at https://www.toptal.com/developers/gitignore?templates=linux,macos,direnv,python,windows,jupyternotebooks,visualstudiocode
3
+
4
+ ### direnv ###
5
+ .direnv
6
+ .envrc
7
+
8
+ ### JupyterNotebooks ###
9
+ # gitignore template for Jupyter Notebooks
10
+ # website: http://jupyter.org/
11
+
12
+ .ipynb_checkpoints
13
+ */.ipynb_checkpoints/*
14
+
15
+ # IPython
16
+ profile_default/
17
+ ipython_config.py
18
+
19
+ # Remove previous ipynb_checkpoints
20
+ # git rm -r .ipynb_checkpoints/
21
+
22
+ ### Linux ###
23
+ *~
24
+
25
+ # temporary files which can be created if a process still has a handle open of a deleted file
26
+ .fuse_hidden*
27
+
28
+ # KDE directory preferences
29
+ .directory
30
+
31
+ # Linux trash folder which might appear on any partition or disk
32
+ .Trash-*
33
+
34
+ # .nfs files are created when an open file is removed but is still being accessed
35
+ .nfs*
36
+
37
+ ### macOS ###
38
+ # General
39
+ .DS_Store
40
+ .AppleDouble
41
+ .LSOverride
42
+
43
+ # Icon must end with two \r
44
+ Icon
45
+
46
+ # Thumbnails
47
+ ._*
48
+
49
+ # Files that might appear in the root of a volume
50
+ .DocumentRevisions-V100
51
+ .fseventsd
52
+ .Spotlight-V100
53
+ .TemporaryItems
54
+ .Trashes
55
+ .VolumeIcon.icns
56
+ .com.apple.timemachine.donotpresent
57
+
58
+ # Directories potentially created on remote AFP share
59
+ .AppleDB
60
+ .AppleDesktop
61
+ Network Trash Folder
62
+ Temporary Items
63
+ .apdisk
64
+
65
+ ### macOS Patch ###
66
+ # iCloud generated files
67
+ *.icloud
68
+
69
+ ### Python ###
70
+ # Byte-compiled / optimized / DLL files
71
+ __pycache__/
72
+ *.py[cod]
73
+ *$py.class
74
+
75
+ # C extensions
76
+ *.so
77
+
78
+ # Distribution / packaging
79
+ .Python
80
+ build/
81
+ develop-eggs/
82
+ dist/
83
+ downloads/
84
+ eggs/
85
+ .eggs/
86
+ lib/
87
+ lib64/
88
+ parts/
89
+ sdist/
90
+ var/
91
+ wheels/
92
+ share/python-wheels/
93
+ *.egg-info/
94
+ .installed.cfg
95
+ *.egg
96
+ MANIFEST
97
+
98
+ # PyInstaller
99
+ # Usually these files are written by a python script from a template
100
+ # before PyInstaller builds the exe, so as to inject date/other infos into it.
101
+ *.manifest
102
+ *.spec
103
+
104
+ # Installer logs
105
+ pip-log.txt
106
+ pip-delete-this-directory.txt
107
+
108
+ # Unit test / coverage reports
109
+ htmlcov/
110
+ .tox/
111
+ .nox/
112
+ .coverage
113
+ .coverage.*
114
+ .cache
115
+ nosetests.xml
116
+ coverage.xml
117
+ *.cover
118
+ *.py,cover
119
+ .hypothesis/
120
+ .pytest_cache/
121
+ cover/
122
+
123
+ # Translations
124
+ *.mo
125
+ *.pot
126
+
127
+ # Django stuff:
128
+ *.log
129
+ local_settings.py
130
+ db.sqlite3
131
+ db.sqlite3-journal
132
+
133
+ # Flask stuff:
134
+ instance/
135
+ .webassets-cache
136
+
137
+ # Scrapy stuff:
138
+ .scrapy
139
+
140
+ # Sphinx documentation
141
+ docs/_build/
142
+
143
+ # PyBuilder
144
+ .pybuilder/
145
+ target/
146
+
147
+ # Jupyter Notebook
148
+
149
+ # IPython
150
+
151
+ # pyenv
152
+ # For a library or package, you might want to ignore these files since the code is
153
+ # intended to run in multiple environments; otherwise, check them in:
154
+ # .python-version
155
+
156
+ # pipenv
157
+ # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
158
+ # However, in case of collaboration, if having platform-specific dependencies or dependencies
159
+ # having no cross-platform support, pipenv may install dependencies that don't work, or not
160
+ # install all needed dependencies.
161
+ #Pipfile.lock
162
+
163
+ # poetry
164
+ # Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
165
+ # This is especially recommended for binary packages to ensure reproducibility, and is more
166
+ # commonly ignored for libraries.
167
+ # https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
168
+ #poetry.lock
169
+
170
+ # pdm
171
+ # Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.
172
+ #pdm.lock
173
+ # pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it
174
+ # in version control.
175
+ # https://pdm.fming.dev/#use-with-ide
176
+ .pdm.toml
177
+
178
+ # PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
179
+ __pypackages__/
180
+
181
+ # Celery stuff
182
+ celerybeat-schedule
183
+ celerybeat.pid
184
+
185
+ # SageMath parsed files
186
+ *.sage.py
187
+
188
+ # Environments
189
+ .env
190
+ .venv
191
+ env/
192
+ venv/
193
+ ENV/
194
+ env.bak/
195
+ venv.bak/
196
+
197
+ # Spyder project settings
198
+ .spyderproject
199
+ .spyproject
200
+
201
+ # Rope project settings
202
+ .ropeproject
203
+
204
+ # mkdocs documentation
205
+ /site
206
+
207
+ # mypy
208
+ .mypy_cache/
209
+ .dmypy.json
210
+ dmypy.json
211
+
212
+ # Pyre type checker
213
+ .pyre/
214
+
215
+ # pytype static type analyzer
216
+ .pytype/
217
+
218
+ # Cython debug symbols
219
+ cython_debug/
220
+
221
+ # PyCharm
222
+ # JetBrains specific template is maintained in a separate JetBrains.gitignore that can
223
+ # be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
224
+ # and can be added to the global gitignore or merged into this file. For a more nuclear
225
+ # option (not recommended) you can uncomment the following to ignore the entire idea folder.
226
+ #.idea/
227
+
228
+ ### Python Patch ###
229
+ # Poetry local configuration file - https://python-poetry.org/docs/configuration/#local-configuration
230
+ poetry.toml
231
+
232
+ # ruff
233
+ .ruff_cache/
234
+
235
+ # LSP config files
236
+ pyrightconfig.json
237
+
238
+ ### VisualStudioCode ###
239
+ .vscode/
240
+
241
+ # Local History for Visual Studio Code
242
+ .history/
243
+
244
+ # Built Visual Studio Code Extensions
245
+ *.vsix
246
+
247
+ ### VisualStudioCode Patch ###
248
+ # Ignore all local history of files
249
+ .history
250
+ .ionide
251
+
252
+ ### Windows ###
253
+ # Windows thumbnail cache files
254
+ Thumbs.db
255
+ Thumbs.db:encryptable
256
+ ehthumbs.db
257
+ ehthumbs_vista.db
258
+
259
+ # Dump file
260
+ *.stackdump
261
+
262
+ # Folder config file
263
+ [Dd]esktop.ini
264
+
265
+ # Recycle Bin used on file shares
266
+ $RECYCLE.BIN/
267
+
268
+ # Windows Installer files
269
+ *.cab
270
+ *.msi
271
+ *.msix
272
+ *.msm
273
+ *.msp
274
+
275
+ # Windows shortcuts
276
+ *.lnk
277
+
278
+ # End of https://www.toptal.com/developers/gitignore/api/linux,macos,direnv,python,windows,jupyternotebooks,visualstudiocode
app.py ADDED
@@ -0,0 +1,189 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import streamlit as st
2
+ import json
3
+ from autogluon.multimodal import MultiModalPredictor
4
+ import pandas as pd
5
+ from geopy.geocoders import GoogleV3
6
+ import os
7
+ import tempfile
8
+
9
+ st.set_page_config(layout="wide")
10
+
11
+ if "price_text" not in st.session_state:
12
+ st.session_state.price_text = 0
13
+
14
+
15
+ @st.cache_resource
16
+ def load_geocoder():
17
+ return GoogleV3(api_key=os.environ.get("GOOGLE_MAP_API_KEY"))
18
+
19
+
20
+ geocoder = load_geocoder()
21
+
22
+
23
+ @st.cache_resource
24
+ def load_mm_text_no_price_model():
25
+ return MultiModalPredictor.load("models/mm-text-no-price/", verbosity=0)
26
+
27
+
28
+ mm_text_no_price_predictor = load_mm_text_no_price_model()
29
+
30
+
31
+ @st.cache_resource
32
+ def load_city_map():
33
+ return json.load(open("city-map.json"))
34
+
35
+
36
+ city_map = load_city_map()
37
+
38
+
39
+ @st.cache_resource
40
+ def load_city_district_map():
41
+ return json.load(open("city-district-map.json"))
42
+
43
+
44
+ city_district_map = load_city_district_map()
45
+
46
+ CERT_STATUS = pd.CategoricalDtype(
47
+ categories=["Không có", "hợp đồng", "sổ đỏ / sổ hồng"], ordered=False
48
+ )
49
+ DIRECTION = pd.CategoricalDtype(
50
+ categories=[
51
+ "Không có",
52
+ "Tây - Nam",
53
+ "Đông - Nam",
54
+ "Đông - Bắc",
55
+ "Tây - Bắc",
56
+ "Nam",
57
+ "Tây",
58
+ "Bắc",
59
+ "Đông",
60
+ ],
61
+ ordered=False,
62
+ )
63
+ CITY = pd.CategoricalDtype(categories=city_map.keys(), ordered=False)
64
+ DISTRICT = pd.CategoricalDtype(
65
+ categories=sum([list(map(int, v.keys())) for v in city_district_map.values()], []),
66
+ ordered=False,
67
+ )
68
+
69
+ location_options = st.columns([1, 1, 2, 1, 1])
70
+ with location_options[0]:
71
+ city = st.selectbox(
72
+ "Choose city", options=city_map.items(), format_func=lambda x: x[1]
73
+ )
74
+ with location_options[1]:
75
+ district = st.selectbox(
76
+ "Choose district",
77
+ options=city_district_map[city[0]].items(),
78
+ format_func=lambda x: x[1],
79
+ )
80
+ with location_options[2]:
81
+ location = st.text_input("Enter precise location")
82
+
83
+ location = (location + ", " if location else "") + city[1] + ", " + district[1]
84
+ geocode_result = geocoder.geocode(query=location, region="vn", language="vi")
85
+ latitude = geocode_result.latitude
86
+ longitude = geocode_result.longitude
87
+
88
+ with location_options[3]:
89
+ latitude = st.number_input(
90
+ "Enter latitude", value=latitude, step=1e-8, format="%.7f"
91
+ )
92
+ with location_options[4]:
93
+ longitude = st.number_input(
94
+ "Enter longitude", value=longitude, step=1e-8, format="%.7f"
95
+ )
96
+
97
+ numerical_options = st.columns(6)
98
+ with numerical_options[0]:
99
+ area = st.number_input("Area (m2)", min_value=1.0)
100
+ with numerical_options[1]:
101
+ bedrooms = st.number_input("Number of bedrooms", min_value=1, value=1)
102
+ with numerical_options[2]:
103
+ bathrooms = st.number_input("Number of bathrooms", min_value=1, value=1)
104
+ with numerical_options[3]:
105
+ floors = st.number_input("Number of floors", min_value=1, value=1)
106
+ with numerical_options[4]:
107
+ front_width = st.number_input(
108
+ "Front width, leave 0 for N/A", min_value=0.0, value=0.0, step=0.1
109
+ )
110
+ with numerical_options[5]:
111
+ road_width = st.number_input(
112
+ "Road width, leave 0 for N/A", min_value=0.0, value=0.0, step=0.1
113
+ )
114
+
115
+ cat_time_columns = st.columns(4)
116
+ with cat_time_columns[0]:
117
+ timestamp = st.date_input("Date posted", format="DD/MM/YYYY")
118
+ with cat_time_columns[1]:
119
+ cert_status = st.selectbox("Certification status", options=CERT_STATUS.categories)
120
+ with cat_time_columns[2]:
121
+ direction = st.selectbox("Direction", options=DIRECTION.categories)
122
+ with cat_time_columns[3]:
123
+ balcony_direction = st.selectbox("Balcony direction", options=DIRECTION.categories)
124
+
125
+ description = st.text_area("Description")
126
+ title = description.split(".", maxsplit=1)[0]
127
+
128
+ uploaded_image = st.file_uploader("Upload an image")
129
+ image_tmp = None
130
+ if uploaded_image:
131
+ image_tmp = tempfile.NamedTemporaryFile(suffix=uploaded_image.name)
132
+ image_tmp.write(uploaded_image.read())
133
+ print(image_tmp.name)
134
+
135
+ df = pd.DataFrame(
136
+ [
137
+ {
138
+ "Title": title,
139
+ "Area": area,
140
+ "Location": location,
141
+ "Time stamp": timestamp,
142
+ "Certification status": cert_status,
143
+ "Direction": direction,
144
+ "Bedrooms": bedrooms,
145
+ "Bathrooms": bathrooms,
146
+ "Front width": front_width or float("nan"),
147
+ "Floor": floors,
148
+ "Description": description,
149
+ "Image URL": image_tmp.name if image_tmp else None,
150
+ "Road width": road_width or float("nan"),
151
+ "City_code": city[0],
152
+ "DistrictId": int(district[0]),
153
+ "Lattitude": latitude,
154
+ "Longitude": longitude,
155
+ "Balcony_Direction": balcony_direction,
156
+ }
157
+ ]
158
+ ).astype(
159
+ {
160
+ "Title": "str",
161
+ "Area": "float",
162
+ "Location": "str",
163
+ "Time stamp": "datetime64[ns]",
164
+ "Certification status": CERT_STATUS,
165
+ "Direction": DIRECTION,
166
+ "Bedrooms": "int",
167
+ "Bathrooms": "int",
168
+ "Front width": "float",
169
+ "Floor": "int",
170
+ "Description": "str",
171
+ "Image URL": "str",
172
+ "Road width": "float",
173
+ "City_code": CITY,
174
+ "DistrictId": DISTRICT,
175
+ "Lattitude": "float",
176
+ "Longitude": "float",
177
+ "Balcony_Direction": DIRECTION,
178
+ }
179
+ )
180
+
181
+ if st.button("Get estimated price with text"):
182
+ st.session_state.price_text = mm_text_no_price_predictor.predict(
183
+ df, as_pandas=False
184
+ ).item()
185
+ st.text(
186
+ "Estimated price: {0:,} VND".format(int(st.session_state.price_text * 1e6))
187
+ if st.session_state.price_text
188
+ else "No price estimated."
189
+ )
city-district-map.json ADDED
@@ -0,0 +1,845 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "AG": {
3
+ "85": "An Phú",
4
+ "86": "Châu Phú",
5
+ "87": "Châu Thành",
6
+ "88": "Chợ Mới",
7
+ "89": "Tri Tôn",
8
+ "90": "Phú Tân",
9
+ "91": "Tân Châu",
10
+ "92": "Thoại Sơn",
11
+ "93": "Tịnh Biên",
12
+ "94": "Long Xuyên",
13
+ "95": "Châu Đốc"
14
+ },
15
+ "BD": {
16
+ "156": "Bến Cát",
17
+ "157": "Dầu Tiếng",
18
+ "158": "Dĩ An",
19
+ "159": "Phú Giáo",
20
+ "160": "Tân Uyên",
21
+ "161": "Thuận An",
22
+ "163": "Thủ Dầu Một",
23
+ "716": "Bàu Bàng",
24
+ "730": "Bắc Tân Uyên"
25
+ },
26
+ "BDD": {
27
+ "145": "An Lão",
28
+ "146": "An Nhơn",
29
+ "147": "Hoài Ân",
30
+ "148": "Hoài Nhơn",
31
+ "149": "Phù Cát",
32
+ "150": "Phù Mỹ",
33
+ "151": "Tây Sơn",
34
+ "152": "Tuy Phước",
35
+ "153": "Vân Canh",
36
+ "154": "Vĩnh Thạnh",
37
+ "155": "Quy Nhơn"
38
+ },
39
+ "BG": {
40
+ "104": "Hiệp Hòa",
41
+ "105": "Lạng Giang",
42
+ "106": "Lục Nam",
43
+ "107": "Lục Ngạn",
44
+ "108": "Sơn Động",
45
+ "109": "Tân Yên",
46
+ "110": "Việt Yên",
47
+ "111": "Yên Dũng",
48
+ "112": "Yên Thế",
49
+ "113": "Bắc Giang"
50
+ },
51
+ "BK": {
52
+ "114": "Ba Bể",
53
+ "115": "Bạch Thông",
54
+ "116": "Chợ Đồn",
55
+ "117": "Chợ Mới",
56
+ "118": "Na Rì",
57
+ "119": "Ngân Sơn",
58
+ "120": "Pác Nặm",
59
+ "121": "Bắc Kạn"
60
+ },
61
+ "BL": {
62
+ "122": "Đông Hải",
63
+ "123": "Giá Rai",
64
+ "124": "Hòa Bình",
65
+ "125": "Hồng Dân",
66
+ "126": "Phước Long",
67
+ "127": "Vĩnh Lợi",
68
+ "128": "Bạc Liêu"
69
+ },
70
+ "BN": {
71
+ "129": "Gia Bình",
72
+ "130": "Lương Tài",
73
+ "131": "Quế Võ",
74
+ "132": "Thuận Thành",
75
+ "133": "Tiên Du",
76
+ "134": "Từ Sơn",
77
+ "135": "Yên Phong",
78
+ "136": "Bắc Ninh"
79
+ },
80
+ "BP": {
81
+ "164": "Bình Long",
82
+ "165": "Bù Đăng",
83
+ "166": "Bù Đốp",
84
+ "167": "Chơn Thành",
85
+ "168": "Đồng Phú",
86
+ "169": "Lộc Ninh",
87
+ "170": "Phước Long",
88
+ "171": "Đồng Xoài",
89
+ "698": "Hớn Quản",
90
+ "699": "Bù Gia Mập",
91
+ "728": "Phú Riềng"
92
+ },
93
+ "BTH": {
94
+ "172": "Bắc Bình",
95
+ "173": "Đảo Phú Quý",
96
+ "174": "Đức Linh",
97
+ "175": "Hàm Tân",
98
+ "176": "Hàm Thuận Bắc",
99
+ "177": "Hàm Thuận Nam",
100
+ "178": "Tánh Linh",
101
+ "179": "Tuy Phong",
102
+ "181": "Phan Thiết",
103
+ "182": "La Gi"
104
+ },
105
+ "BTR": {
106
+ "137": "Ba Tri",
107
+ "138": "Bình Đại",
108
+ "139": "Châu Thành",
109
+ "140": "Chợ Lách",
110
+ "141": "Giồng Trôm",
111
+ "143": "Thạnh Phú",
112
+ "144": "Bến Tre",
113
+ "705": "Mỏ Cày Bắc",
114
+ "706": "Mỏ Cày Nam"
115
+ },
116
+ "CB": {
117
+ "192": "Bảo Lạc",
118
+ "193": "Bảo Lâm",
119
+ "194": "Hạ Lang",
120
+ "195": "Hà Quảng",
121
+ "196": "Hòa An",
122
+ "197": "Nguyên Bình",
123
+ "198": "Phục Hòa",
124
+ "199": "Quảng Uyên",
125
+ "200": "Thạch An",
126
+ "201": "Thông Nông",
127
+ "202": "Trà Lĩnh",
128
+ "203": "Trùng Khánh",
129
+ "204": "Cao Bằng"
130
+ },
131
+ "CM": {
132
+ "183": "Cái Nước",
133
+ "184": "Đầm Dơi",
134
+ "185": "Năm Căn",
135
+ "186": "Ngọc Hiển",
136
+ "187": "Phú Tân",
137
+ "188": "Thới Bình",
138
+ "189": "Trần Văn Thời",
139
+ "190": "U Minh",
140
+ "191": "Cà Mau"
141
+ },
142
+ "CN": {
143
+ "700": "Không xác định"
144
+ },
145
+ "CT": {
146
+ "77": "Cờ Đỏ",
147
+ "78": "Phong Điền",
148
+ "79": "Thốt Nốt",
149
+ "80": "Vĩnh Thạnh",
150
+ "81": "Bình Thủy",
151
+ "82": "Cái Răng",
152
+ "83": "Ninh Kiều",
153
+ "84": "Ô Môn",
154
+ "704": " Thới Lai"
155
+ },
156
+ "DDB": {
157
+ "227": "Điện Biên",
158
+ "228": "Điện Biên Đông",
159
+ "229": "Mường Ảng",
160
+ "230": "Mường Chà",
161
+ "231": "Mường Nhé",
162
+ "232": "Tủa Chùa",
163
+ "233": "Tuần Giáo",
164
+ "234": "Điện Biên Phủ",
165
+ "235": "Mường Lay",
166
+ "711": "Nậm Pồ"
167
+ },
168
+ "DDL": {
169
+ "205": "Buôn Đôn",
170
+ "206": "Cư Kuin",
171
+ "207": "Cư M'gar",
172
+ "208": "Ea H'Leo",
173
+ "209": "Ea Kar",
174
+ "210": "Ea Súp",
175
+ "211": "Krông Ana",
176
+ "212": "Krông Bông",
177
+ "213": "Krông Buk",
178
+ "214": "Krông Năng",
179
+ "215": "Krông Pắc",
180
+ "216": " Lăk",
181
+ "217": " M'Đrăk",
182
+ "218": "Buôn Ma Thuột",
183
+ "697": "Buôn Hồ"
184
+ },
185
+ "DDN": {
186
+ "45": "Cẩm Lệ",
187
+ "46": "Hải Châu",
188
+ "47": "Liên Chiểu",
189
+ "48": "Ngũ Hành Sơn",
190
+ "49": "Sơn Trà",
191
+ "50": "Thanh Khê",
192
+ "51": "Hòa Vang",
193
+ "52": "Hoàng Sa"
194
+ },
195
+ "DDT": {
196
+ "247": "Huyện Cao Lãnh",
197
+ "248": "Châu Thành",
198
+ "249": "Hồng Ngự",
199
+ "250": "Lai Vung",
200
+ "251": "Lấp Vò",
201
+ "252": "Tam Nông",
202
+ "253": "Tân Hồng",
203
+ "254": "Thanh Bình",
204
+ "255": "Tháp Mười",
205
+ "257": "Sa Đéc",
206
+ "721": "Cao Lãnh",
207
+ "722": "Huyện Hồng Ngự"
208
+ },
209
+ "DNA": {
210
+ "236": "Cẩm Mỹ",
211
+ "237": "Định Quán",
212
+ "238": "Long Thành",
213
+ "239": "Nhơn Trạch",
214
+ "240": "Tân Phú",
215
+ "241": "Thống Nhất",
216
+ "242": "Trảng Bom",
217
+ "243": "Vĩnh Cửu",
218
+ "244": "Xuân Lộc",
219
+ "245": "Biên Hòa",
220
+ "246": "Long Khánh"
221
+ },
222
+ "DNO": {
223
+ "219": "Cư Jút",
224
+ "220": "Dăk GLong",
225
+ "221": "Dăk Mil",
226
+ "222": "Dăk R'Lấp",
227
+ "223": "Dăk Song",
228
+ "224": "Krông Nô",
229
+ "225": "Tuy Đức",
230
+ "226": "Gia Nghĩa"
231
+ },
232
+ "GL": {
233
+ "258": "AYun Pa",
234
+ "259": "Chư Păh",
235
+ "260": "Chư Sê",
236
+ "261": " ChưPRông",
237
+ "262": "Đăk Đoa",
238
+ "263": "Đăk Pơ",
239
+ "264": "Đức Cơ",
240
+ "265": "Ia Grai",
241
+ "266": "Ia Pa",
242
+ "267": " KBang",
243
+ "268": "Kông Chro",
244
+ "269": "Krông Pa",
245
+ "270": "Mang Yang",
246
+ "271": "Phú Thiện",
247
+ "272": "Plei Ku",
248
+ "273": "An Khê",
249
+ "710": "Chư Pưh"
250
+ },
251
+ "HB": {
252
+ "322": "Cao Phong",
253
+ "323": "Đà Bắc",
254
+ "324": "Kim Bôi",
255
+ "326": "Lạc Sơn",
256
+ "327": "Lạc Thủy",
257
+ "328": "Lương Sơn",
258
+ "329": "Mai Châu",
259
+ "330": "Tân Lạc",
260
+ "331": "Yên Thủy",
261
+ "332": "Hòa Bình"
262
+ },
263
+ "HD": {
264
+ "303": "Bình Giang",
265
+ "304": "Cẩm Giàng",
266
+ "305": "Chí Linh",
267
+ "306": "Gia Lộc",
268
+ "307": "Kim Thành",
269
+ "308": "Kinh Môn",
270
+ "309": "Nam Sách",
271
+ "310": "Ninh Giang",
272
+ "311": "Thanh Hà",
273
+ "312": "Thanh Miện",
274
+ "313": "Tứ Kỳ",
275
+ "314": "Hải Dương"
276
+ },
277
+ "HG": {
278
+ "274": "Bắc Mê",
279
+ "275": "Bắc Quang",
280
+ "276": "Đồng Văn",
281
+ "277": "Hoàng Su Phì",
282
+ "278": "Mèo Vạc",
283
+ "279": "Quản Bạ",
284
+ "280": "Quang Bình",
285
+ "281": "Vị Xuyên",
286
+ "282": "Xín Mần",
287
+ "283": "Yên Minh",
288
+ "284": "Hà Giang"
289
+ },
290
+ "HGI": {
291
+ "315": "Châu Thành",
292
+ "316": "Châu Thành A",
293
+ "317": "Long Mỹ",
294
+ "318": "Phụng Hiệp",
295
+ "319": "Vị Thủy",
296
+ "320": "Ngã Bảy",
297
+ "321": "Vị Thanh",
298
+ "731": "Thị xã Long Mỹ"
299
+ },
300
+ "HN": {
301
+ "1": "Hoàn Kiếm",
302
+ "2": "Ba Đình",
303
+ "3": "Đống Đa",
304
+ "4": "Hai Bà Trưng",
305
+ "5": "Thanh Xuân",
306
+ "6": "Tây Hồ",
307
+ "7": "Cầu Giấy",
308
+ "8": "Hoàng Mai",
309
+ "9": "Long Biên",
310
+ "10": "Đông Anh",
311
+ "11": "Gia Lâm",
312
+ "12": "Sóc Sơn",
313
+ "13": "Thanh Trì",
314
+ "14": "Nam Từ Liêm",
315
+ "15": "Hà Đông",
316
+ "16": "Sơn Tây",
317
+ "17": "Mê Linh",
318
+ "18": "Ba Vì",
319
+ "19": "Phúc Thọ",
320
+ "20": "Đan Phượng",
321
+ "21": "Hoài Đức",
322
+ "22": "Quốc Oai",
323
+ "23": "Thạch Thất",
324
+ "24": "Chương Mỹ",
325
+ "25": "Thanh Oai",
326
+ "26": "Thường Tín",
327
+ "27": "Phú Xuyên",
328
+ "28": "Ứng Hòa",
329
+ "29": "Mỹ Đức",
330
+ "718": "Bắc Từ Liêm"
331
+ },
332
+ "HNA": {
333
+ "285": "Bình Lục",
334
+ "286": "Duy Tiên",
335
+ "287": "Kim Bảng",
336
+ "288": "Lý Nhân",
337
+ "289": "Thanh Liêm",
338
+ "290": "Phủ Lý"
339
+ },
340
+ "HP": {
341
+ "30": "Đồ Sơn",
342
+ "31": "Dương Kinh",
343
+ "32": "Hải An",
344
+ "33": "Hồng Bàng",
345
+ "34": "Kiến An",
346
+ "35": "Lê Chân",
347
+ "36": "Ngô Quyền",
348
+ "37": "An Dương",
349
+ "38": "An Lão",
350
+ "39": "Bạch Long Vĩ",
351
+ "40": "Cát Hải",
352
+ "41": "Kiến Thụy",
353
+ "42": "Thủy Nguyên",
354
+ "43": "Tiên Lãng",
355
+ "44": "Vĩnh Bảo"
356
+ },
357
+ "HT": {
358
+ "291": "Cẩm Xuyên",
359
+ "292": "Can Lộc",
360
+ "293": "Đức Thọ",
361
+ "294": "Hương Khê",
362
+ "295": "Hương Sơn",
363
+ "296": "Kỳ Anh",
364
+ "297": "Lộc Hà",
365
+ "298": "Nghi Xuân",
366
+ "299": "Thạch Hà",
367
+ "300": "Vũ Quang",
368
+ "301": "Hà Tĩnh",
369
+ "302": "Hồng Lĩnh"
370
+ },
371
+ "HY": {
372
+ "333": "Ân Thi",
373
+ "334": "Khoái Châu",
374
+ "335": "Kim Động",
375
+ "336": "Mỹ Hào",
376
+ "337": "Phù Cừ",
377
+ "338": "Tiên Lữ",
378
+ "339": "Văn Giang",
379
+ "340": "Văn Lâm",
380
+ "341": "Yên Mỹ",
381
+ "342": "Hưng Yên"
382
+ },
383
+ "KG": {
384
+ "352": "An Biên",
385
+ "353": "An Minh",
386
+ "354": "Châu Thành",
387
+ "355": "Giồng Riềng",
388
+ "356": "Gò Quao",
389
+ "357": "Hòn Đất",
390
+ "358": "Kiên Hải",
391
+ "359": "Kiên Lương",
392
+ "360": "Phú Quốc",
393
+ "361": "Tân Hiệp",
394
+ "362": "U minh Thượng",
395
+ "363": "Vĩnh Thuận",
396
+ "364": "Rạch Giá",
397
+ "365": "Hà Tiên",
398
+ "723": "Giang Thành"
399
+ },
400
+ "KH": {
401
+ "343": "Cam Lâm",
402
+ "344": "Diên Khánh",
403
+ "345": "Khánh Sơn",
404
+ "346": "Khánh Vĩnh",
405
+ "347": "Ninh Hòa",
406
+ "348": "Trường Sa",
407
+ "349": "Vạn Ninh",
408
+ "350": "Nha Trang",
409
+ "351": "Cam Ranh"
410
+ },
411
+ "KT": {
412
+ "366": "Đăk Glei",
413
+ "367": "Đăk Hà",
414
+ "368": "Đăk Tô",
415
+ "369": "Kon Plông",
416
+ "370": "Kon Rẫy",
417
+ "371": "Ngọc Hồi",
418
+ "372": "Sa Thầy",
419
+ "373": "Tu Mơ Rông",
420
+ "374": "TP. KonTum",
421
+ "729": "Ia H'Drai"
422
+ },
423
+ "LA": {
424
+ "415": "Bến Lức",
425
+ "416": "Cần Đước",
426
+ "417": "Cần Giuộc",
427
+ "418": "Châu Thành",
428
+ "419": "Đức Hòa",
429
+ "420": "Đức Huệ",
430
+ "421": "Mộc Hóa",
431
+ "422": "Tân Hưng",
432
+ "423": "Tân Thạnh",
433
+ "424": "Tân Trụ",
434
+ "425": "Thạnh Hóa",
435
+ "426": "Thủ Thừa",
436
+ "427": "Vĩnh Hưng",
437
+ "429": "Tân An",
438
+ "724": "Kiến Tường"
439
+ },
440
+ "LCA": {
441
+ "404": "Bắc Hà",
442
+ "405": "Bảo Thắng",
443
+ "406": "Bảo Yên",
444
+ "407": "Bát Xát",
445
+ "408": "Mường Khương",
446
+ "409": "Sa Pa",
447
+ "410": "Văn Bàn",
448
+ "411": "Si Ma Cai",
449
+ "414": "Lào Cai"
450
+ },
451
+ "LCH": {
452
+ "375": "Mường Tè",
453
+ "376": "Phong Thổ",
454
+ "377": "Sìn Hồ",
455
+ "378": "Tam Đường",
456
+ "379": "Than Uyên",
457
+ "380": "Lai Châu",
458
+ "691": "Tân Uyên",
459
+ "709": "Nậm Nhùn"
460
+ },
461
+ "LDD": {
462
+ "381": "Bảo Lâm",
463
+ "382": "Cát Tiên",
464
+ "383": "Đạ Huoai",
465
+ "384": "Đạ Tẻh",
466
+ "385": "Đam Rông",
467
+ "386": "Di Linh",
468
+ "387": "Đơn Dương",
469
+ "388": "Đức Trọng",
470
+ "389": "Lạc Dương",
471
+ "390": "Lâm Hà",
472
+ "391": "Đà Lạt",
473
+ "392": "Bảo Lộc"
474
+ },
475
+ "LS": {
476
+ "393": "Bắc Sơn",
477
+ "394": "Bình Gia",
478
+ "395": "Cao Lộc",
479
+ "396": "Chi Lăng",
480
+ "397": "Đình Lập",
481
+ "398": "Hữu Lũng",
482
+ "399": "Lộc Bình",
483
+ "400": "Tràng Định",
484
+ "401": "Văn Lãng",
485
+ "402": "Văn Quan",
486
+ "403": "Lạng Sơn"
487
+ },
488
+ "NA": {
489
+ "440": "Anh Sơn",
490
+ "441": "Con Cuông",
491
+ "442": "Diễn Châu",
492
+ "443": "Đô Lương",
493
+ "444": "Hưng Nguyên",
494
+ "445": "Kỳ Sơn",
495
+ "446": "Nam Đàn",
496
+ "447": "Nghi Lộc",
497
+ "448": "Nghĩa Đàn",
498
+ "449": "Quế Phong",
499
+ "450": "Quỳ Châu",
500
+ "451": "Quỳ Hợp",
501
+ "452": "Quỳnh Lưu",
502
+ "453": "Tân Kỳ",
503
+ "454": "Thanh Chương",
504
+ "455": "Tương Dương",
505
+ "456": "Yên Thành",
506
+ "457": "TP. Vinh",
507
+ "458": "Cửa Lò",
508
+ "692": "Thái Hòa",
509
+ "725": "Hoàng Mai"
510
+ },
511
+ "NB": {
512
+ "459": "Gia Viễn",
513
+ "460": "Hoa Lư",
514
+ "461": "Kim Sơn",
515
+ "462": "Nho Quan",
516
+ "463": "Yên Khánh",
517
+ "464": "Yên Mô",
518
+ "465": "Ninh Bình",
519
+ "466": "Tam Điệp"
520
+ },
521
+ "NDD": {
522
+ "430": "Giao Thủy",
523
+ "431": "Hải Hậu",
524
+ "432": "Mỹ Lộc",
525
+ "433": "Nam Trực",
526
+ "434": "Nghĩa Hưng",
527
+ "435": "Trực Ninh",
528
+ "436": "Vụ Bản",
529
+ "437": "Xuân Trường",
530
+ "438": "Ý Yên",
531
+ "439": "Nam Định"
532
+ },
533
+ "NT": {
534
+ "467": "Bác Ái",
535
+ "468": "Ninh Hải",
536
+ "469": "Ninh Phước",
537
+ "470": "Ninh Sơn",
538
+ "471": "Thuận Bắc",
539
+ "472": "Phan Rang - Tháp Chàm",
540
+ "693": "Thuận Nam"
541
+ },
542
+ "PT": {
543
+ "473": "Cẩm Khê",
544
+ "474": "Đoan Hùng",
545
+ "475": "Hạ Hòa",
546
+ "476": "Lâm Thao",
547
+ "477": "Phù Ninh",
548
+ "478": "Tam Nông",
549
+ "479": "Tân Sơn",
550
+ "480": "Thanh Ba",
551
+ "481": "Thanh Sơn",
552
+ "482": "Thanh Thủy",
553
+ "483": "Yên Lập",
554
+ "485": "Việt Trì",
555
+ "486": "Phú Thọ"
556
+ },
557
+ "PY": {
558
+ "487": "Đông Hòa",
559
+ "488": "Đồng Xuân",
560
+ "489": "Phú Hòa",
561
+ "490": "Sơn Hòa",
562
+ "491": "Sông Cầu",
563
+ "492": "Sông Hinh",
564
+ "493": "Tây Hòa",
565
+ "494": "Tuy An",
566
+ "495": "Tuy Hòa"
567
+ },
568
+ "QB": {
569
+ "496": "Bố Trạch",
570
+ "497": "Lệ Thủy",
571
+ "498": "Minh Hóa",
572
+ "499": "Quảng Ninh",
573
+ "500": "Quảng Trạch",
574
+ "501": "Tuyên Hóa",
575
+ "502": "Đồng Hới",
576
+ "720": "Ba Đồn"
577
+ },
578
+ "QNA": {
579
+ "503": "Bắc Trà My",
580
+ "504": "Đại Lộc",
581
+ "505": "Điện Bàn",
582
+ "506": "Đông Giang",
583
+ "507": "Duy Xuyên",
584
+ "508": "Hiệp Đức",
585
+ "509": "Nam Giang",
586
+ "510": "Nam Trà My",
587
+ "511": "Núi Thành",
588
+ "512": "Phú Ninh",
589
+ "513": "Phước Sơn",
590
+ "514": "Quế Sơn",
591
+ "515": "Tây Giang",
592
+ "516": "Thăng Bình",
593
+ "517": "Tiên Phước",
594
+ "519": "Tam Kỳ",
595
+ "520": "Hội An",
596
+ "694": "Nông Sơn"
597
+ },
598
+ "QNG": {
599
+ "521": "Ba Tơ",
600
+ "522": "Bình Sơn",
601
+ "523": "Đức Phổ",
602
+ "524": "Lý Sơn",
603
+ "525": "Minh Long",
604
+ "526": "Mộ Đức",
605
+ "527": "Nghĩa Hành",
606
+ "528": "Sơn Hà",
607
+ "529": "Sơn Tây",
608
+ "530": "Sơn Tịnh",
609
+ "531": "Tây Trà",
610
+ "532": "Trà Bồng",
611
+ "533": "Tư Nghĩa",
612
+ "534": "Quảng Ngãi"
613
+ },
614
+ "QNI": {
615
+ "535": "Ba Chẽ",
616
+ "536": "Bình Liêu",
617
+ "537": "Cô Tô",
618
+ "538": "Đầm Hà",
619
+ "539": "Đông Triều",
620
+ "540": "Hải Hà",
621
+ "542": "Tiên Yên",
622
+ "543": "Vân Đồn",
623
+ "546": "Hạ Long",
624
+ "547": "Cẩm Phả",
625
+ "548": "Móng Cái",
626
+ "549": "Uông Bí",
627
+ "708": "Quảng Yên"
628
+ },
629
+ "QT": {
630
+ "550": "Cam Lộ",
631
+ "551": "Đa Krông",
632
+ "552": "Đảo Cồn cỏ",
633
+ "553": "Gio Linh",
634
+ "554": "Hải Lăng",
635
+ "555": "Hướng Hóa",
636
+ "556": "Triệu Phong",
637
+ "557": "Vĩnh Linh",
638
+ "558": "Đông Hà",
639
+ "559": "Quảng Trị"
640
+ },
641
+ "QTT": {
642
+ "732": "Bất động sản Mỹ",
643
+ "733": "Bất động sản Úc"
644
+ },
645
+ "SG": {
646
+ "53": "Quận 1",
647
+ "54": "Quận 2",
648
+ "55": "Quận 3",
649
+ "56": "Quận 4",
650
+ "57": "Quận 5",
651
+ "58": "Quận 6",
652
+ "59": "Quận 7",
653
+ "60": "Quận 8",
654
+ "61": "Quận 9",
655
+ "62": "Quận 10",
656
+ "63": "Quận 11",
657
+ "64": "Quận 12",
658
+ "65": "Bình Tân",
659
+ "66": "Bình Thạnh",
660
+ "67": "Gò Vấp",
661
+ "68": "Phú Nhuận",
662
+ "69": "Tân Bình",
663
+ "70": "Tân Phú",
664
+ "71": "Thủ Đức",
665
+ "72": "Bình Chánh",
666
+ "73": "Cần Giờ",
667
+ "74": "Củ Chi",
668
+ "75": "Hóc Môn",
669
+ "76": "Nhà Bè"
670
+ },
671
+ "SL": {
672
+ "569": "Bắc Yên",
673
+ "570": "Mai Sơn",
674
+ "571": "Mộc Châu",
675
+ "572": "Mường La",
676
+ "573": "Phù Yên",
677
+ "574": "Quỳnh Nhai",
678
+ "575": "Sông Mã",
679
+ "576": "Sốp Cộp",
680
+ "577": "Thuận Châu",
681
+ "578": "Yên Châu",
682
+ "579": "Sơn La",
683
+ "726": "Vân Hồ"
684
+ },
685
+ "ST": {
686
+ "560": "Cù Lao Dung",
687
+ "561": "Kế Sách",
688
+ "562": "Long Phú",
689
+ "563": "Mỹ Tú",
690
+ "564": "Mỹ Xuyên",
691
+ "565": "Ngã Năm",
692
+ "566": "Thạnh Trị",
693
+ "567": "Vĩnh Châu",
694
+ "568": "Sóc Trăng",
695
+ "695": "Châu Thành",
696
+ "707": "Trần Đề"
697
+ },
698
+ "TB": {
699
+ "589": "Đông Hưng",
700
+ "590": "Hưng Hà",
701
+ "591": "Kiến Xương",
702
+ "592": "Quỳnh Phụ",
703
+ "593": "Thái Thuỵ",
704
+ "594": "Tiền Hải",
705
+ "595": "Vũ Thư",
706
+ "596": "Thái Bình"
707
+ },
708
+ "TG": {
709
+ "642": "Cái Bè",
710
+ "643": "Huyện Cai Lậy",
711
+ "644": "Châu Thành",
712
+ "645": "Chợ Gạo",
713
+ "646": "Gò Công Đông",
714
+ "647": "Gò Công Tây",
715
+ "648": "Tân Phước",
716
+ "649": "Tân Phú Đông",
717
+ "650": "Mỹ Tho",
718
+ "651": "Gò Công",
719
+ "727": "Cai Lậy"
720
+ },
721
+ "TH": {
722
+ "606": "Bá Thước",
723
+ "607": "Cẩm Thủy",
724
+ "608": "Đông Sơn",
725
+ "609": "Hà Trung",
726
+ "610": "Hậu Lộc",
727
+ "611": "Hoằng Hóa",
728
+ "612": "Lang Chánh",
729
+ "613": "Mường Lát",
730
+ "614": "Nga Sơn",
731
+ "615": "Ngọc Lặc",
732
+ "616": "Như Thanh",
733
+ "617": "Như Xuân",
734
+ "618": "Nông Cống",
735
+ "619": "Quan Hóa",
736
+ "620": "Quan Sơn",
737
+ "621": "Quảng Xương",
738
+ "622": "Thạch Thành",
739
+ "623": "Thiệu Hóa",
740
+ "624": "Thọ Xuân",
741
+ "625": "Thường Xuân",
742
+ "626": "Nghi Sơn",
743
+ "627": "Triệu Sơn",
744
+ "628": "Vĩnh Lộc",
745
+ "629": "Yên Định",
746
+ "630": "Thanh Hóa",
747
+ "631": "Bỉm Sơn",
748
+ "632": "Sầm Sơn"
749
+ },
750
+ "TN": {
751
+ "597": "Đại Từ",
752
+ "598": "Định Hóa",
753
+ "599": "Đồng Hỷ",
754
+ "600": "Phổ Yên",
755
+ "601": "Phú Bình",
756
+ "602": "Phú Lương",
757
+ "603": "Võ Nhai",
758
+ "604": "Thái Nguyên",
759
+ "605": "Sông Công"
760
+ },
761
+ "TNI": {
762
+ "580": "Bến Cầu",
763
+ "581": "Châu Thành",
764
+ "582": "Dương Minh Châu",
765
+ "583": "Gò Dầu",
766
+ "584": "Hòa Thành",
767
+ "585": "Tân Biên",
768
+ "586": "Tân Châu",
769
+ "587": "Trảng Bàng",
770
+ "588": "Tây Ninh"
771
+ },
772
+ "TQ": {
773
+ "660": "Chiêm Hóa",
774
+ "661": "Hàm Yên",
775
+ "662": "Na Hang",
776
+ "663": "Sơn Dương",
777
+ "664": "Yên Sơn",
778
+ "665": "Tuyên Quang",
779
+ "712": "Lâm Bình"
780
+ },
781
+ "TTH": {
782
+ "633": "A Lưới",
783
+ "634": "Hương Thủy",
784
+ "635": "Hương Trà",
785
+ "636": "Nam Đông",
786
+ "637": "Phong Điền",
787
+ "638": "Phú Lộc",
788
+ "639": "Phú Vang",
789
+ "640": "Quảng Điền",
790
+ "641": "TP. Huế"
791
+ },
792
+ "TV": {
793
+ "652": "Càng Long",
794
+ "653": "Cầu Kè",
795
+ "654": "Cầu Ngang",
796
+ "655": "Châu Thành",
797
+ "656": "Huyện Duyên Hải",
798
+ "657": "Tiểu Cần",
799
+ "658": "Trà Cú",
800
+ "659": "Trà Vinh",
801
+ "734": "Duyên Hải"
802
+ },
803
+ "VL": {
804
+ "666": "Bình Minh",
805
+ "667": "Bình Tân",
806
+ "668": "Long Hồ",
807
+ "669": "Mang Thít",
808
+ "670": "Tam Bình",
809
+ "671": "Trà Ôn",
810
+ "672": "Vũng Liêm",
811
+ "673": "Vĩnh Long"
812
+ },
813
+ "VP": {
814
+ "674": "Bình Xuyên",
815
+ "675": "Lập Thạch",
816
+ "676": "Tam Đảo",
817
+ "677": "Tam Dương",
818
+ "678": "Vĩnh Tường",
819
+ "679": "Yên Lạc",
820
+ "680": "Vĩnh Yên",
821
+ "681": "Phúc Yên",
822
+ "696": "Sông Lô"
823
+ },
824
+ "VT": {
825
+ "96": "Châu Đức",
826
+ "97": "Côn Đảo",
827
+ "98": "Đất Đỏ",
828
+ "99": "Long Điền",
829
+ "100": "Phú Mỹ",
830
+ "101": "Xuyên Mộc",
831
+ "102": "Vũng Tàu",
832
+ "103": "Bà Rịa"
833
+ },
834
+ "YB": {
835
+ "682": "Lục Yên",
836
+ "683": "Mù Cang Chải",
837
+ "684": "Trạm Tấu",
838
+ "685": "Trấn Yên",
839
+ "686": "Văn Chấn",
840
+ "687": "Văn Yên",
841
+ "688": "Yên Bình",
842
+ "689": "Yên Bái",
843
+ "713": "Nghĩa Lộ"
844
+ }
845
+ }
city-map.json ADDED
@@ -0,0 +1,65 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "AG": "An Giang",
3
+ "BD": "Bình Dương",
4
+ "BDD": "Bình Định",
5
+ "BG": "Bắc Giang",
6
+ "BK": "Bắc Kạn",
7
+ "BL": "Bạc Liêu",
8
+ "BN": "Bắc Ninh",
9
+ "BP": "Bình Phước",
10
+ "BTH": "Bình Thuận",
11
+ "BTR": "Bến Tre",
12
+ "CB": "Cao Bằng",
13
+ "CM": "Cà Mau",
14
+ "CT": "Cần Thơ",
15
+ "DDB": "Điện Biên",
16
+ "DDL": "Đắk Lắk",
17
+ "DDN": "Đà Nẵng",
18
+ "DDT": "Đồng Tháp",
19
+ "DNA": "Đồng Nai",
20
+ "DNO": "Đắk Nông",
21
+ "GL": "Gia Lai",
22
+ "HB": "Hòa Bình",
23
+ "HD": "Hải Dương",
24
+ "HG": "Hà Giang",
25
+ "HGI": "Hậu Giang",
26
+ "HN": "Hà Nội",
27
+ "HNA": "Hà Nam",
28
+ "HP": "Hải Phòng",
29
+ "HT": "Hà Tĩnh",
30
+ "HY": "Hưng Yên",
31
+ "KG": "Kiên Giang",
32
+ "KH": "Khánh Hòa",
33
+ "KT": "Kon Tum",
34
+ "LA": "Long An",
35
+ "LCA": "Lào Cai",
36
+ "LCH": "Lai Châu",
37
+ "LDD": "Lâm Đồng",
38
+ "LS": "Lạng Sơn",
39
+ "NA": "Nghệ An",
40
+ "NB": "Ninh Bình",
41
+ "NDD": "Nam Định",
42
+ "NT": "Ninh Thuận",
43
+ "PT": "Phú Thọ",
44
+ "PY": "Phú Yên",
45
+ "QB": "Quảng Bình",
46
+ "QNA": "Quảng Nam",
47
+ "QNG": "Quảng Ngãi",
48
+ "QNI": "Quảng Ninh",
49
+ "QT": "Quảng Trị",
50
+ "SG": "Hồ Chí Minh",
51
+ "SL": "Sơn La",
52
+ "ST": "Sóc Trăng",
53
+ "TB": "Thái Bình",
54
+ "TG": "Tiền Giang",
55
+ "TH": "Thanh Hóa",
56
+ "TN": "Thái Nguyên",
57
+ "TNI": "Tây Ninh",
58
+ "TQ": "Tuyên Quang",
59
+ "TTH": "Thừa Thiên Huế",
60
+ "TV": "Trà Vinh",
61
+ "VL": "Vĩnh Long",
62
+ "VP": "Vĩnh Phúc",
63
+ "VT": "Bà Rịa Vũng Tàu",
64
+ "YB": "Yên Bái"
65
+ }
models/mm-text-no-price/assets.json ADDED
@@ -0,0 +1 @@
 
 
1
+ {"class_name": "MultiModalPredictor", "column_types": {"Title": "text", "Area": "numerical", "Location": "text", "Time stamp": "numerical", "Certification status": "categorical", "Direction": "categorical", "Bedrooms": "numerical", "Bathrooms": "numerical", "Front width": "numerical", "Floor": "categorical", "Description": "text", "Image URL": "categorical", "Road width": "numerical", "City_code": "categorical", "DistrictId": "categorical", "Balcony_Direction": "categorical", "Longitude": "numerical", "Lattitude": "numerical", "Price": "numerical"}, "label_column": "Price", "problem_type": "regression", "presets": null, "eval_metric_name": "rmse", "validation_metric_name": "rmse", "output_shape": 1, "classes": null, "save_path": "/kaggle/working/mm-nlp-image-transformer", "pretrained": true, "pretrained_path": null, "fit_called": true, "best_score": null, "total_train_time": null, "version": "0.8.2"}
models/mm-text-no-price/config.yaml ADDED
@@ -0,0 +1,163 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ model:
2
+ names:
3
+ - categorical_transformer
4
+ - fusion_transformer
5
+ - hf_text
6
+ - numerical_transformer
7
+ hf_text:
8
+ checkpoint_name: local://hf_text
9
+ gradient_checkpointing: false
10
+ pooling_mode: cls
11
+ data_types:
12
+ - text
13
+ tokenizer_name: hf_auto
14
+ max_text_len: 512
15
+ insert_sep: true
16
+ low_cpu_mem_usage: false
17
+ text_segment_num: 2
18
+ stochastic_chunk: false
19
+ text_aug_detect_length: 10
20
+ text_trivial_aug_maxscale: 0.0
21
+ text_train_augment_types: null
22
+ categorical_transformer:
23
+ out_features: 192
24
+ d_token: 192
25
+ ffn_d_hidden: 192
26
+ num_trans_blocks: 0
27
+ num_attn_heads: 8
28
+ residual_dropout: 0.0
29
+ attention_dropout: 0.2
30
+ ffn_dropout: 0.1
31
+ normalization: layer_norm
32
+ ffn_activation: reglu
33
+ head_activation: relu
34
+ data_types:
35
+ - categorical
36
+ additive_attention: false
37
+ share_qv_weights: false
38
+ numerical_transformer:
39
+ out_features: 192
40
+ d_token: 192
41
+ ffn_d_hidden: 192
42
+ num_trans_blocks: 0
43
+ num_attn_heads: 8
44
+ residual_dropout: 0.0
45
+ attention_dropout: 0.2
46
+ ffn_dropout: 0.1
47
+ normalization: layer_norm
48
+ ffn_activation: reglu
49
+ head_activation: relu
50
+ data_types:
51
+ - numerical
52
+ embedding_arch:
53
+ - linear
54
+ - relu
55
+ merge: concat
56
+ additive_attention: false
57
+ share_qv_weights: false
58
+ fusion_transformer:
59
+ hidden_size: 192
60
+ n_blocks: 3
61
+ attention_n_heads: 8
62
+ adapt_in_features: max
63
+ attention_dropout: 0.2
64
+ residual_dropout: 0.0
65
+ ffn_dropout: 0.1
66
+ ffn_d_hidden: 192
67
+ normalization: layer_norm
68
+ ffn_activation: geglu
69
+ head_activation: relu
70
+ data_types: null
71
+ additive_attention: false
72
+ share_qv_weights: false
73
+ data:
74
+ image:
75
+ missing_value_strategy: zero
76
+ text:
77
+ normalize_text: false
78
+ categorical:
79
+ minimum_cat_count: 100
80
+ maximum_num_cat: 20
81
+ convert_to_text: false
82
+ numerical:
83
+ convert_to_text: false
84
+ scaler_with_mean: true
85
+ scaler_with_std: true
86
+ document:
87
+ missing_value_strategy: zero
88
+ label:
89
+ numerical_label_preprocessing: standardscaler
90
+ pos_label: null
91
+ mixup:
92
+ turn_on: false
93
+ mixup_alpha: 0.8
94
+ cutmix_alpha: 1.0
95
+ cutmix_minmax: null
96
+ prob: 1.0
97
+ switch_prob: 0.5
98
+ mode: batch
99
+ turn_off_epoch: 5
100
+ label_smoothing: 0.1
101
+ templates:
102
+ turn_on: false
103
+ num_templates: 30
104
+ template_length: 2048
105
+ preset_templates:
106
+ - super_glue
107
+ - rte
108
+ custom_templates: null
109
+ optimization:
110
+ optim_type: adamw
111
+ learning_rate: 0.0001
112
+ weight_decay: 0.001
113
+ lr_choice: layerwise_decay
114
+ lr_decay: 0.9
115
+ lr_schedule: cosine_decay
116
+ max_epochs: 10
117
+ max_steps: -1
118
+ warmup_steps: 0.1
119
+ end_lr: 0
120
+ lr_mult: 1
121
+ patience: 10
122
+ val_check_interval: 0.5
123
+ check_val_every_n_epoch: 1
124
+ skip_final_val: false
125
+ gradient_clip_val: 1
126
+ gradient_clip_algorithm: norm
127
+ track_grad_norm: -1
128
+ log_every_n_steps: 10
129
+ top_k: 3
130
+ top_k_average_method: greedy_soup
131
+ efficient_finetune: null
132
+ lora:
133
+ module_filter: null
134
+ filter:
135
+ - query
136
+ - value
137
+ - ^q$
138
+ - ^v$
139
+ - ^k$
140
+ - ^o$
141
+ r: 8
142
+ alpha: 8
143
+ loss_function: auto
144
+ focal_loss:
145
+ alpha: null
146
+ gamma: 2.0
147
+ reduction: mean
148
+ env:
149
+ num_gpus: 1
150
+ num_nodes: 1
151
+ batch_size: 32
152
+ per_gpu_batch_size: 8
153
+ eval_batch_size_ratio: 4
154
+ per_gpu_batch_size_evaluation: null
155
+ precision: 16
156
+ num_workers: 2
157
+ num_workers_evaluation: 2
158
+ fast_dev_run: false
159
+ deterministic: false
160
+ auto_select_gpus: true
161
+ strategy: null
162
+ deepspeed_allgather_size: 1000000000.0
163
+ deepspeed_allreduce_size: 1000000000.0
models/mm-text-no-price/data_processors.pkl ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:53336fa325f49948fed81d515d4a468dffcd03d5eeaa90a116a4d61b556540d7
3
+ size 15581
models/mm-text-no-price/df_preprocessor.pkl ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:e852f953943f31fd34f6d356dbd2b05f8b8860737a75786a42f2138109d0678e
3
+ size 26784
models/mm-text-no-price/hf_text/config.json ADDED
@@ -0,0 +1,30 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "_name_or_path": "bert-base-multilingual-uncased",
3
+ "architectures": [
4
+ "BertForMaskedLM"
5
+ ],
6
+ "attention_probs_dropout_prob": 0.1,
7
+ "classifier_dropout": null,
8
+ "directionality": "bidi",
9
+ "hidden_act": "gelu",
10
+ "hidden_dropout_prob": 0.1,
11
+ "hidden_size": 768,
12
+ "initializer_range": 0.02,
13
+ "intermediate_size": 3072,
14
+ "layer_norm_eps": 1e-12,
15
+ "max_position_embeddings": 512,
16
+ "model_type": "bert",
17
+ "num_attention_heads": 12,
18
+ "num_hidden_layers": 12,
19
+ "pad_token_id": 0,
20
+ "pooler_fc_size": 768,
21
+ "pooler_num_attention_heads": 12,
22
+ "pooler_num_fc_layers": 3,
23
+ "pooler_size_per_head": 128,
24
+ "pooler_type": "first_token_transform",
25
+ "position_embedding_type": "absolute",
26
+ "transformers_version": "4.26.1",
27
+ "type_vocab_size": 2,
28
+ "use_cache": true,
29
+ "vocab_size": 105879
30
+ }
models/mm-text-no-price/hf_text/special_tokens_map.json ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
 
1
+ {
2
+ "cls_token": "[CLS]",
3
+ "mask_token": "[MASK]",
4
+ "pad_token": "[PAD]",
5
+ "sep_token": "[SEP]",
6
+ "unk_token": "[UNK]"
7
+ }
models/mm-text-no-price/hf_text/tokenizer.json ADDED
The diff for this file is too large to render. See raw diff
 
models/mm-text-no-price/hf_text/tokenizer_config.json ADDED
@@ -0,0 +1,14 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "cls_token": "[CLS]",
3
+ "do_lower_case": true,
4
+ "mask_token": "[MASK]",
5
+ "model_max_length": 512,
6
+ "name_or_path": "bert-base-multilingual-uncased",
7
+ "pad_token": "[PAD]",
8
+ "sep_token": "[SEP]",
9
+ "special_tokens_map_file": null,
10
+ "strip_accents": null,
11
+ "tokenize_chinese_chars": true,
12
+ "tokenizer_class": "BertTokenizer",
13
+ "unk_token": "[UNK]"
14
+ }
models/mm-text-no-price/hf_text/vocab.txt ADDED
The diff for this file is too large to render. See raw diff
 
models/mm-text-no-price/hparams.yaml ADDED
@@ -0,0 +1,16 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ optim_type: adamw
2
+ lr_choice: layerwise_decay
3
+ lr_schedule: cosine_decay
4
+ lr: 0.0001
5
+ lr_decay: 0.9
6
+ end_lr: 0
7
+ lr_mult: 1
8
+ weight_decay: 0.001
9
+ warmup_steps: 0.1
10
+ validation_metric_name: rmse
11
+ custom_metric_func: null
12
+ efficient_finetune: null
13
+ trainable_param_names: []
14
+ mixup_fn: null
15
+ mixup_off_epoch: 5
16
+ skip_final_val: false
models/mm-text-no-price/model.ckpt ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:c424f2e2472c2606f5436b98f8d3b856c6b400ddf9537e1f6cff2e1a83aa65c0
3
+ size 706840833
requirements.txt ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
 
1
+ -f https://download.pytorch.org/whl/cpu/torch_stable.html
2
+ torch==1.13.1+cpu
3
+ -f https://download.pytorch.org/whl/cpu/torch_stable.html
4
+ torchvision==0.14.1+cpu
5
+
6
+ autogluon.multimodal==0.8.2
7
+ autogluon.tabular[all,skex]==0.8.2
8
+
9
+ streamlit==1.27.0