ComponentDevelopment/OCRPython/extractor/identitycard_extractor.py

383 lines
11 KiB
Python
Raw Normal View History

2024-04-22 10:02:06 +08:00
import re
from extractor import Extractor
from configs.basic_config import *
2024-04-22 10:02:06 +08:00
class IdentityCardExtractor(Extractor):
def extract_textbyPaddle(self, text:str)->dict:
data = {
"issuingAuthority": "",
"validTime": "",
"name": "",
"gender": "",
"ethnicity": "",
"dateOfBirth": "",
"address": "",
"idNumber": "",
}
result = {
"code": RECOGNITION_INFO_COMPLETE,
"msg": error_codes[RECOGNITION_INFO_COMPLETE],
"data": data
}
2024-04-22 17:12:21 +08:00
try:
# 提取签发机关
2024-05-06 10:44:19 +08:00
issuing_authority = re.search(r"(签发机关|签发机美)\n*(.+?)\n", text, re.DOTALL)
if issuing_authority:
2024-05-07 18:23:58 +08:00
tempAuthority = issuing_authority.group(2).strip()
if "公安局" not in tempAuthority:
issuing_authority = re.search(r"(\S+)\n*(签发机关|签发机美)\n", text, re.DOTALL)
if issuing_authority:
data["issuingAuthority"] = issuing_authority.group(1).strip()
2024-05-07 18:23:58 +08:00
else:
data["issuingAuthority"] = issuing_authority.group(2).strip()
2024-04-22 10:02:06 +08:00
# 提取有效期限
valid_time = re.search(r"有效期限\n*(\d{4}\.\d{2}\.\d{2}-\S+)", text, re.DOTALL)
if valid_time:
data["validTime"] = valid_time.group(1).strip()
# 提取姓名
name = re.search(r"姓名\s*(.*?)\n", text,re.DOTALL)
if name:
tempName = name.group(1).strip()
2024-05-07 18:23:58 +08:00
if tempName in "性别男" or tempName in "性别女" or "性别男" in tempName or "性别女" in tempName or tempName.isupper() or tempName.islower():
name = re.search(r"(\S+)\s*姓名", text, re.DOTALL)
data["name"] = name.group(1).strip()
else:
data["name"] = name.group(1).strip()
else:
name = re.search(r"米名(\S*)址\s*(\S+)", text, re.DOTALL)
if name:
data["name"] = name.group(2).strip()
else:
name = re.search(r"\s*(\S+)\s*姓\s*", text, re.DOTALL)
if name:
data["name"] = name.group(1).strip()
2024-04-22 17:12:21 +08:00
else:
name = re.search(r"(\S+)\s*(男|女|性别)", text, re.DOTALL)
if name:
data["name"] = name.group(1).strip()
tempName = data["name"]
2024-05-07 18:23:58 +08:00
if tempName.startswith(""):
data["name"] = tempName[len(""):]
# 提取民族
2024-05-06 10:44:19 +08:00
ethnicity = re.search(r"\s*(族|旅)\s*(\S+)", text, re.DOTALL)
if ethnicity:
data["ethnicity"] = ethnicity.group(2).strip()
# 提取地址
address = re.search(r"(住址|佳址)(.*?)公民身份号码", text, re.DOTALL)
if address:
data["address"] = address.group(2).strip().replace("\n", "")
else:
address = re.search(r"(\S+省)(.*?)公民身份号码", text, re.DOTALL)
if address:
data["address"] = address.group(1).strip().replace("\n", "") + address.group(2).strip().replace("\n", "")
else:
address = re.search(r"(\S+市)(.*?)公民身份号码", text, re.DOTALL)
if address:
data["address"] = address.group(1).strip().replace("\n", "") + address.group(2).strip().replace("\n", "")
else:
address = re.search(r"(\S+县)(.*?)公民身份号码", text, re.DOTALL)
if address:
data["address"] = address.group(1).strip().replace("\n", "") + address.group(2).strip().replace("\n", "")
if data["address"]:
data["address"] = re.sub(r'[A-Z]', '', data["address"])
2024-05-07 18:23:58 +08:00
pattern = r"\d+[号组室房]"
# 匹配数字+号、数字+组、数字+室、数字+房 的最后一个匹配项
tempAddress = data["address"]
2024-05-07 18:23:58 +08:00
matchAddress = None
for m in re.finditer(pattern, tempAddress):
matchAddress = m
if matchAddress:
index = matchAddress.end() # 获取匹配项的结束位置
data["address"] = tempAddress[:index] # 截取匹配项及之前的字符串
2024-05-07 18:23:58 +08:00
#去掉地址后面的
else:
pattern = r"\d{18,}$" # 匹配1位以上的数字结尾
data["address"] = re.sub(pattern, "", data["address"])
# 提取身份证号码
2024-05-07 18:23:58 +08:00
id_number = re.search(r"([123456]\d{17}|[123456]\d{16}[Xx])", text, re.DOTALL)
if id_number:
data["idNumber"] = id_number.group(1).strip()
if data["idNumber"]:
# 提取出生日期
data["dateOfBirth"] = self.extract_birthday_from_id(data["idNumber"])
# 提取性别
data["gender"] = self.get_gender_from_id(data["idNumber"])
for key, value in data.items():
if not value or len(value) == 0:
result["code"] = RECOGNITION_INFO_INCOMPLETE
result["msg"] = error_codes[RECOGNITION_INFO_INCOMPLETE]
return result
2024-04-22 17:12:21 +08:00
except Exception as e:
result["code"] = RECOGNITION_INFO_PARSE_OTHER_EXCEPTION
result["msg"] = error_codes[RECOGNITION_INFO_PARSE_OTHER_EXCEPTION]
2024-04-22 17:12:21 +08:00
logger.error(e)
return result
2024-04-22 10:02:06 +08:00
class InvoiceExtractor(Extractor):
def extract_text(self,text:str)->dict:
pass
2024-04-22 10:02:06 +08:00
# text = """中华人民共和国
# 居民身份证
# 签发机关合肥市公安局庐阳分局
# 有效期限
# 2022.07.10-长期
# 姓名陈玉振
# 性别男
# 民族汉
# 出生1973年6月19日
# 佳址安徽省合肥市庐阳区固镇
# 路3150号森林城A6地块1
# 幢2001室
# 公民身份号码
# 440203197306192118"""
2024-04-24 08:41:51 +08:00
# text = """
# 中华人民共和国
# 居民身份证
# oo
# 签发机关宿州市公安局桥分局
# 有效期限2023.01.18-2043.01.18
# 姓名郭乾坤
# 性别男民族汉
# 出生1994年10月17日
# 住址 安徽省宿州市场桥区朱仙
# 庄镇郭庙村郭家组6号
# 公民身份号码
# 34220119941017327X
# """
# text = """中华人民共和国
# 居民身份证
# 签发机关
# 盐源县公安局
# 出
# 有效期限
# 2013.06.18-2033.06.18
# 坐姓5性中出住
# 米名年别到生委址
# 江六斤
# 男民族彝
# 半口
# 1980
# 年4月20日
# 四川省盐源县盖租乡阿石
# 村6组4号
# 公民身份号码
# 513423198004203995
2024-05-07 18:23:58 +08:00
# # """
#
# text = """姓名韩邀宇
# 性别男
# 民族汉
# 出生
# 1999年12月15日
# 住址
# 安徽省太和县税镇镇十里
# 沟村委会中韩村16号
# 公民身份号码
# 34122219991215183X"""
2024-05-07 18:23:58 +08:00
2024-04-24 08:41:51 +08:00
#
# text = """中华人民共和国
# 居民身份证
# 签发机关
# 木里县公安局
# 有效期限
# 2016.12.05-2026.12.05
# 姓性出住
# 马加加
# 女
# 民族彝
# 1998年1月2日
# 址
# 四川省木里藏族自治县博
# 科乡八科村麻窝地组18号
# 公民身份号码
# 513422199801023821"""
# text = """
# 毛阿卡
# 姓名
# 性别男
# 民族彝
# 3
# 出生
# 1976年3月3日
# 住址
# 四川省木里藏族自治县耗
# 牛坪乡泥珠村下泥珠组55
# 号
# 中国LHINA
# 公民身份号码
# 513423197603033997
# 中华人民共和国
# 居民身份证
# 签发机关
# 木里县公安局
# 有效期限
# 2017.06.06-2037.06.06
# """
# text = """中华人民共和国
# 居民身份证
# 国
# 签发机关
# 西昌市公安局
# 有效期限
# 2008.09.01-2028.09.01
# 逆姓5性中出日住
# 米名丰别刺生更址
# 祝九根惹
# 心
# 民
# 族彝
# 男
# E
# 1978
# 四川省西昌市磨盘乡大厂
# 村4组27号
# 公民身份号码
# 513401197807087411
# """
text = """中华人民共和国
居民身份证
签发机关
木里县公安局
有效期限
2020.03.16-2025.03.16
蒋子古
民族彝
出生
2005年1月4日
住址
四川省木里藏族自治县耗
牛坪乡泥珠村5组29号
公民身份号码
513422200501044415
"""
#
# text = """姓名苏龙格德·胡尔查巴特尔
# 性别男民族蒙古
# 出生1973年10支月27日
# 内蒙古赤峰市巴林右旗沙布
# 台苏木树中嘎查
# 中华人民共和国
# 居民身份证
# 签发机关巴林右旗公安局
# 有效期限2004.10.27-2024.10.26"""
2024-05-06 10:44:19 +08:00
# text ="""唐昌梅
# 姓名
# 性别女民族苗
# 出生1975年8月15日
# 住址
# 湖南省常德市鼎城区双桥
# 坪镇全家坪村3组
# 公民身份号码
# 433030197508150820"""
2024-05-07 18:23:58 +08:00
# text = """姓5性乎出日住
# 米名丰别生更址
# 张亮
# 男
# 民族彝
# 1975
# 年11月27日
# 四川省西昌市樟木箐乡中
# 安村1组29号附1号
# 公民身份号码
# 513401197511274218
# 中华人民共和国
# 居民身份证
# 国水
# 西昌市公安局
# 签发机关
# 有效期限
# 2017.08.21-2037.08.21"""
# text = """中华人民共和国
# 居民身份证
# 签发机关
# 宁乡县公安局
# 有效期限
# 2008.10.28-2028.10.28
# 姓名刘放华
# 性别男民族汉
# 出生1970年5月13日
# 住址
# 湖南省宁乡县流沙河镇荷
# 林村10组
# 8430124197005132917
# 公民身份号码"""
2024-05-07 18:23:58 +08:00
# text = """中华人民共和国
# 居民身份证
# 签发机关醴陵市公安局
# 有效期限2007.07.02-2027.07.02
# 和
# 姓名朱建明
# 致签
# 性别男民族汉
# 出生1970年11月9日
# 劳
# 住址
# 湖南省醴陵市西山办事处
# 动
# 滴水井村樟树组7号
# 23
# 公民身份号码
# 430281197011090090"""
2024-05-08 11:09:25 +08:00
# text = """中华人民共和国
# 居民身份证
# 签发机关湘乡市公安局
# 有效期限2016.01.25-2036.01.25
# 名李绍光
# 性别男
# 民族汉
# 出
# 生
# 1983年11月24日
# 住址
# 湖南省湘乡市山枣镇龙泉
# 村峡山口村民组156号
# 公民身份号码
# 43038119831124301X"""
# extractor = IdentityCardExtractor()
2024-04-24 08:41:51 +08:00
# jsonstring = extractor.extract_textbyPaddle(text)
# print(jsonstring)
# text = """
# 姓名张三
# 性别男
# 民族汉
# # """
# text = """
# 江六斤
# 女民族彝
# """
# # 尝试使用 r"性别(\S)" 匹配性别
# gender_match = re.search(r'性别(\S)|(\S)民族', text)
# if gender_match:
# gender = gender_match.group(0)
# print("性别是:", gender)
# # else:
# # # 如果匹配不到,尝试使用 r"(\S)民族" 匹配
# # gender_match = re.search(r'(\S)民族', text)
# # if gender_match:
# # gender = gender_match.group(1)
# # print("性别是:", gender)
# else:
# print("未找到性别信息")