任务:提取病历,其中一些是pdf书籍中存在的,但是这些pdf是图片格式的,需要将这些内容转成文本内容。思路:将pdf文件转为单张图片集合,然后对单张图片进行ocr识别,并将识别结果的文字进行拼接。使用pypdf2模块读取pdf,读取二进制内容,使用wand模块将其中一页转成图片保存。1阅读pdf并将其转换为图像安装pypdf2包。pipinstallpypdf2安装python包:wandpipinstallwandwand文档:https://docs.wand-py.org/代码:importiofromwand.imageimportImagefromwand.colorimportColorfromPyPDF2importPdfFileReader,PdfFileWriteimportjsonmemo={}#Readpdf文件用PyPDF2的PdfFileReaderdefgetPdfReader(filename):reader=memo.get(filename,None)ifreaderisNone:reader=PdfFileReader(filename,strict=False)memo[filename]=readerreturnreader#将被制定转换pdf页码转图片格式def_run_convert(filename,page,res=120):idx=page+1pdfile=getPdfReader(filename)pageObj=pdfile.getPage(page)#pagestartsfrom0dst_pdf=PdfFileWriter()dst_pdf.addPage(pageObj)pdf_bytes=io.BytesIO()dst_pdf.write(pdf_bytes)pdf_bytes.seek(0)img=Image(file=pdf_bytes,resolution=res)img.format='png'img.compression_quality=100img。background_color=Color("white")img_path='{}{}.png'.format(filename[:filename.rindex('.')],idx)img.save(f伊尔ename=img_path)img.destroy()执行后会报错,缺少ImageMagick安装ImageMagickImageMagick是一款免费开源的图像编辑软件。它既可以通过命令行使用,也可以通过C/C++、Perl、Java、PHP、Python或Ruby调用库编程来使用。ImageMagic的主要关注点是性能、减少错误以及提供稳定的API和ABI。下载地址:https://imagemagick.org/scrip...使用方法可以参考:https://www.cnblogs.com/Renyi...之后继续报错,另一个软件Ghostscript是丢失的。wand.exceptions.DelegateError:FailedToExecuteCommand`"gswin64c.exe"-q-dQUIET-dSAFER-dBATCH-dNOPAUSE-dNOPROMPT-dMaxBitmap=500000000-dAlignToPixels=0-dGridFitTT=2"-sDEVICE=pngalpha"-dTextAlphBitaphs=4-dGraphics4“-r120x120”-dPrinted=false“-sOutputFile=C:/Users/ADMINI~1/AppData/Local/Temp/magick-ZsQSfEM-CFt6Gr4NZ7mUFFR2UbaYvaQr%d”“-fC:/Users/ADMINI~1/AppData/Local/Temp/magick-eT1ogBLBCjx3Tm4r2jidCDxbn3jmkZw6”“-fC:/Users/ADMINI~1/AppData/Local/Temp/magick-UaYBnaqm--_f0Gm6CSzMe8LnumhQQ16A”'error/delegate.c/ExternalDelegateCommand/516表示现在系统中没有Ghostscript软件,需要安装Ghostscript。Ghostscript是一套基于Adobe、PostScript和可移植文档格式(PDF)的页面描述语言编写而成的免费软件。Ghostscript是ImageMagick的基本组成部分。下载地址:https://ghostscript.com/relea...可以下载Ghostscript9.55.0forWindows(64位)版本。至此,图像就可以生成了。2调用百度智能云识别文字,首先要有百度账号,更不用说注册了。拥有帐户后,您需要创建一个“应用程序”。打开https://cloud.baidu.com/produ...,在“产品”-“人工智能”-“OCR文字识别”下选择“通用场景文字识别”。然后,单击下图中的“立即使用”。然后点击下图中的“创建应用程序”。填写信息后,将创建一个应用程序。我创建了“医疗案例识别”。上图中,APIKey和SecretKey就是我们接下来要用到的。上面代码:defocr_baidu(filename,access_token):#encoding:utf-8'''一般文本识别'''request_url="https://aip.baidubce.com/rest/2.0/ocr/v1/general_basic"#以二进制方式打开图片文件f=open(filename,'rb')img=base64.b64encode(f.read())params={"image":img}#access_token='[调用认证接口获取的token]'request_url=request_url+"?access_token="+access_tokenheaders={'content-type':'application/x-www-form-urlencoded'}response=requests.post(request_url,data=params,headers=headers)ifresponse:#print(response.json())forwordsinresponse.json().get("words_result"):##print(words.get("words"))print(words)returnresponse.json().get("words_result")else:returnNone最后的结果是一个list列表,里面包含words作为key字典,如下图:3个文本合并。比如里面的“写作说明”应该是标题,第2-3个值应该合并成一个段落。最好的方法应该是使用nlp技术进行语义识别。这里简单做一下字符判别,不会太准确。上面的代码:defis_ChineseMarks(char):ifchar=="."或char=="?"或char=="!"orchar=="""orchar==":":returnTrueelse:returnFalsedefmerge2txt(words_list,line_max_num=26,title_max_num=10):'''{'words':'写说明'}{'words':'《伤寒论》是汉代医学家张仲景所著的《伤寒杂病论》的一部分。'}{'words':'其原理和方法为历代医家所遵循,其方剂为古今临床常用。书。'}1.title:如果words对应的字符串长度小于title_max_num,则没有。数字结束,表示当前是标题。2.段落:如果最后一个字符是。一个句号,长度小于line_max_num,表示当前段落是一个段落。:paramwords_list::paramline_max_num::paramtitle_max_num::return:合并文本内容'''txt=""foriinwords_list:words=str(i.get("words"))if(notis_ChineseMarks(words[-1]))andlen(words)<=title_max_num:txt+=""#8spacestxt+=wordstxt+="\n"elifis_ChineseMarks(words[-1])andlen(words)<=line_max_num:txt+=wordstxt+="\n"#txt+=""#4个空格,表示段落开始else:iftxt.endswith("\n"):txt+=""#4个空格意思是段落头txt+=wordsreturntxt调用百度的ocr服务,同样需要access_token。这个access_token是由之前创建应用的APIKey和Secretkey生成的。可以参考百度的文档:https://ai.baidu.com/ai-doc/R...get_token()代码:defget_token():#client_id是从官网获取的AK,client_secret是SK从官网获取client_id="UseyourAPIKey"client_secret="UseyourSecretkey"host='https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id='+client_id+'&client_secret='+client_secretresponse=requests.get(host)#print(host)#print(response.content)ifresponse:access_token=response.json().get("access_token")returnaccess_token主要功能:if__name__=="__main__":filename="*****.pdf"#_run_convert(filename,3)access_token=get_token()filename="*****.png"words_list=ocr_baidu(filename,access_token)txt=merge2txt(words_list,26,10)结合print(txt)后的结果大致是这样的:原图是这样的:可见识别率还是有些问题。百度这里的ocr识别率毋庸置疑,应该是国内最好的。关键问题可能是pdf生成图片时像素可能不够,导致图片不清晰。这个问题的解决方法会写在下一篇文章中。
