# Vinorm compatible for Windows 64-bit
Vietnamese Text Normalization System - Pure Python Implementation
## Giới thiệu
Đây là phiên bản vinorm được viết lại hoàn toàn bằng Python, tương thích với Windows 64-bit và các hệ điều hành khác. Phiên bản này giải quyết lỗi **WinError 193** mà nhiều người gặp phải khi sử dụng vinorm gốc trên Windows.
### Tại sao cần phiên bản này?
Vinorm gốc sử dụng một file thực thi C++ được compile cho Linux, không thể chạy trên Windows. Phiên bản này:
- ✅ **100% Pure Python** - không cần file thực thi C++
- ✅ **Cross-platform** - chạy trên Windows, macOS, Linux
- ✅ **Không dependencies** - chỉ sử dụng thư viện chuẩn Python
- ✅ **API tương thích** - drop-in replacement cho vinorm gốc
- ✅ **Performance tốt** - tối ưu hóa cho tốc độ xử lý
## Cài đặt
### Cách 1: Cài đặt trực tiếp từ file
```bash
pip install vinormx
```
### Cách 2: Cài đặt từ source code
1. Download file `vinormx.py`
2. Đặt vào thư mục project của bạn
3. Import và sử dụng:
```python
from vinormx import TTSnorm
text = "Hàm này được phát triển từ 8/2019. Có phải tháng 12/2020 đã có vaccine phòng ngừa Covid-19 xmz ?"
normalized = TTSnorm(text)
print(normalized)
```
## Sử dụng
### Cách sử dụng cơ bản
```python
from vinormx import TTSnorm
# Chuẩn hóa văn bản cơ bản
text = "Tôi có 100 USD và 2.5 triệu VND ngày 25/12/2023"
result = TTSnorm(text)
print(result)
# Output: tôi có một trăm usd và hai phẩy năm triệu vnd ngày hai mười lăm tháng mười hai năm hai nghìn không trăm hai mười ba .
```
### Các tùy chọn nâng cao
```python
# Giữ nguyên dấu câu
TTSnorm(text, punc=True)
# Giữ nguyên chữ hoa
TTSnorm(text, lower=False)
# Xử lý từ không xác định (spell out)
TTSnorm(text, unknown=False)
# Chỉ sử dụng regex (không dùng từ điển)
TTSnorm(text, rule=True)
```
### Ví dụ chi tiết
```python
from vinormx import TTSnorm
test_cases = [
"Dr. Smith vs Mr. Johnson @ 15:30",
"Nhiệt độ hôm nay là 37°C, độ ẩm 85%",
"Công ty ABC có 1,234 nhân viên",
"COVID-19 bắt đầu từ 12/2019",
"Giá cả tăng 15% so với năm 2020"
]
for text in test_cases:
print(f"Input: {text}")
print(f"Output: {TTSnorm(text)}")
print()
```
## Tính năng
### ✅ Chuẩn hóa số
- Số nguyên: `123` → `một trăm hai mười ba`
- Số thập phân: `12.5` → `mười hai phẩy năm`
- Năm: `2023` → `hai nghìn không trăm hai mười ba`
### ✅ Chuẩn hóa ngày tháng
- `25/12/2023` → `ngày hai mười lăm tháng mười hai năm hai nghìn không trăm hai mười ba`
- `12/2020` → `tháng mười hai năm hai nghìn không trăm hai mười`
### ✅ Chuẩn hóa từ viết tắt
- `Dr.` → `bác sĩ`
- `COVID-19` → `covid mười chín`
- `USA` → `hoa kỳ`
- `WHO` → `tổ chức y tế thế giới`
### ✅ Chuẩn hóa ký tự đặc biệt
- `&` → `và`
- `%` → `phần trăm`
- `@` → `a còng`
- `°C` → `độ c`
- `$` → `đô la`
### ✅ Xử lý từ không xác định
- `xmz` → `ích em giét` (spell out từng ký tự)
## So sánh với vinorm gốc
| Tính năng | Vinorm gốc | Vinorm X |
| --------------------- | ----------------- | ------------------- |
| Hỗ trợ Windows 64-bit | ❌ (WinError 193) | ✅ |
| Dependencies | C++ executable | Pure Python |
| Cross-platform | ❌ | ✅ |
| Performance | Rất nhanh | Nhanh |
| API compatibility | - | ✅ 100% tương thích |
## API Reference
### `TTSnorm(text, punc=False, unknown=True, lower=True, rule=False)`
**Parameters:**
- `text` (str): Văn bản cần chuẩn hóa
- `punc` (bool, optional): Nếu `True`, giữ nguyên dấu câu. Default: `False`
- `unknown` (bool, optional): Nếu `True`, giữ nguyên từ không xác định. Default: `True`
- `lower` (bool, optional): Nếu `True`, chuyển về chữ thường. Default: `True`
- `rule` (bool, optional): Nếu `True`, chỉ sử dụng regex. Default: `False`
**Returns:**
- `str`: Văn bản đã được chuẩn hóa
## Troubleshooting
### Lỗi WinError 193 với vinorm gốc
Nếu bạn gặp lỗi này:
```
OSError: [WinError 193] %1 is not a valid Win32 application
```
**Giải pháp:** Sử dụng vinormx này thay thế!
### Migration từ vinorm gốc
```python
# Cũ
from vinorm import TTSnorm
# Mới - chỉ cần thay đổi import
from vinormx import TTSnorm
# API hoàn toàn giống nhau!
```
## Performance
Benchmarks trên Windows 10 64-bit:
| Text length | Vinorm X |
| ------------ | -------- |
| 100 chars | ~0.01s |
| 1,000 chars | ~0.05s |
| 10,000 chars | ~0.3s |
## Requirements
- Python 3.6+
- Windows, macOS, hoặc Linux
- Không cần dependencies ngoài
## Contributing
Contributions welcome! Please feel free to submit a Pull Request.
## License
MIT License - Dựa trên vinorm gốc của [v-nhandt21](https://github.com/v-nhandt21/Vinorm) và [NoahDrisort](https://github.com/NoahDrisort/vinorm_cpp_version).
## Credits
- **Original Vinorm**: [v-nhandt21/Vinorm](https://github.com/v-nhandt21/Vinorm)
- **Original C++ Version**: [NoahDrisort/vinorm_cpp_version](https://github.com/NoahDrisort/vinorm_cpp_version)
- **Authors**: Lê Tấn Đăng Tâm, Đỗ Trí Nhân (AILab, HCMUS)
- **Supervisor**: Prof. Vũ Hải Quân
---
**🎯 Giải pháp hoàn hảo cho lỗi WinError 193 trên Windows!**
Raw data
{
"_id": null,
"home_page": "https://github.com/genievn/vinormx",
"name": "vinormx",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.6",
"maintainer_email": null,
"keywords": "vietnamese text normalization nlp tts speech synthesis modular comprehensive dictionaries regex rules",
"author": "Nguyen Huu Thanh",
"author_email": "nguyenhuuthanh@gmail.com",
"download_url": "https://files.pythonhosted.org/packages/f3/db/a2f0828003b03994e5072f6541e1565236d95b388e18c8870ece9cd46c7b/vinormx-1.0.8.tar.gz",
"platform": null,
"description": "# Vinorm compatible for Windows 64-bit\r\n\r\nVietnamese Text Normalization System - Pure Python Implementation\r\n\r\n## Gi\u1edbi thi\u1ec7u\r\n\r\n\u0110\u00e2y l\u00e0 phi\u00ean b\u1ea3n vinorm \u0111\u01b0\u1ee3c vi\u1ebft l\u1ea1i ho\u00e0n to\u00e0n b\u1eb1ng Python, t\u01b0\u01a1ng th\u00edch v\u1edbi Windows 64-bit v\u00e0 c\u00e1c h\u1ec7 \u0111i\u1ec1u h\u00e0nh kh\u00e1c. Phi\u00ean b\u1ea3n n\u00e0y gi\u1ea3i quy\u1ebft l\u1ed7i **WinError 193** m\u00e0 nhi\u1ec1u ng\u01b0\u1eddi g\u1eb7p ph\u1ea3i khi s\u1eed d\u1ee5ng vinorm g\u1ed1c tr\u00ean Windows.\r\n\r\n### T\u1ea1i sao c\u1ea7n phi\u00ean b\u1ea3n n\u00e0y?\r\n\r\nVinorm g\u1ed1c s\u1eed d\u1ee5ng m\u1ed9t file th\u1ef1c thi C++ \u0111\u01b0\u1ee3c compile cho Linux, kh\u00f4ng th\u1ec3 ch\u1ea1y tr\u00ean Windows. Phi\u00ean b\u1ea3n n\u00e0y:\r\n\r\n- \u2705 **100% Pure Python** - kh\u00f4ng c\u1ea7n file th\u1ef1c thi C++\r\n- \u2705 **Cross-platform** - ch\u1ea1y tr\u00ean Windows, macOS, Linux\r\n- \u2705 **Kh\u00f4ng dependencies** - ch\u1ec9 s\u1eed d\u1ee5ng th\u01b0 vi\u1ec7n chu\u1ea9n Python\r\n- \u2705 **API t\u01b0\u01a1ng th\u00edch** - drop-in replacement cho vinorm g\u1ed1c\r\n- \u2705 **Performance t\u1ed1t** - t\u1ed1i \u01b0u h\u00f3a cho t\u1ed1c \u0111\u1ed9 x\u1eed l\u00fd\r\n\r\n## C\u00e0i \u0111\u1eb7t\r\n\r\n### C\u00e1ch 1: C\u00e0i \u0111\u1eb7t tr\u1ef1c ti\u1ebfp t\u1eeb file\r\n\r\n```bash\r\npip install vinormx\r\n```\r\n\r\n### C\u00e1ch 2: C\u00e0i \u0111\u1eb7t t\u1eeb source code\r\n\r\n1. Download file `vinormx.py`\r\n2. \u0110\u1eb7t v\u00e0o th\u01b0 m\u1ee5c project c\u1ee7a b\u1ea1n\r\n3. Import v\u00e0 s\u1eed d\u1ee5ng:\r\n\r\n```python\r\nfrom vinormx import TTSnorm\r\n\r\ntext = \"H\u00e0m n\u00e0y \u0111\u01b0\u1ee3c ph\u00e1t tri\u1ec3n t\u1eeb 8/2019. C\u00f3 ph\u1ea3i th\u00e1ng 12/2020 \u0111\u00e3 c\u00f3 vaccine ph\u00f2ng ng\u1eeba Covid-19 xmz ?\"\r\nnormalized = TTSnorm(text)\r\nprint(normalized)\r\n```\r\n\r\n## S\u1eed d\u1ee5ng\r\n\r\n### C\u00e1ch s\u1eed d\u1ee5ng c\u01a1 b\u1ea3n\r\n\r\n```python\r\nfrom vinormx import TTSnorm\r\n\r\n# Chu\u1ea9n h\u00f3a v\u0103n b\u1ea3n c\u01a1 b\u1ea3n\r\ntext = \"T\u00f4i c\u00f3 100 USD v\u00e0 2.5 tri\u1ec7u VND ng\u00e0y 25/12/2023\"\r\nresult = TTSnorm(text)\r\nprint(result)\r\n# Output: t\u00f4i c\u00f3 m\u1ed9t tr\u0103m usd v\u00e0 hai ph\u1ea9y n\u0103m tri\u1ec7u vnd ng\u00e0y hai m\u01b0\u1eddi l\u0103m th\u00e1ng m\u01b0\u1eddi hai n\u0103m hai ngh\u00ecn kh\u00f4ng tr\u0103m hai m\u01b0\u1eddi ba .\r\n```\r\n\r\n### C\u00e1c t\u00f9y ch\u1ecdn n\u00e2ng cao\r\n\r\n```python\r\n# Gi\u1eef nguy\u00ean d\u1ea5u c\u00e2u\r\nTTSnorm(text, punc=True)\r\n\r\n# Gi\u1eef nguy\u00ean ch\u1eef hoa\r\nTTSnorm(text, lower=False)\r\n\r\n# X\u1eed l\u00fd t\u1eeb kh\u00f4ng x\u00e1c \u0111\u1ecbnh (spell out)\r\nTTSnorm(text, unknown=False)\r\n\r\n# Ch\u1ec9 s\u1eed d\u1ee5ng regex (kh\u00f4ng d\u00f9ng t\u1eeb \u0111i\u1ec3n)\r\nTTSnorm(text, rule=True)\r\n```\r\n\r\n### V\u00ed d\u1ee5 chi ti\u1ebft\r\n\r\n```python\r\nfrom vinormx import TTSnorm\r\n\r\ntest_cases = [\r\n \"Dr. Smith vs Mr. Johnson @ 15:30\",\r\n \"Nhi\u1ec7t \u0111\u1ed9 h\u00f4m nay l\u00e0 37\u00b0C, \u0111\u1ed9 \u1ea9m 85%\",\r\n \"C\u00f4ng ty ABC c\u00f3 1,234 nh\u00e2n vi\u00ean\",\r\n \"COVID-19 b\u1eaft \u0111\u1ea7u t\u1eeb 12/2019\",\r\n \"Gi\u00e1 c\u1ea3 t\u0103ng 15% so v\u1edbi n\u0103m 2020\"\r\n]\r\n\r\nfor text in test_cases:\r\n print(f\"Input: {text}\")\r\n print(f\"Output: {TTSnorm(text)}\")\r\n print()\r\n```\r\n\r\n## T\u00ednh n\u0103ng\r\n\r\n### \u2705 Chu\u1ea9n h\u00f3a s\u1ed1\r\n\r\n- S\u1ed1 nguy\u00ean: `123` \u2192 `m\u1ed9t tr\u0103m hai m\u01b0\u1eddi ba`\r\n- S\u1ed1 th\u1eadp ph\u00e2n: `12.5` \u2192 `m\u01b0\u1eddi hai ph\u1ea9y n\u0103m`\r\n- N\u0103m: `2023` \u2192 `hai ngh\u00ecn kh\u00f4ng tr\u0103m hai m\u01b0\u1eddi ba`\r\n\r\n### \u2705 Chu\u1ea9n h\u00f3a ng\u00e0y th\u00e1ng\r\n\r\n- `25/12/2023` \u2192 `ng\u00e0y hai m\u01b0\u1eddi l\u0103m th\u00e1ng m\u01b0\u1eddi hai n\u0103m hai ngh\u00ecn kh\u00f4ng tr\u0103m hai m\u01b0\u1eddi ba`\r\n- `12/2020` \u2192 `th\u00e1ng m\u01b0\u1eddi hai n\u0103m hai ngh\u00ecn kh\u00f4ng tr\u0103m hai m\u01b0\u1eddi`\r\n\r\n### \u2705 Chu\u1ea9n h\u00f3a t\u1eeb vi\u1ebft t\u1eaft\r\n\r\n- `Dr.` \u2192 `b\u00e1c s\u0129`\r\n- `COVID-19` \u2192 `covid m\u01b0\u1eddi ch\u00edn`\r\n- `USA` \u2192 `hoa k\u1ef3`\r\n- `WHO` \u2192 `t\u1ed5 ch\u1ee9c y t\u1ebf th\u1ebf gi\u1edbi`\r\n\r\n### \u2705 Chu\u1ea9n h\u00f3a k\u00fd t\u1ef1 \u0111\u1eb7c bi\u1ec7t\r\n\r\n- `&` \u2192 `v\u00e0`\r\n- `%` \u2192 `ph\u1ea7n tr\u0103m`\r\n- `@` \u2192 `a c\u00f2ng`\r\n- `\u00b0C` \u2192 `\u0111\u1ed9 c`\r\n- `$` \u2192 `\u0111\u00f4 la`\r\n\r\n### \u2705 X\u1eed l\u00fd t\u1eeb kh\u00f4ng x\u00e1c \u0111\u1ecbnh\r\n\r\n- `xmz` \u2192 `\u00edch em gi\u00e9t` (spell out t\u1eebng k\u00fd t\u1ef1)\r\n\r\n## So s\u00e1nh v\u1edbi vinorm g\u1ed1c\r\n\r\n| T\u00ednh n\u0103ng | Vinorm g\u1ed1c | Vinorm X |\r\n| --------------------- | ----------------- | ------------------- |\r\n| H\u1ed7 tr\u1ee3 Windows 64-bit | \u274c (WinError 193) | \u2705 |\r\n| Dependencies | C++ executable | Pure Python |\r\n| Cross-platform | \u274c | \u2705 |\r\n| Performance | R\u1ea5t nhanh | Nhanh |\r\n| API compatibility | - | \u2705 100% t\u01b0\u01a1ng th\u00edch |\r\n\r\n## API Reference\r\n\r\n### `TTSnorm(text, punc=False, unknown=True, lower=True, rule=False)`\r\n\r\n**Parameters:**\r\n\r\n- `text` (str): V\u0103n b\u1ea3n c\u1ea7n chu\u1ea9n h\u00f3a\r\n- `punc` (bool, optional): N\u1ebfu `True`, gi\u1eef nguy\u00ean d\u1ea5u c\u00e2u. Default: `False`\r\n- `unknown` (bool, optional): N\u1ebfu `True`, gi\u1eef nguy\u00ean t\u1eeb kh\u00f4ng x\u00e1c \u0111\u1ecbnh. Default: `True`\r\n- `lower` (bool, optional): N\u1ebfu `True`, chuy\u1ec3n v\u1ec1 ch\u1eef th\u01b0\u1eddng. Default: `True`\r\n- `rule` (bool, optional): N\u1ebfu `True`, ch\u1ec9 s\u1eed d\u1ee5ng regex. Default: `False`\r\n\r\n**Returns:**\r\n\r\n- `str`: V\u0103n b\u1ea3n \u0111\u00e3 \u0111\u01b0\u1ee3c chu\u1ea9n h\u00f3a\r\n\r\n## Troubleshooting\r\n\r\n### L\u1ed7i WinError 193 v\u1edbi vinorm g\u1ed1c\r\n\r\nN\u1ebfu b\u1ea1n g\u1eb7p l\u1ed7i n\u00e0y:\r\n\r\n```\r\nOSError: [WinError 193] %1 is not a valid Win32 application\r\n```\r\n\r\n**Gi\u1ea3i ph\u00e1p:** S\u1eed d\u1ee5ng vinormx n\u00e0y thay th\u1ebf!\r\n\r\n### Migration t\u1eeb vinorm g\u1ed1c\r\n\r\n```python\r\n# C\u0169\r\nfrom vinorm import TTSnorm\r\n\r\n# M\u1edbi - ch\u1ec9 c\u1ea7n thay \u0111\u1ed5i import\r\nfrom vinormx import TTSnorm\r\n\r\n# API ho\u00e0n to\u00e0n gi\u1ed1ng nhau!\r\n```\r\n\r\n## Performance\r\n\r\nBenchmarks tr\u00ean Windows 10 64-bit:\r\n\r\n| Text length | Vinorm X |\r\n| ------------ | -------- |\r\n| 100 chars | ~0.01s |\r\n| 1,000 chars | ~0.05s |\r\n| 10,000 chars | ~0.3s |\r\n\r\n## Requirements\r\n\r\n- Python 3.6+\r\n- Windows, macOS, ho\u1eb7c Linux\r\n- Kh\u00f4ng c\u1ea7n dependencies ngo\u00e0i\r\n\r\n## Contributing\r\n\r\nContributions welcome! Please feel free to submit a Pull Request.\r\n\r\n## License\r\n\r\nMIT License - D\u1ef1a tr\u00ean vinorm g\u1ed1c c\u1ee7a [v-nhandt21](https://github.com/v-nhandt21/Vinorm) v\u00e0 [NoahDrisort](https://github.com/NoahDrisort/vinorm_cpp_version).\r\n\r\n## Credits\r\n\r\n- **Original Vinorm**: [v-nhandt21/Vinorm](https://github.com/v-nhandt21/Vinorm)\r\n- **Original C++ Version**: [NoahDrisort/vinorm_cpp_version](https://github.com/NoahDrisort/vinorm_cpp_version)\r\n- **Authors**: L\u00ea T\u1ea5n \u0110\u0103ng T\u00e2m, \u0110\u1ed7 Tr\u00ed Nh\u00e2n (AILab, HCMUS)\r\n- **Supervisor**: Prof. V\u0169 H\u1ea3i Qu\u00e2n\r\n\r\n---\r\n\r\n**\ud83c\udfaf Gi\u1ea3i ph\u00e1p ho\u00e0n h\u1ea3o cho l\u1ed7i WinError 193 tr\u00ean Windows!**\r\n",
"bugtrack_url": null,
"license": null,
"summary": "Advanced Vietnamese Text Normalization System - Modular Architecture with Comprehensive Dictionaries and Regex Rules",
"version": "1.0.8",
"project_urls": {
"Bug Reports": "https://github.com/genievn/vinormx/issues",
"Homepage": "https://github.com/genievn/vinormx",
"Original C++ Version": "https://github.com/NoahDrisort/vinorm_cpp_version",
"Original Vinorm": "https://github.com/v-nhandt21/Vinorm",
"Source": "https://github.com/genievn/vinormx"
},
"split_keywords": [
"vietnamese",
"text",
"normalization",
"nlp",
"tts",
"speech",
"synthesis",
"modular",
"comprehensive",
"dictionaries",
"regex",
"rules"
],
"urls": [
{
"comment_text": null,
"digests": {
"blake2b_256": "2ffa3734d13a1a7e864cdca7e9dc5271199b9621aa7dc905546aa16a38996fd1",
"md5": "78b8ecc7b941aa313062096e74261670",
"sha256": "f5fabca038070837abe9cee499987c00829cd33f18d3ac77235d40bf298bd2f0"
},
"downloads": -1,
"filename": "vinormx-1.0.8-py3-none-any.whl",
"has_sig": false,
"md5_digest": "78b8ecc7b941aa313062096e74261670",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.6",
"size": 117989,
"upload_time": "2025-09-06T02:07:56",
"upload_time_iso_8601": "2025-09-06T02:07:56.372477Z",
"url": "https://files.pythonhosted.org/packages/2f/fa/3734d13a1a7e864cdca7e9dc5271199b9621aa7dc905546aa16a38996fd1/vinormx-1.0.8-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "f3dba2f0828003b03994e5072f6541e1565236d95b388e18c8870ece9cd46c7b",
"md5": "fcc7efed2a854d95f73ebc2b9b8c0366",
"sha256": "cc36fc27922df59faa440a1afa1ab482a60fc8460d692b6beafa396ef3732f3d"
},
"downloads": -1,
"filename": "vinormx-1.0.8.tar.gz",
"has_sig": false,
"md5_digest": "fcc7efed2a854d95f73ebc2b9b8c0366",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.6",
"size": 109572,
"upload_time": "2025-09-06T02:07:57",
"upload_time_iso_8601": "2025-09-06T02:07:57.991291Z",
"url": "https://files.pythonhosted.org/packages/f3/db/a2f0828003b03994e5072f6541e1565236d95b388e18c8870ece9cd46c7b/vinormx-1.0.8.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-09-06 02:07:57",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "genievn",
"github_project": "vinormx",
"github_not_found": true,
"lcname": "vinormx"
}