一般用ocr的場景是將證件或者材料的內(nèi)容轉(zhuǎn)成結(jié)構(gòu)化的文本,比分身份證需要識別,
姓名:xxx,年齡:30,身份證號:1212424,
職業(yè)證書需要識別:持證人:timmy,證書號:12235523,發(fā)證日期:2025-11-11,證書名稱:xx職業(yè)證書。
專用證件或票據(jù)百度有固定的接口,比如:
身份證,護(hù)照,營業(yè)執(zhí)照,銀行收據(jù)等
針對通用的文本解析,百度提供以下兩個(gè)接口:
1.結(jié)構(gòu)化識別:返回key value對,比如抓取證書里的,證書名稱:xxx,證書編號:1111。
2.文本識別:返回全部的多行文本,比如:
證書名稱:xxx
證書編號:1111
針對理想情況,我們只需要用到結(jié)構(gòu)化識別接口,然后根據(jù)key的值提取我們想要的信息。
然而實(shí)際場景不是所有材料的內(nèi)容都是key:value形式。
比如一般xxx證書的證書標(biāo)題是不會在前面加 證書名稱 這個(gè)幾個(gè)字,直接寫上 xx職業(yè)資格證書。
這個(gè)時(shí)候我們只能去遍歷多行文本返回的List<String>對象,然后根據(jù)對應(yīng)的邏輯的解析名稱
比如判斷證書可以寫成 包含證書結(jié)尾的文本 這種。
下面代碼先用包含特殊文本判斷,匹配不到再用特定位置文本繼續(xù)判斷。
···
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);
}
···