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))
|