社保卡卡号该如何校验

使用ocr对社保卡进行了文本检测和文本识别,现在要进行结构化,使得信息栏与内容一一对应,社保卡卡面的社会保障号码和社会保障卡号该如何进行校验?

社会保障号码和社会保障卡号是社保卡上最重要的两个标识,其格式和校验规则如下:

  1. 社会保障号码
  • 格式:18位数字,最后一位可能是数字或者字母X。
  • 校验规则:采用ISO 7064:1983, MOD 11-2算法进行校验。
  1. 社会保障卡号
  • 格式:9位数字。
  • 校验规则:采用ISO 7064:1983, MOD 10-2算法进行校验。

校验规则的具体实现可以参考以下示例代码:

import re

def validate_ssn(ssn):
    # 校验社会保障号码
    if not re.match(r'^\d{17}[\dX]$', ssn):
        return False
    weights = [3, 7, 9, 10, 5, 8, 4, 2]
    check_digit = '10X98765432'[sum(int(digit) * weight for digit, weight in zip(ssn[:-1], weights)) % 11]
    return check_digit == ssn[-1]

def validate_card_number(card_number):
    # 校验社会保障卡号
    if not re.match(r'^\d{9}$', card_number):
        return False
    weights = [3, 7, 9, 10, 5, 8, 4, 2, 1]
    check_digit = sum(int(digit) * weight for digit, weight in zip(card_number[:-1], weights)) % 11
    return check_digit == int(card_number[-1])

【相关推荐】



  • 帮你找了个相似的问题, 你可以看下: https://ask.csdn.net/questions/7777718
  • 这篇博客也不错, 你可以看下简历解析第三方OCR识别介绍
  • 除此之外, 这篇博客: OCR-常见问题汇总中的 23. 对于特定文字检测,例如身份证只检测姓名,检测指定区域文字更好,还是检测全部区域再筛选更好? 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:

    两个角度来说明一般检测全部区域再筛选更好。

    1. 由于特定文字和非特定文字之间的视觉特征并没有很强的区分行,只检测指定区域,容易造成特定文字漏检。
    2. 产品的需求可能是变化的,不排除后续对于模型需求变化的可能性(比如又需要增加一个字段),相比于训练模型,后处理的逻辑会更容易调整。

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^