File size: 6,116 Bytes
d2faa50
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
#!/usr/bin/python
# -*- coding: utf-8 -*-

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 pattern from nltk
# https://www.nltk.org/_modules/nltk/tokenize/casual.html
# with Vu Anh's modified to match fpt protocol
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 = [
    # Thông tư 58/2020
    r"\d{1,4}\/\d{4}",
    # 01/1/2014 , 1/1
    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-Za-z]+s\'",
    r"[A-Z]{1}\w+-[A-Z]{1}\w+",  # al-Hajar, bin-Laden
    r"[a-z]+-[A-Z]{1}\w+",  # al-Hajar, bin-Laden
    r"[A-Z]+[-]{1}[A-Za-z0-9]+",  # M&A , T&H
    r"[A-Z]+[&]{1}[A-Z]+",  # M&A , T&H
    r"[A-Z]{1,2}[-+]{1}",  # K+ , nhóm máu A+ , A-, RH+
    r"[A-Z]+\d+\.\d+",  # A2.0 , SA2.0,
    r"[A-Z]{1,2}[0-9]{1,4}[-+]{1}",  # S21+
    r"[A-Z0-9]{1,3}[.]{1}[A-Z0-9]{1,3}[.]{1}[A-Z0-9]{1,3}",  # I.O.I, V.1.1
    r"[A-Z]{1}[A-Za-z0-9]*[-]{1}\w+",  # hyphen, F-16, Su-8, Apolo-2 ,H-Capital, A-Apolo  Nano-Bio ...
    r"\w+[\'’]{1}\w+",  # H'Mông, Đắc'Rong, Ê'Đê ...
    r"[fF]/\d+.\d+",
]

cus_hyphen = [
    # biển số xe: 29H-116.87, 30E-180.54
    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}",  # 97%, 100%, 20%, 700%'
]

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",
        ]
    )
    # match = patterns.findall(s)
    print(tokenize(s))