一般用ocr的场景是将证件或者材料的内容转成结构化的文本,比分身份证需要识别,
姓名:xxx,年龄:30,身份证号:1212424,
职业证书需要识别:持证人:timmy,证书号:12235523,发证日期:2025-11-11,证书名称:xx职业证书。
专用证件或票据百度有固定的接口,比如:
身份证,护照,营业执照,银行收据等
针对通用的文本解析,百度提供以下两个接口:
1.结构化识别:返回key value对,比如抓取证书里的,证书名称:xxx,证书编号:1111。
2.文本识别:返回全部的多行文本,比如:
证书名称:xxx
证书编号:1111
针对理想情况,我们只需要用到结构化识别接口,然后根据key的值提取我们想要的信息。
然而实际场景不是所有材料的内容都是key:value形式。
比如一般xxx证书的证书标题是不会在前面加 证书名称 这个几个字,直接写上 xx职业资格证书。
这个时候我们只能去遍历多行文本返回的List<String>对象,然后根据对应的逻辑的解析名称
比如判断证书可以写成 包含证书结尾的文本 这种。
下面代码先用包含特殊文本判断,匹配不到再用特定位置文本继续判断。
···
public String parse(List<Pair<String, String>> maps, List<String> textList) {
String res = this.getStringEndWithFromMap(maps, OCrDictConfigUtils.getCertificateNamePattern());
if (!StringUtils.isBlank(res) && res.length()>3) {
return res;
}
res = this.getTextListContainsAnyPatterns(textList, OCrDictConfigUtils.getCertificateName());
if (!StringUtils.isBlank(res)) {
return res;
}
if ( this.getTextListContainsAnyPatterns(textList, Arrays.asList("专职律师"))!=null) {
return "律师证";
}
return getFromTop(textList);
}
private String getFromTop(List<String> textList) {
return textList.stream().filter(c -> c.endsWith("证书")).findFirst().orElse(null);
}
···