|
from singleton_decorator import singleton
|
|
import re
|
|
from Roman import RomanVietnamese
|
|
from Cardinal import CardinalVietnamese
|
|
|
|
|
|
@singleton
|
|
class OrdinalVietnamese:
|
|
"""
|
|
Các bước:
|
|
- 1 Lọc bỏ dấu phẩy và khoảng trắng
|
|
- 2 Kiểm tra số La Mã và chuyển đổi thành chuỗi số nguyên nếu có
|
|
- 3 Nếu là số La Mã, đặt tiền tố là "thứ"
|
|
- 4 Nếu không, kiểm tra xem có phải là số thứ tự tiếng Việt không (ví dụ: "thứ nhất", "thứ 2", "thứ ba")
|
|
- 5 Chuyển đổi chuỗi số còn lại thành Cardinal, và thêm "thứ" vào trước
|
|
- 6 Áp dụng các quy tắc đặc biệt cho số thứ tự tiếng Việt
|
|
"""
|
|
|
|
def __init__(self):
|
|
super().__init__()
|
|
self.filter_regex = re.compile(r"[, ]")
|
|
self.vietnamese_ordinal_regex = re.compile(r"(?i)(thứ\s*)?(\d+|nhất|nhì|hai|ba|tư|năm|sáu|bảy|tám|chín|mười)")
|
|
self.roman = RomanVietnamese()
|
|
self.cardinal = CardinalVietnamese()
|
|
|
|
self.special_cases = {
|
|
"nhất": "thứ nhất",
|
|
"nhì": "thứ nhì",
|
|
"hai": "thứ hai",
|
|
"ba": "thứ ba",
|
|
"tư": "thứ tư",
|
|
"năm": "thứ năm",
|
|
"sáu": "thứ sáu",
|
|
"bảy": "thứ bảy",
|
|
"tám": "thứ tám",
|
|
"chín": "thứ chín",
|
|
"mười": "thứ mười"
|
|
}
|
|
|
|
def convert(self, token: str) -> str:
|
|
token = self.filter_regex.sub("", token)
|
|
|
|
if self.roman.check_if_roman(token):
|
|
number, _ = self.roman.convert(token)
|
|
|
|
return f"thứ {number}"
|
|
|
|
match = self.vietnamese_ordinal_regex.fullmatch(token)
|
|
if match:
|
|
prefix = match.group(1) or ""
|
|
number = match.group(2)
|
|
|
|
if number.lower() in self.special_cases:
|
|
return self.special_cases[number.lower()]
|
|
|
|
if number.isdigit():
|
|
cardinal = self.cardinal.convert(number)
|
|
return f"thứ {cardinal}"
|
|
|
|
return f"{prefix}{number}"
|
|
|
|
return f"thứ {self.cardinal.convert(token)}"
|
|
|
|
|
|
if __name__ == "__main__":
|
|
ordinal_converter = OrdinalVietnamese()
|
|
|
|
examples = ["nhất", "thứ nhì", "thứ 3", "thứ tư", "thứ năm", "thứ 10", "21", "100", "1000", "II", "IV"]
|
|
|
|
for example in examples:
|
|
result = ordinal_converter.convert(example)
|
|
print(f"Số thứ tự: {example}")
|
|
print(f"Chuyển đổi: {result}")
|
|
print() |