嘿,那里ð,
今天,让我们解决一个文本处理问题,要求我们在图像中提取的文本中找到任何日期。
我们正在使用 Easyocr ,一个Python OCR库来从图像中查找文本。让我们继续使用代码。
从图像中提取文本|设置Easyocr
-
我们首先创建一个koude0模块。
-
创建 data -extraction 类并启动 easyocr 模型。
from datetime import datetime
import easyocr
import re
class DataExtraction:
def __init__ (self) -> None:
self.months = {
"JAN": "01",
"FEB": "02",
"MAR": "03",
"APR": "04",
"MAY": "05",
"JUN": "06",
"JUL": "07",
"AUG": "08",
"SEP": "09",
"OCT": "10",
"NOV": "11",
"DEC": "12",
}
self.reader = easyocr.Reader(["en"])
将日期字符串转换为DateTime对象
可能有未知数的日期格式,并且每个分析每种格式都会花费无限的时间和工作。因此,在此示例中,仅考虑几种知名形式。
好吧,尝试识别 dd mmm yyyy string的日期格式。
例如,如果给定日期为 15 SD F 2019年5月,则输出应为 15052019 ”。
我们将使用滑动窗口来检测两组数字字符之间是否存在任何月份。
字符串包括数字,字母,包括其他字符。例如,考虑考虑ððððð7±® ðµðð。日期应为2019年5月15日。
-
第一步是实现滑动窗口将MMM转换为数字。像, 5月至05。
-
我们创建了一个函数,该函数会吸收字符串,并找到该函数是否包含上述字典中的任何一个月,月。
def month_to_num(self, s: str) -> str:
res = ""
start = 0
try:
for end in range(len(s)):
rightChar = s[end]
res += rightChar
if len(res) == 3:
if res.upper() in self.months.keys():
numeric_date = self.months[res.upper()]
return numeric_date
start += 1
res = res[1:]
except Exception as e:
pass
return ""
- 接下来,我们创建一个函数,该函数接收一个字符串并为我们提供所需的格式。
def find_date_string(self, s: str) -> list: # s = "𝗴𝘀 𝟭𝟱 𝗺𝗮𝗶 𝗺𝗮𝘆 𝟮𝟬𝟭𝟵 𝘀𝗴𝗳 "
s1 = " ".join(re.split(r"([a-zA-Z])([0-9]+)", s))
s2 = " ".join(re.split(r"([0-9]+)([a-zA-Z]+)", s1))
text = "-" + "-".join(re.split(r"[-;,.\s]\s*", s2)) + "-" # "gs-15-mai-may-2019-sgf"
dates_type_1 = re.findall(r"-[0-9][0-9]-.*?-[0-9][0-9][0-9][0-9]-", text) # "-15-mai-may-2019"
date_objects = []
if len(dates_type_1) > 0:
date_objs = self.get_date_object(dates_type_1)
for date_obj in date_objs:
date_objects.append(date_obj)
return date_objects
def get_date_object(self, date_type_1_list: list):
dates = []
for date_str in date_type_1_list:
day_str = date_str[1:3]
month_str = date_str[3:-4]
year_str = date_str[-5:-1]
month_number = self.month_to_num(month_str)
if month_number == "":
return ""
result_date_str = f"{day_str}-{month_number}-{year_str}"
date_object = datetime.strptime(result_date_str, "%d-%m-%Y")
dates.append(date_object)
return dates
- 现在,我们只需要将提取的字符串传递到上述功能中即可。
def get_date_from_img(self, img_path: str):
result = []
# extract the texts from the img
text_strings = self.reader.readtext(img_path, detail=0)
# check every string for dates
for s in text_strings:
date_obj_list = self.find_date_string(s)
if len(date_obj_list) > 0:
result.append(date_obj_list)
return result
- 那就是这样。我们在文档图像中都有所有的日期对象。
如果日期格式与定义的类型匹配,则可以在任何类型的文档上使用此方法。全世界都有多种日期格式。不同的国家有不同的格式。解析他们每个人都需要更多的努力,但绝对可以实现。
这是用于不同日期类型的其他一些格式。
"""
1. 1 mai/may 2019
2. 1 mai/may 19
3. 12 09 2016
4. 2 09 2016
5. 12 09 16
6. 2 09 16
"""
dates_type_2 = re.findall(r"-[0-9][0-9]-[0-9][0-9]-[0-9][0-9][0-9][0-9]-", text)
dates_type_3 = re.findall(r"-[0-9][0-9]-[0-9][0-9]-[0-9][0-9]-", text)
dates_type_4 = re.findall(r"-[0-9][0-9]-.*?-[0-9][0-9]-", text)
dates_type_5 = re.findall(r"-[0-9]-.*?-[0-9][0-9]-", text)
dates_type_6 = re.findall(r"-[0-9]-.*?-[0-9][0-9][0-9][0-9]-", text)
dates_type_7 = re.findall(r"-[0-9]-[0-9][0-9]-[0-9][0-9]-", text)
dates_type_8 = re.findall(r"-[0-9]-[0-9][0-9]-[0-9][0-9][0-9][0-9]-", text)
那就是所有人!很快见。
快乐的编码ðÖ