【问题标题】:Parsing dates from OCRed files using dateparser library使用 dateparser 库从 OCRed 文件中解析日期
【发布时间】:2021-10-24 13:00:18
【问题描述】:

我想使用 dateparser 库从 OCR 图像中提取日期。

import dateparser
data = []
listOfPages = glob.glob(r"C:/Users/name/folder/test/*.tif")
for entry in listOfPages:
    text1 = pytesseract.image_to_string(
            Image.open(entry), lang="deu"
        )
    text = re.sub(r'\n',' ', text1)     
    date1 = re.compile(r'(Dresden(\.|,|\s+)?)(.*)', flags = re.DOTALL | re.MULTILINE)
    date = date1.search(text)
    if date:
        dates = dateparser.parse(date.group(3), date_formats=['%d %m %Y'], languages=['de'], settings={'STRICT_PARSING': True})
        
    else:
        dates = None
        if dates == None:
            dates = dateparser.parse(date.group(3), date_formats=['%d %B %Y'], locale = 'de', settings={'STRICT_PARSING': True})
        else:
            dates = None

    data.append([text, dates])
    
df0 = pd.DataFrame(data, columns =['raw_text', 'dates'])
print(df0)

为什么会出现错误:NameError: name 'dates' is not defined

更新:TypeError: Input type must be str

【问题讨论】:

  • 将错误的完整回溯显示为问题中格式正确的文本。
  • 您正在使用except: pass 抑制错误。分配给dates 之前的某行抛出异常,因此分配永远不会发生,因此名称永远不会被定义。这就是为什么你不应该压制错误。将pass 更改为raiseprint() 调用或两者兼而有之以查找错误。
  • 感谢 BoarGules 的提醒。现在错误是TypeError: Input type must be str,它指向date 变量。我认为date1.search(text) 的结果将是一个字符串还是正则表达式跨度对象的东西?
  • 首先(City(\.|,|\s+)?)(.*)不匹配,见this regex demodate 是匹配数据对象,而不是字符串,但您将其作为第一个参数传递给 dateparser.parse,您需要使用 dateparser.parse(date.group(3),因为您希望将值捕获到 (.*) 中。此外,dateparser.parse(text, date_formats=['%d %m %Y'], languages=['de'], settings={'STRICT_PARSING': True}) 没有找到任何东西。实际的文字是什么?另外,请注意,您根本不需要在这里尝试 excet。
  • 谢谢,维克托!如果我不try:except 我得到错误:AttributeError: 'NoneType' object has no attribute 'group'。如果我保留它,它不会再给我任何错误,但也会将所有dates 值返回为None.group(3) 是正确的,根据regex101.com/r/ah5b03/1

标签: python date-parsing dateparser


【解决方案1】:

问题是您的date 是一个匹配数据对象。另外,我不确定dateparser.parse 是否满足您的需求。我建议 datefinder package 从文本中提取日期。

这是我要使用的正则表达式:

\bDresden(?:[.,]|\s+)?(.*)

请参阅regex demo。它将Dresden 匹配为一个完整的单词(\b 是一个单词边界),(?:[.,]|\s+)? 是一个非捕获可选组匹配,. 或一个或多个空格,然后捕获到 Group 1 any零个或多个字符(re.DOTALL 也允许 . 匹配行分隔符)。

这是似乎产生预期匹配的 Python sn-p:

import pytesseract, dateparser, glob, re
import pandas as pd
import datefinder
from pytesseract.pytesseract import Image

imgpath = r'1.tif'
data = []
listOfPages = glob.glob(r"C:/Users/name/folder/test/*.tif")
listOfPages = [imgpath]
for entry in listOfPages:
    text = pytesseract.image_to_string(
            Image.open(entry), lang="deu"
        )

    dates = []
    date = re.search(r'\bDresden(?:[.,]|\s+)?(.*)', text, re.DOTALL)
    if date:
        dates = [t.strftime("%d %B %Y") for t in datefinder.find_dates(date.group(1))]
        #dates = dateparser.parse(date.group(1), date_formats=['%d %m %Y'], languages=['de'], settings={'STRICT_PARSING': True})

    data.append([text, dates])
    
df0 = pd.DataFrame(data, columns =['raw_text', 'dates'])
print(df0)

有了你的示例图片,我得到了

                                            raw_text                               dates
0  Sächsischer Landtag DRUCKSACHE , 1972\n2. Wahl...  [17 October 1995, 18 October 1995]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-02
    相关资源
    最近更新 更多