使用 dateparser 库从 OCRed 文件中解析日期
Parsing dates from OCRed files using dateparser library
我想使用 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
问题是您的 date
是匹配数据对象。另外,我不确定 dateparser.parse
是否满足您的需求。我建议 datefinder
package 从文本中提取日期。
这是我要使用的正则表达式:
\bDresden(?:[.,]|\s+)?(.*)
见regex demo。它匹配 Dresden
作为一个完整的单词(\b
是一个单词边界), (?:[.,]|\s+)?
是一个非捕获的可选组匹配 ,
, .
或者一个或更多的空格,然后将任何零个或多个字符捕获到第 1 组中(re.DOTALL
也允许 .
匹配行分隔符)。
这是似乎产生预期匹配的 Python 片段:
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]
我想使用 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
问题是您的 date
是匹配数据对象。另外,我不确定 dateparser.parse
是否满足您的需求。我建议 datefinder
package 从文本中提取日期。
这是我要使用的正则表达式:
\bDresden(?:[.,]|\s+)?(.*)
见regex demo。它匹配 Dresden
作为一个完整的单词(\b
是一个单词边界), (?:[.,]|\s+)?
是一个非捕获的可选组匹配 ,
, .
或者一个或更多的空格,然后将任何零个或多个字符捕获到第 1 组中(re.DOTALL
也允许 .
匹配行分隔符)。
这是似乎产生预期匹配的 Python 片段:
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]