| |
|
| |
|
| |
|
| | import re
|
| | import sys
|
| | import unicodedata
|
| |
|
| |
|
| | def Text(text):
|
| | """provide a wrapper for python string
|
| | map byte to str (python 3)
|
| | all string in utf-8 encoding
|
| | normalize string to NFC
|
| | """
|
| | if not is_unicode(text):
|
| | text = text.decode("utf-8")
|
| | text = unicodedata.normalize("NFC", text)
|
| | return text
|
| |
|
| |
|
| | def is_unicode(text):
|
| | return type(text) == str
|
| |
|
| |
|
| | UPCASE_CHARACTERS = "QWERTYUIOPASDFGHJKLZXCVBNMÀÁẠẢÃÂẦẤẬẨẪĂẰẮẶẲẴÈÉẸẺẼÊỀẾỆỂỄÌÍỊỈĨÒÓỌỎÕÔỒỐỘỔỖƠỜỚỢỞỠÙÚỤỦŨƯỪỨỰỬỮỲÝỴỶỸĐ"
|
| | LOWCASE_CHARACTERS = UPCASE_CHARACTERS.lower()
|
| |
|
| | specials = [r"==>", r"->", r"\.\.\.", r">>", r"=\)\)"]
|
| | digit = r"\d+([\.,_]\d+)+"
|
| | email = r"[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+"
|
| |
|
| |
|
| |
|
| |
|
| |
|
| | urls = [
|
| | r"(ftp|http|https)?://(?:www\.)?[\w.-]+(?:\.[\w\.-]+)+[\w\-\._~:/?#[\]@!$&\'()*+,;=]+",
|
| | r"""(?:(https|http|ftp):(?:/{1,3}|[a-z0-9%])|[a-z0-9.\-]+[.](?:[a-z]{2,13}))
|
| | (?:[^\s()<>{}\[\]]+|\([^\s()]*?\([^\s()]+\)[^\s()]*?\)|\([^\s]+?\)(...))+
|
| | (?:\([^\s()]*?\([^\s()]+\)[^\s()]*?\)|\([^\s]+?\)|[^\s`!()\[\]{};:'".,<>?«»“”‘’])
|
| | |(?:(?<!@)[a-z0-9]+(?:[.\-][a-z0-9]+)*[.](?:[a-z]{2,13})\b/?(?!@))""",
|
| | r"(?:[a-zA-Z0-9-]+\.)+[a-zA-Z]{2,}",
|
| | r"www\.[a-zA-Z0-9-]+\.[a-zA-Z0-9-]+\.[a-zA-Z]{2,}",
|
| | ]
|
| |
|
| | datetime = [
|
| |
|
| | r"\d{1,4}\/\d{4}",
|
| |
|
| | r"\d{1,2}\/\d{1,2}(\/\d+)?",
|
| | r"\d{1,2}-\d{1,2}(-\d+)?",
|
| | ]
|
| |
|
| | word = r"\w+"
|
| | non_word = r"[^\w\s]"
|
| | abbreviations = [
|
| | r"D.C",
|
| | r"Tp\.",
|
| | r"BS\.",
|
| | r"BS\.",
|
| | r"U\.S",
|
| | r"Mr\.",
|
| | r"Mrs\.",
|
| | r"Ms\.",
|
| | r"Dr\.",
|
| | r"ThS\.",
|
| | r"TP\.",
|
| | r"St\.",
|
| | ]
|
| |
|
| | special_names = [
|
| |
|
| | r"[A-Z]{1}\w+-[A-Z]{1}\w+",
|
| | r"[a-z]+-[A-Z]{1}\w+",
|
| | r"[A-Z]+[-]{1}[A-Za-z0-9]+",
|
| | r"[A-Z]+[&]{1}[A-Z]+",
|
| | r"[A-Z]{1,2}[-+]{1}",
|
| | r"[A-Z]+\d+\.\d+",
|
| | r"[A-Z]{1,2}[0-9]{1,4}[-+]{1}",
|
| | r"[A-Z0-9]{1,3}[.]{1}[A-Z0-9]{1,3}[.]{1}[A-Z0-9]{1,3}",
|
| | r"[A-Z]{1}[A-Za-z0-9]*[-]{1}\w+",
|
| | r"\w+[\'’]{1}\w+",
|
| | r"[fF]/\d+.\d+",
|
| | ]
|
| |
|
| | cus_hyphen = [
|
| |
|
| | r"[0-9A-Z]{3,5}[\-]{1}[.0-9]{3,6}",
|
| | r"d\'\w+",
|
| | ]
|
| |
|
| | units = [
|
| | r"(người)[/\\]{1}(km²)",
|
| | r"(lít)[/\\]{1}(m²|m2|ha|m³)",
|
| | r"(m|cm|km)[/\\]{1}(giờ|phút|giây|h)",
|
| | r"^\d+(.\d+)?(%|km|kg)",
|
| | r"[0-9]{1,3}[%]{1}",
|
| | ]
|
| |
|
| | patterns = []
|
| | patterns.extend(special_names)
|
| | patterns.extend(units)
|
| | patterns.extend(cus_hyphen)
|
| | patterns.extend(datetime)
|
| | patterns.extend(abbreviations)
|
| | patterns.extend(specials)
|
| | patterns.extend(urls)
|
| | patterns.extend([email])
|
| | patterns.extend([digit])
|
| | patterns.extend([non_word])
|
| | patterns.extend([word])
|
| |
|
| |
|
| | patterns = "(" + "|".join(patterns) + ")"
|
| | patterns = re.compile(patterns, re.UNICODE)
|
| |
|
| |
|
| | def tokenize(text, format=None):
|
| | """
|
| | tokenize text for word segmentation
|
| |
|
| | :param text: raw text input
|
| | :return: tokenize text
|
| | """
|
| | text = Text(text)
|
| | text = text.replace("\t", " ")
|
| | tokens = re.findall(patterns, text)
|
| | tokens = [token[0] for token in tokens]
|
| | if format == "text":
|
| | return " ".join(tokens)
|
| | else:
|
| | return tokens
|
| |
|
| |
|
| | if __name__ == "__main__":
|
| | DIGIT = re.compile(digit)
|
| | print(DIGIT.search(','))
|
| | exit()
|
| |
|
| | s = ". ".join(
|
| | [
|
| | "Lần trước chúng tôi chứng kiến cảnh St. Petersburg bị tàn phá hoàn toàn ở khắp mọi nơi và giờ điều đó lại xảy ra một lần nữa",
|
| | "lãnh đạo Triều Tiên Kim Jong-un.",
|
| | "Vợ chồng 'sao đẹp nhất Philippines' bên con mùa Noel",
|
| | '"Về mặt y tế công cộng, chúng ta không còn e ngại gì đối với các ca tái dương tính", ông nói',
|
| | "Cựu thành viên I.O.I được khen, V.1.1, Ê'Đê, Women’s US Open, iPhone Xs 64GB 97% , Phiên bản S21+ 5G, Midi-Pyrénées, người/km²,km²,U.S, bin-Ladem ,Trung Lương-Mỹ Thuận, Dar al-Hajar vốn là nơi ở mùa hè của , ngày 30/6/2018, Zozibini, BS.Hê Thanh Nhã Yến, sân St James' Park, Thông tư 58/2020, 45.5%, 30km,50.2kg,Dar al-Hajar, VN-Index Honda WR-V 2020 giá từ 11.300 USD.vô địch La Liga. C.T Group lọt 3 mong HCM. M&A, Lux A2, Fadil, Lux A2.0 và Lux SA2.0, Brooklyn Beckham, K+, nhóm máu RH+, RH- ĐH KHXH&NV 120 km/h ti số 2-0 'la sao'. biển kiểm soát 30E-180.54 đi với tốc độ nhanh, lạng lách, làm xe tải biển 29H-116.87 lật ngang 2 phương thức tuyển sinh của Đại học Hùng Vương TP HCM. Trường 20/09/2019 http://google.com/?index=1",
|
| | "độc giả liên hệ qua email henho@vnexpress.net hoặc số 024 7300 8899 (máy lẻ 4529) để được hỗ trợ.",
|
| | "sau khi một trực thăng chiến đấu Israel hạ sát thủ lĩnh lúc bấy giờ Abbas al-Musawi.",
|
| | "Sea-Group nè",
|
| | "Lần trước chúng tôi chứng kiến cảnh St. Petersburg bị tàn phá hoàn toàn ở khắp mọi nơi và giờ điều đó lại xảy ra một lần nữa",
|
| | "Ba nhà khoa học đoạt giải Nobel Hóa học nhờ nghiên cứu về protein. Ảnh: Phys.org",
|
| | "Ngân hạng Nhà nước công bố sáng nay ở mức 24.036 đồng , tăng 36 đồng so với hôm qua",
|
| | "ống f/1.8, ống f/1.9,ống f/2.0",
|
| | "Tại BatDongSan.com.vn",
|
| | "Ảnh minh họa: iStock.com",
|
| | ]
|
| | )
|
| |
|
| | print(tokenize(s))
|
| |
|