使用滑动窗口算法和Python OCR从文档中识别日期。
#python #data #computervision #technology

嘿,那里ð,

今天,让我们解决一个文本处理问题,要求我们在图像中提取的文本中找到任何日期。

我们正在使用 Easyocr ,一个Python OCR库来从图像中查找文本。让我们继续使用代码。

从图像中提取文本|设置Easyocr

  1. 我们首先创建一个koude0模块。

  2. 创建 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日。

  1. 第一步是实现滑动窗口将MMM转换为数字。像, 5月至05。

  2. 我们创建了一个函数,该函数会吸收字符串,并找到该函数是否包含上述字典中的任何一个月,

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

  1. 接下来,我们创建一个函数,该函数接收一个字符串并为我们提供所需的格式。
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

  1. 现在,我们只需要将提取的字符串传递到上述功能中即可。
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. 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)

那就是所有人!很快见。

快乐的编码ðÖ