File size: 3,337 Bytes
5120311 |
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 |
import re
import requests
import datetime
import operator
from typing import *
from dateutil.relativedelta import *
from itertools import groupby
from dateparser import parse
day = '[0-3]{0,1}[0-9]'
month = '[0,1]{0,1}[0-9]'
year = '\d{4}'
sep = '\s*[-/\.\s]\s*'
patterns = [
f"{day}{sep}{month}{sep}{year}",
f"{year}{sep}{month}{sep}{day}",
f"{day}\s+tháng\s+{month}",
f"{day}\s+tháng\s+{month}{sep}{year}",
f"{day}\s+tháng\s+{month}\s+năm\s+{year}",
f"{day}\s+tháng\s+{month}",
f"(?<=ngày)\s+{day}{sep}{month}",
f"(?<=ngày)\s+{day}{sep}{month}{sep}{year}",
f"(?<=sáng)\s+{day}{sep}{month}",
f"(?<=sáng)\s+{day}{sep}{month}{sep}{year}",
f"(?<=trưa)\s+{day}{sep}{month}",
f"(?<=trưa)\s+{day}{sep}{month}{sep}{year}",
f"(?<=chiều)\s+{day}{sep}{month}",
f"(?<=chiều)\s+{day}{sep}{month}{sep}{year}",
f"(?<=tối)\s+{day}{sep}{month}",
f"(?<=tối)\s+{day}{sep}{month}{sep}{year}"
f"(?<=đêm)\s+{day}{sep}{month}",
f"(?<=đêm)\s+{day}{sep}{month}{sep}{year}",
f"(?<=hôm)\s+{day}{sep}{month}",
f"(?<=hôm)\s+{day}{sep}{month}{sep}{year}",
f"{day}{sep}{month}[\s\.\,\)]"
]
def extract_pattern(text: str, patterns: List[str]):
detected = []
for pattern in patterns:
for match in re.finditer(pattern, text):
detected.append((match.start(), match.end()))
detected.sort()
output = []
curr = -1
for start, values in groupby(detected, key=operator.itemgetter(0)):
if start < curr:
continue
values = list(values)
values.sort(key=operator.itemgetter(1), reverse=True)
output.append(values[0])
curr = values[0][1]
return output
def detect_time(text: str, language: str = 'vi', base: Optional[datetime.datetime] = None):
text = text.lower()
detected_patterns = extract_pattern(text, patterns)
output = []
settings = {
'PREFER_DAY_OF_MONTH': 'first'
}
if base:
settings['RELATIVE_BASE'] = base
for start, end in detected_patterns:
segment = text[start:end]
segment = re.sub('\s+', ' ', segment).strip().lower()
candiate = parse(segment, languages=[language], settings=settings)
output.append((segment, candiate))
return output
def get_time_post(sentences, patterns, start_time=None, end_time=None):
dict_time_evs = {}
for i, sen in enumerate(sentences):
if sen.strip() != "":
time_ex = detect_time(sen, patterns)
for te in time_ex:
if te[1] is not None:
if start_time is None or end_time is None or (end_time > te[1].timestamp() > start_time):
if te not in dict_time_evs:
dict_time_evs[te] = []
dict_time_evs[te].append(i)
return dict_time_evs
if __name__ == '__main__':
print(detect_time("VietTimes – Ngoại trưởng Mỹ Antony Blinken ngày đã tuyên bố trong một cuộc họp qua"
"truyền hình với ngoại trưởng các nước ASEAN Mỹ bác bỏ các yêu sách “bất hợp pháp” của"
"Trung Quốc ở Biển Đông.", language="vi")) |