vi-fix 1.0.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- vi_fix-1.0.0/LICENSE +19 -0
- vi_fix-1.0.0/PKG-INFO +100 -0
- vi_fix-1.0.0/README.md +81 -0
- vi_fix-1.0.0/pyproject.toml +33 -0
- vi_fix-1.0.0/setup.cfg +4 -0
- vi_fix-1.0.0/vi_fix/__init__.py +113 -0
- vi_fix-1.0.0/vi_fix.egg-info/PKG-INFO +100 -0
- vi_fix-1.0.0/vi_fix.egg-info/SOURCES.txt +8 -0
- vi_fix-1.0.0/vi_fix.egg-info/dependency_links.txt +1 -0
- vi_fix-1.0.0/vi_fix.egg-info/top_level.txt +1 -0
vi_fix-1.0.0/LICENSE
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
Copyright (c) 2026 MinhSangGD
|
|
2
|
+
|
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
4
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
5
|
+
in the Software without restriction, including without limitation the rights
|
|
6
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
7
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
8
|
+
furnished to do so, subject to the following conditions:
|
|
9
|
+
|
|
10
|
+
The above copyright notice and this permission notice shall be included in all
|
|
11
|
+
copies or substantial portions of the Software.
|
|
12
|
+
|
|
13
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
14
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
15
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
16
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
17
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
18
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
19
|
+
SOFTWARE.
|
vi_fix-1.0.0/PKG-INFO
ADDED
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: vi-fix
|
|
3
|
+
Version: 1.0.0
|
|
4
|
+
Summary: Thư viện siêu nhẹ hỗ trợ xử lý Tiếng Việt: chuẩn hóa dấu, bỏ dấu, chuyển số thành chữ, phân tích CCCD và hơn thế nữa!
|
|
5
|
+
Author-email: MinhSangGD <minhsanggd@mscrew.io.vn>
|
|
6
|
+
Project-URL: Homepage, https://lib.mscrew.io.vn/vi-fix/py
|
|
7
|
+
Project-URL: Bug Tracker, https://github.com/MinhSangGDVN/vi-fix/issues
|
|
8
|
+
Keywords: vietnamese,normalization,vi-fix,cccd,telco,remove-diacritics
|
|
9
|
+
Classifier: Development Status :: 5 - Production/Stable
|
|
10
|
+
Classifier: Intended Audience :: Developers
|
|
11
|
+
Classifier: Programming Language :: Python :: 3
|
|
12
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
13
|
+
Classifier: Operating System :: OS Independent
|
|
14
|
+
Classifier: Topic :: Text Processing :: Linguistic
|
|
15
|
+
Requires-Python: >=3.7
|
|
16
|
+
Description-Content-Type: text/markdown
|
|
17
|
+
License-File: LICENSE
|
|
18
|
+
Dynamic: license-file
|
|
19
|
+
|
|
20
|
+
# vi-fix 🛠️
|
|
21
|
+
|
|
22
|
+
**vi-fix** là một thư viện Python mã nguồn mở siêu nhẹ (Zero Dependency), được tối ưu hóa để xử lý các bài toán đặc thù của Tiếng Việt như chuẩn hóa dấu, bỏ dấu, xử lý CCCD, nhà mạng và dữ liệu hành chính mới nhất.
|
|
23
|
+
|
|
24
|
+
🔗 **Tài liệu hướng dẫn chi tiết:** [https://lib.mscrew.io.vn/vi-fix/py](https://lib.mscrew.io.vn/vi-fix/py)
|
|
25
|
+
|
|
26
|
+
---
|
|
27
|
+
|
|
28
|
+
## ✨ Tính năng nổi bật
|
|
29
|
+
|
|
30
|
+
- **Siêu nhẹ:** Dung lượng chỉ khoảng 5KB, không phụ thuộc vào thư viện bên thứ ba.
|
|
31
|
+
- **Cập nhật 2026:** Danh sách 34 tỉnh thành mới nhất theo phân cấp hành chính Việt Nam.
|
|
32
|
+
- **Thông minh:** Phân tích sâu dữ liệu từ số CCCD (Giới tính, Năm sinh, Tỉnh thành).
|
|
33
|
+
- **Tiện lợi:** Tên hàm ngắn gọn (`fix`, `nosign`, `clean`...), dễ nhớ, dễ gõ.
|
|
34
|
+
|
|
35
|
+
---
|
|
36
|
+
|
|
37
|
+
## 🚀 Cài đặt
|
|
38
|
+
|
|
39
|
+
Cài đặt thông qua pip:
|
|
40
|
+
|
|
41
|
+
```bash
|
|
42
|
+
pip install vi-fix
|
|
43
|
+
|
|
44
|
+
```
|
|
45
|
+
## 📖 Hướng dẫn sử dụng
|
|
46
|
+
Nên sử dụng biệt danh vf để mã nguồn của bạn gọn gàng hơn:
|
|
47
|
+
```python
|
|
48
|
+
import vi_fix as vf
|
|
49
|
+
|
|
50
|
+
# 1. Chuẩn hóa dấu (hoà -> hòa)
|
|
51
|
+
print(vf.fix("Khánh Hoà bình yên")) # Output: Khánh Hòa bình yên
|
|
52
|
+
|
|
53
|
+
# 2. Bỏ dấu Tiếng Việt
|
|
54
|
+
print(vf.nosign("Tiếng Việt có dấu")) # Output: Tieng Viet co dau
|
|
55
|
+
|
|
56
|
+
# 3. Phân tích CCCD (12 số)
|
|
57
|
+
info = vf.parse_cccd("037098000123")
|
|
58
|
+
print(info)
|
|
59
|
+
# Output: {'gender': 'Nam', 'birth_year': 1998, 'province_code': '037', 'valid': True}
|
|
60
|
+
|
|
61
|
+
# 4. Kiểm tra nhà mạng
|
|
62
|
+
print(vf.get_telco("0961234567")) # Output: Viettel
|
|
63
|
+
|
|
64
|
+
# 5. Định dạng tiền tệ
|
|
65
|
+
print(vf.money(1500000)) # Output: 1.500.000đ
|
|
66
|
+
|
|
67
|
+
# 6. Đọc số thành chữ
|
|
68
|
+
print(vf.num2str("102", lang="vi")) # Output: một không hai
|
|
69
|
+
|
|
70
|
+
# 7. Danh sách 34 tỉnh thành (Update 2026)
|
|
71
|
+
provinces = vf.get_provinces()
|
|
72
|
+
print(len(provinces)) # Output: 34
|
|
73
|
+
|
|
74
|
+
```
|
|
75
|
+
## 🛠️ Danh sách 15 hàm tiện ích
|
|
76
|
+
| Hàm | Mô tả |
|
|
77
|
+
|---|---|
|
|
78
|
+
| fix(text) | Sửa vị trí đặt dấu thanh chuẩn (hoà -> hòa). |
|
|
79
|
+
| nosign(text) | Chuyển văn bản có dấu thành không dấu. |
|
|
80
|
+
| clean(text) | Loại bỏ khoảng trắng thừa giữa các từ. |
|
|
81
|
+
| slug(text) | Tạo chuỗi định danh (slug) cho URL. |
|
|
82
|
+
| v_caps(text) | Viết hoa chuẩn tên riêng Tiếng Việt. |
|
|
83
|
+
| is_vi(text) | Kiểm tra văn bản có chứa ký tự Tiếng Việt không. |
|
|
84
|
+
| num2str(num, lang) | Chuyển dãy số thành chữ (Hỗ trợ vi/en). |
|
|
85
|
+
| money(amount) | Định dạng số thành tiền tệ VNĐ (1.000.000đ). |
|
|
86
|
+
| clean_phone(phone) | Chuẩn hóa mọi định dạng SĐT về đầu số 0. |
|
|
87
|
+
| get_telco(phone) | Nhận diện nhà mạng từ số điện thoại. |
|
|
88
|
+
| get_provinces(format) | Lấy danh sách 34 tỉnh thành (list/json/str). |
|
|
89
|
+
| is_email(email) | Kiểm tra định dạng email hợp lệ. |
|
|
90
|
+
| is_cccd(number) | Kiểm tra định dạng CCCD 12 chữ số. |
|
|
91
|
+
| parse_cccd(cccd) | Phân tích Giới tính, Năm sinh, Tỉnh từ CCCD. |
|
|
92
|
+
| gen_pass(length) | Tạo mật khẩu/OTP ngẫu nhiên nhanh. |
|
|
93
|
+
## 📄 Giấy phép (License)
|
|
94
|
+
Dự án này sử dụng giấy phép **MIT License** - Bạn có quyền tự do sử dụng, sửa đổi và phân phối.
|
|
95
|
+
## ✍️ Tác giả
|
|
96
|
+
Phát triển bởi **MinhSangGD**
|
|
97
|
+
* **GitHub:** [MinhSangGDVN](https://github.com/MinhSangGDVN)
|
|
98
|
+
* **Project Link:** [vi-fix](https://github.com/MinhSangGDVN/vi-fix)
|
|
99
|
+
|
|
100
|
+
Cũng có sẵn phiên bản dành cho [JavaScript](https://github.com/MinhSangGDVN/vi-fix-js)
|
vi_fix-1.0.0/README.md
ADDED
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
# vi-fix 🛠️
|
|
2
|
+
|
|
3
|
+
**vi-fix** là một thư viện Python mã nguồn mở siêu nhẹ (Zero Dependency), được tối ưu hóa để xử lý các bài toán đặc thù của Tiếng Việt như chuẩn hóa dấu, bỏ dấu, xử lý CCCD, nhà mạng và dữ liệu hành chính mới nhất.
|
|
4
|
+
|
|
5
|
+
🔗 **Tài liệu hướng dẫn chi tiết:** [https://lib.mscrew.io.vn/vi-fix/py](https://lib.mscrew.io.vn/vi-fix/py)
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## ✨ Tính năng nổi bật
|
|
10
|
+
|
|
11
|
+
- **Siêu nhẹ:** Dung lượng chỉ khoảng 5KB, không phụ thuộc vào thư viện bên thứ ba.
|
|
12
|
+
- **Cập nhật 2026:** Danh sách 34 tỉnh thành mới nhất theo phân cấp hành chính Việt Nam.
|
|
13
|
+
- **Thông minh:** Phân tích sâu dữ liệu từ số CCCD (Giới tính, Năm sinh, Tỉnh thành).
|
|
14
|
+
- **Tiện lợi:** Tên hàm ngắn gọn (`fix`, `nosign`, `clean`...), dễ nhớ, dễ gõ.
|
|
15
|
+
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
## 🚀 Cài đặt
|
|
19
|
+
|
|
20
|
+
Cài đặt thông qua pip:
|
|
21
|
+
|
|
22
|
+
```bash
|
|
23
|
+
pip install vi-fix
|
|
24
|
+
|
|
25
|
+
```
|
|
26
|
+
## 📖 Hướng dẫn sử dụng
|
|
27
|
+
Nên sử dụng biệt danh vf để mã nguồn của bạn gọn gàng hơn:
|
|
28
|
+
```python
|
|
29
|
+
import vi_fix as vf
|
|
30
|
+
|
|
31
|
+
# 1. Chuẩn hóa dấu (hoà -> hòa)
|
|
32
|
+
print(vf.fix("Khánh Hoà bình yên")) # Output: Khánh Hòa bình yên
|
|
33
|
+
|
|
34
|
+
# 2. Bỏ dấu Tiếng Việt
|
|
35
|
+
print(vf.nosign("Tiếng Việt có dấu")) # Output: Tieng Viet co dau
|
|
36
|
+
|
|
37
|
+
# 3. Phân tích CCCD (12 số)
|
|
38
|
+
info = vf.parse_cccd("037098000123")
|
|
39
|
+
print(info)
|
|
40
|
+
# Output: {'gender': 'Nam', 'birth_year': 1998, 'province_code': '037', 'valid': True}
|
|
41
|
+
|
|
42
|
+
# 4. Kiểm tra nhà mạng
|
|
43
|
+
print(vf.get_telco("0961234567")) # Output: Viettel
|
|
44
|
+
|
|
45
|
+
# 5. Định dạng tiền tệ
|
|
46
|
+
print(vf.money(1500000)) # Output: 1.500.000đ
|
|
47
|
+
|
|
48
|
+
# 6. Đọc số thành chữ
|
|
49
|
+
print(vf.num2str("102", lang="vi")) # Output: một không hai
|
|
50
|
+
|
|
51
|
+
# 7. Danh sách 34 tỉnh thành (Update 2026)
|
|
52
|
+
provinces = vf.get_provinces()
|
|
53
|
+
print(len(provinces)) # Output: 34
|
|
54
|
+
|
|
55
|
+
```
|
|
56
|
+
## 🛠️ Danh sách 15 hàm tiện ích
|
|
57
|
+
| Hàm | Mô tả |
|
|
58
|
+
|---|---|
|
|
59
|
+
| fix(text) | Sửa vị trí đặt dấu thanh chuẩn (hoà -> hòa). |
|
|
60
|
+
| nosign(text) | Chuyển văn bản có dấu thành không dấu. |
|
|
61
|
+
| clean(text) | Loại bỏ khoảng trắng thừa giữa các từ. |
|
|
62
|
+
| slug(text) | Tạo chuỗi định danh (slug) cho URL. |
|
|
63
|
+
| v_caps(text) | Viết hoa chuẩn tên riêng Tiếng Việt. |
|
|
64
|
+
| is_vi(text) | Kiểm tra văn bản có chứa ký tự Tiếng Việt không. |
|
|
65
|
+
| num2str(num, lang) | Chuyển dãy số thành chữ (Hỗ trợ vi/en). |
|
|
66
|
+
| money(amount) | Định dạng số thành tiền tệ VNĐ (1.000.000đ). |
|
|
67
|
+
| clean_phone(phone) | Chuẩn hóa mọi định dạng SĐT về đầu số 0. |
|
|
68
|
+
| get_telco(phone) | Nhận diện nhà mạng từ số điện thoại. |
|
|
69
|
+
| get_provinces(format) | Lấy danh sách 34 tỉnh thành (list/json/str). |
|
|
70
|
+
| is_email(email) | Kiểm tra định dạng email hợp lệ. |
|
|
71
|
+
| is_cccd(number) | Kiểm tra định dạng CCCD 12 chữ số. |
|
|
72
|
+
| parse_cccd(cccd) | Phân tích Giới tính, Năm sinh, Tỉnh từ CCCD. |
|
|
73
|
+
| gen_pass(length) | Tạo mật khẩu/OTP ngẫu nhiên nhanh. |
|
|
74
|
+
## 📄 Giấy phép (License)
|
|
75
|
+
Dự án này sử dụng giấy phép **MIT License** - Bạn có quyền tự do sử dụng, sửa đổi và phân phối.
|
|
76
|
+
## ✍️ Tác giả
|
|
77
|
+
Phát triển bởi **MinhSangGD**
|
|
78
|
+
* **GitHub:** [MinhSangGDVN](https://github.com/MinhSangGDVN)
|
|
79
|
+
* **Project Link:** [vi-fix](https://github.com/MinhSangGDVN/vi-fix)
|
|
80
|
+
|
|
81
|
+
Cũng có sẵn phiên bản dành cho [JavaScript](https://github.com/MinhSangGDVN/vi-fix-js)
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
[build-system]
|
|
2
|
+
requires = ["setuptools>=61.0"]
|
|
3
|
+
build-backend = "setuptools.build_meta"
|
|
4
|
+
|
|
5
|
+
[project]
|
|
6
|
+
name = "vi-fix"
|
|
7
|
+
version = "1.0.0"
|
|
8
|
+
authors = [
|
|
9
|
+
{ name="MinhSangGD", email="minhsanggd@mscrew.io.vn" },
|
|
10
|
+
]
|
|
11
|
+
description = "Thư viện siêu nhẹ hỗ trợ xử lý Tiếng Việt: chuẩn hóa dấu, bỏ dấu, chuyển số thành chữ, phân tích CCCD và hơn thế nữa!"
|
|
12
|
+
readme = "README.md"
|
|
13
|
+
requires-python = ">=3.7"
|
|
14
|
+
keywords = [
|
|
15
|
+
"vietnamese",
|
|
16
|
+
"normalization",
|
|
17
|
+
"vi-fix",
|
|
18
|
+
"cccd",
|
|
19
|
+
"telco",
|
|
20
|
+
"remove-diacritics"
|
|
21
|
+
]
|
|
22
|
+
classifiers = [
|
|
23
|
+
"Development Status :: 5 - Production/Stable",
|
|
24
|
+
"Intended Audience :: Developers",
|
|
25
|
+
"Programming Language :: Python :: 3",
|
|
26
|
+
"License :: OSI Approved :: MIT License",
|
|
27
|
+
"Operating System :: OS Independent",
|
|
28
|
+
"Topic :: Text Processing :: Linguistic",
|
|
29
|
+
]
|
|
30
|
+
|
|
31
|
+
[project.urls]
|
|
32
|
+
"Homepage" = "https://lib.mscrew.io.vn/vi-fix/py"
|
|
33
|
+
"Bug Tracker" = "https://github.com/MinhSangGDVN/vi-fix/issues"
|
vi_fix-1.0.0/setup.cfg
ADDED
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import re
|
|
2
|
+
import json
|
|
3
|
+
import random
|
|
4
|
+
import string
|
|
5
|
+
PROVINCES = [
|
|
6
|
+
"An Giang", "Bắc Ninh", "Cao Bằng", "Cần Thơ", "Cà Mau", "Đà Nẵng",
|
|
7
|
+
"Đắk Lắk", "Điện Biên", "Đồng Nai", "Đồng Tháp", "Gia Lai", "Hà Nội",
|
|
8
|
+
"Hà Tĩnh", "Hải Phòng", "Hồ Chí Minh", "Huế", "Hưng Yên", "Khánh Hòa",
|
|
9
|
+
"Lai Châu", "Lạng Sơn", "Lào Cai", "Lâm Đồng", "Nghệ An", "Ninh Bình",
|
|
10
|
+
"Phú Thọ", "Quảng Ngãi", "Quảng Ninh", "Quảng Trị", "Sơn La", "Tây Ninh",
|
|
11
|
+
"Thái Nguyên", "Thanh Hóa", "Tuyên Quang", "Vĩnh Long"
|
|
12
|
+
]
|
|
13
|
+
TELCO_PREFIX = {
|
|
14
|
+
"Viettel": ["032", "033", "034", "035", "036", "037", "038", "039", "086", "096", "097", "098"],
|
|
15
|
+
"Vinaphone": ["081", "082", "083", "084", "085", "088", "091", "094"],
|
|
16
|
+
"Mobifone": ["070", "076", "077", "078", "079", "089", "090", "093"],
|
|
17
|
+
"Vietnamobile": ["052", "056", "058", "092"],
|
|
18
|
+
"Wintel": ["055"],
|
|
19
|
+
"iTel": ["087"]
|
|
20
|
+
}
|
|
21
|
+
def fix(text: str) -> str:
|
|
22
|
+
rules = {
|
|
23
|
+
"hoà": "hòa", "hoả": "hỏa", "hoá": "hóa", "hoã": "hõa", "hoạ": "họa",
|
|
24
|
+
"uý": "úy", "uỳ": "ùy", "uỷ": "ủy", "uỹ": "ũy", "uỵ": "ụy",
|
|
25
|
+
"oè": "òe", "oé": "óe", "oẻ": "ỏe", "oẽ": "õe", "oẹ": "ọe",
|
|
26
|
+
}
|
|
27
|
+
for old, new in rules.items():
|
|
28
|
+
text = text.replace(old, new)
|
|
29
|
+
return text
|
|
30
|
+
def nosign(text: str) -> str:
|
|
31
|
+
patterns = {
|
|
32
|
+
'[àáảãạăằắẳẵặâầấẩẫậ]': 'a', '[èéẻẽẹêềếểễệ]': 'e', '[ìíỉĩị]': 'i',
|
|
33
|
+
'[òóỏõọôồốổỗộơờớởỡợ]': 'o', '[ùúủũụưừứửữự]': 'u', '[ỳýỷỹỵ]': 'y',
|
|
34
|
+
'[đ]': 'd', '[ÀÁẢÃẠĂẰẮẲẴẶÂẦẤẨẪẬ]': 'A', '[ÈÉẺẼẸÊỀẾỂỄỆ]': 'E',
|
|
35
|
+
'[ÌÍỈĨỊ]': 'I', '[ÒÓỎÕỌÔỒỐỔỖỘƠỜỚỞỠỢ]': 'O', '[ÙÚỦŨỤƯỪỨỬỮỰ]': 'U',
|
|
36
|
+
'[ỲÝYỶỸỴ]': 'Y', '[Đ]': 'D',
|
|
37
|
+
}
|
|
38
|
+
for pattern, replacement in patterns.items():
|
|
39
|
+
text = re.sub(pattern, replacement, text)
|
|
40
|
+
return text
|
|
41
|
+
def num2str(num: str, lang: str = "vi") -> str:
|
|
42
|
+
maps = {
|
|
43
|
+
"vi": ["không", "một", "hai", "ba", "bốn", "năm", "sáu", "bảy", "tám", "chín"],
|
|
44
|
+
"en": ["zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"]
|
|
45
|
+
}
|
|
46
|
+
mapping = maps.get(lang, maps["vi"])
|
|
47
|
+
return " ".join([mapping[int(d)] for d in str(num) if d.isdigit()])
|
|
48
|
+
def clean(text: str) -> str:
|
|
49
|
+
return re.sub(r'\s+', ' ', text).strip()
|
|
50
|
+
def get_provinces(format: str = "list") -> any:
|
|
51
|
+
if format == "json":
|
|
52
|
+
return json.dumps(PROVINCES, ensure_ascii=False)
|
|
53
|
+
elif format == "str":
|
|
54
|
+
return ", ".join(PROVINCES)
|
|
55
|
+
return PROVINCES
|
|
56
|
+
def money(amount: int, symbol: str = "đ") -> str:
|
|
57
|
+
try:
|
|
58
|
+
return "{:,.0f}".format(amount).replace(",", ".") + symbol
|
|
59
|
+
except:
|
|
60
|
+
return str(amount)
|
|
61
|
+
def slug(text: str) -> str:
|
|
62
|
+
text = nosign(text).lower().strip()
|
|
63
|
+
text = re.sub(r'[^a-z0-9\s-]', '', text)
|
|
64
|
+
text = re.sub(r'[\s-]+', '-', text)
|
|
65
|
+
return text
|
|
66
|
+
def is_vi(text: str) -> bool:
|
|
67
|
+
vi_chars = "àáảãạăằắẳẵặâầấẩẫậèéẻẽẹêềếểễệìíỉĩịòóỏõọôồốổỗộơờớởỡợùúủũụưừứửữựỳýỷỹỵđ"
|
|
68
|
+
return any(char in text.lower() for char in vi_chars)
|
|
69
|
+
def get_telco(phone: str) -> str:
|
|
70
|
+
phone = re.sub(r'\D', '', str(phone))
|
|
71
|
+
if phone.startswith("84"):
|
|
72
|
+
phone = "0" + phone[2:]
|
|
73
|
+
prefix3 = phone[:3]
|
|
74
|
+
for telco, prefixes in TELCO_PREFIX.items():
|
|
75
|
+
if prefix3 in prefixes:
|
|
76
|
+
return telco
|
|
77
|
+
return "Unknown"
|
|
78
|
+
def clean_phone(phone: str, prefix: str = "0") -> str:
|
|
79
|
+
phone = re.sub(r'\D', '', str(phone))
|
|
80
|
+
if phone.startswith("84"):
|
|
81
|
+
phone = prefix + phone[2:]
|
|
82
|
+
return phone
|
|
83
|
+
def v_caps(text: str) -> str:
|
|
84
|
+
words = text.lower().split()
|
|
85
|
+
return " ".join([w.capitalize() for w in words])
|
|
86
|
+
def is_email(email: str) -> bool:
|
|
87
|
+
regex = r'^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$'
|
|
88
|
+
return bool(re.match(regex, email))
|
|
89
|
+
def gen_pass(length: int = 8) -> str:
|
|
90
|
+
chars = string.ascii_letters + string.digits
|
|
91
|
+
return ''.join(random.choice(chars) for _ in range(length))
|
|
92
|
+
def is_cccd(number: str) -> bool:
|
|
93
|
+
return bool(re.match(r'^\d{12}$', str(number)))
|
|
94
|
+
def parse_cccd(cccd: str) -> dict:
|
|
95
|
+
if not is_cccd(cccd):
|
|
96
|
+
return None
|
|
97
|
+
province_code = cccd[:3]
|
|
98
|
+
gender_digit = int(cccd[3])
|
|
99
|
+
gender = "Nam" if gender_digit % 2 == 0 else "Nữ"
|
|
100
|
+
century = 1900 + (gender_digit // 2) * 100
|
|
101
|
+
year_short = int(cccd[4:6])
|
|
102
|
+
full_year = century + year_short
|
|
103
|
+
return {
|
|
104
|
+
"gender": gender,
|
|
105
|
+
"birth_year": full_year,
|
|
106
|
+
"province_code": province_code,
|
|
107
|
+
"valid": True
|
|
108
|
+
}
|
|
109
|
+
def time_ago(seconds: int) -> str:
|
|
110
|
+
if seconds < 60: return "vừa xong"
|
|
111
|
+
if seconds < 3600: return f"{seconds // 60} phút trước"
|
|
112
|
+
if seconds < 86400: return f"{seconds // 3600} giờ trước"
|
|
113
|
+
return f"{seconds // 86400} ngày trước"
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: vi-fix
|
|
3
|
+
Version: 1.0.0
|
|
4
|
+
Summary: Thư viện siêu nhẹ hỗ trợ xử lý Tiếng Việt: chuẩn hóa dấu, bỏ dấu, chuyển số thành chữ, phân tích CCCD và hơn thế nữa!
|
|
5
|
+
Author-email: MinhSangGD <minhsanggd@mscrew.io.vn>
|
|
6
|
+
Project-URL: Homepage, https://lib.mscrew.io.vn/vi-fix/py
|
|
7
|
+
Project-URL: Bug Tracker, https://github.com/MinhSangGDVN/vi-fix/issues
|
|
8
|
+
Keywords: vietnamese,normalization,vi-fix,cccd,telco,remove-diacritics
|
|
9
|
+
Classifier: Development Status :: 5 - Production/Stable
|
|
10
|
+
Classifier: Intended Audience :: Developers
|
|
11
|
+
Classifier: Programming Language :: Python :: 3
|
|
12
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
13
|
+
Classifier: Operating System :: OS Independent
|
|
14
|
+
Classifier: Topic :: Text Processing :: Linguistic
|
|
15
|
+
Requires-Python: >=3.7
|
|
16
|
+
Description-Content-Type: text/markdown
|
|
17
|
+
License-File: LICENSE
|
|
18
|
+
Dynamic: license-file
|
|
19
|
+
|
|
20
|
+
# vi-fix 🛠️
|
|
21
|
+
|
|
22
|
+
**vi-fix** là một thư viện Python mã nguồn mở siêu nhẹ (Zero Dependency), được tối ưu hóa để xử lý các bài toán đặc thù của Tiếng Việt như chuẩn hóa dấu, bỏ dấu, xử lý CCCD, nhà mạng và dữ liệu hành chính mới nhất.
|
|
23
|
+
|
|
24
|
+
🔗 **Tài liệu hướng dẫn chi tiết:** [https://lib.mscrew.io.vn/vi-fix/py](https://lib.mscrew.io.vn/vi-fix/py)
|
|
25
|
+
|
|
26
|
+
---
|
|
27
|
+
|
|
28
|
+
## ✨ Tính năng nổi bật
|
|
29
|
+
|
|
30
|
+
- **Siêu nhẹ:** Dung lượng chỉ khoảng 5KB, không phụ thuộc vào thư viện bên thứ ba.
|
|
31
|
+
- **Cập nhật 2026:** Danh sách 34 tỉnh thành mới nhất theo phân cấp hành chính Việt Nam.
|
|
32
|
+
- **Thông minh:** Phân tích sâu dữ liệu từ số CCCD (Giới tính, Năm sinh, Tỉnh thành).
|
|
33
|
+
- **Tiện lợi:** Tên hàm ngắn gọn (`fix`, `nosign`, `clean`...), dễ nhớ, dễ gõ.
|
|
34
|
+
|
|
35
|
+
---
|
|
36
|
+
|
|
37
|
+
## 🚀 Cài đặt
|
|
38
|
+
|
|
39
|
+
Cài đặt thông qua pip:
|
|
40
|
+
|
|
41
|
+
```bash
|
|
42
|
+
pip install vi-fix
|
|
43
|
+
|
|
44
|
+
```
|
|
45
|
+
## 📖 Hướng dẫn sử dụng
|
|
46
|
+
Nên sử dụng biệt danh vf để mã nguồn của bạn gọn gàng hơn:
|
|
47
|
+
```python
|
|
48
|
+
import vi_fix as vf
|
|
49
|
+
|
|
50
|
+
# 1. Chuẩn hóa dấu (hoà -> hòa)
|
|
51
|
+
print(vf.fix("Khánh Hoà bình yên")) # Output: Khánh Hòa bình yên
|
|
52
|
+
|
|
53
|
+
# 2. Bỏ dấu Tiếng Việt
|
|
54
|
+
print(vf.nosign("Tiếng Việt có dấu")) # Output: Tieng Viet co dau
|
|
55
|
+
|
|
56
|
+
# 3. Phân tích CCCD (12 số)
|
|
57
|
+
info = vf.parse_cccd("037098000123")
|
|
58
|
+
print(info)
|
|
59
|
+
# Output: {'gender': 'Nam', 'birth_year': 1998, 'province_code': '037', 'valid': True}
|
|
60
|
+
|
|
61
|
+
# 4. Kiểm tra nhà mạng
|
|
62
|
+
print(vf.get_telco("0961234567")) # Output: Viettel
|
|
63
|
+
|
|
64
|
+
# 5. Định dạng tiền tệ
|
|
65
|
+
print(vf.money(1500000)) # Output: 1.500.000đ
|
|
66
|
+
|
|
67
|
+
# 6. Đọc số thành chữ
|
|
68
|
+
print(vf.num2str("102", lang="vi")) # Output: một không hai
|
|
69
|
+
|
|
70
|
+
# 7. Danh sách 34 tỉnh thành (Update 2026)
|
|
71
|
+
provinces = vf.get_provinces()
|
|
72
|
+
print(len(provinces)) # Output: 34
|
|
73
|
+
|
|
74
|
+
```
|
|
75
|
+
## 🛠️ Danh sách 15 hàm tiện ích
|
|
76
|
+
| Hàm | Mô tả |
|
|
77
|
+
|---|---|
|
|
78
|
+
| fix(text) | Sửa vị trí đặt dấu thanh chuẩn (hoà -> hòa). |
|
|
79
|
+
| nosign(text) | Chuyển văn bản có dấu thành không dấu. |
|
|
80
|
+
| clean(text) | Loại bỏ khoảng trắng thừa giữa các từ. |
|
|
81
|
+
| slug(text) | Tạo chuỗi định danh (slug) cho URL. |
|
|
82
|
+
| v_caps(text) | Viết hoa chuẩn tên riêng Tiếng Việt. |
|
|
83
|
+
| is_vi(text) | Kiểm tra văn bản có chứa ký tự Tiếng Việt không. |
|
|
84
|
+
| num2str(num, lang) | Chuyển dãy số thành chữ (Hỗ trợ vi/en). |
|
|
85
|
+
| money(amount) | Định dạng số thành tiền tệ VNĐ (1.000.000đ). |
|
|
86
|
+
| clean_phone(phone) | Chuẩn hóa mọi định dạng SĐT về đầu số 0. |
|
|
87
|
+
| get_telco(phone) | Nhận diện nhà mạng từ số điện thoại. |
|
|
88
|
+
| get_provinces(format) | Lấy danh sách 34 tỉnh thành (list/json/str). |
|
|
89
|
+
| is_email(email) | Kiểm tra định dạng email hợp lệ. |
|
|
90
|
+
| is_cccd(number) | Kiểm tra định dạng CCCD 12 chữ số. |
|
|
91
|
+
| parse_cccd(cccd) | Phân tích Giới tính, Năm sinh, Tỉnh từ CCCD. |
|
|
92
|
+
| gen_pass(length) | Tạo mật khẩu/OTP ngẫu nhiên nhanh. |
|
|
93
|
+
## 📄 Giấy phép (License)
|
|
94
|
+
Dự án này sử dụng giấy phép **MIT License** - Bạn có quyền tự do sử dụng, sửa đổi và phân phối.
|
|
95
|
+
## ✍️ Tác giả
|
|
96
|
+
Phát triển bởi **MinhSangGD**
|
|
97
|
+
* **GitHub:** [MinhSangGDVN](https://github.com/MinhSangGDVN)
|
|
98
|
+
* **Project Link:** [vi-fix](https://github.com/MinhSangGDVN/vi-fix)
|
|
99
|
+
|
|
100
|
+
Cũng có sẵn phiên bản dành cho [JavaScript](https://github.com/MinhSangGDVN/vi-fix-js)
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
vi_fix
|