處理PDF文件那部分介紹的第三方模塊PyPdf2隻能識別PDF文件的英文字符,對中文字符沒有辦法。接下來的帖子介紹一種識別PDF非英文文字的方法:先引進第三方模塊Wand把PDF文件轉成圖片,再引進第三方模塊PyOCR或Pytesseract把圖片上的文字識別出來。Wand、PyOCR或Pytesseract為python可以引入的第三方模塊,是外面的包裝,包裹的內核是圖片處理的軟體包Imagemagick和光學字符識別OCR(Optical Character Recognistion)軟體包,比如Tesseract。這個帖子介紹如何安裝Tesseract。
字符識別OCR把圖片上的文字自動識別出來,轉換成我們能處理的字符串。這裡使用Tesseract這個軟體包來做OCR,Tesseract最初由惠普開發,後來谷歌接受過來繼續支持。Tesseract支持100多種書面語言,並且可以被訓練繼續擴充。Tesseract沒有圖形化界面,用命令行執行,作為內核被其他有圖形化界面的程序調用。我們先來安裝Tesseract,然後用命令行運行Tesseract識別圖片上的文字。
Mac上可以用homebrew安裝Tesseract,homebrew是一個安裝工具,幫助我們安裝應用到Mac上。homebrew不是Mac自帶的,所以自己需要先被安裝。搜尋引擎上搜install homebrew,找到homebrew的主頁brew.sh,主頁上赫然掛著安裝homebrew的辦法,把:/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"貼到terminal終端窗口上,按照提示輸入admin的密碼後會自動下載安裝homebrew:
homebrew成功安裝完畢後,在terminal輸入:brew install tesseract 安裝tesseract:
安裝完畢後可用tesseract -v驗證,順便查看下版本:
從版本後面跟著的圖片格式庫可以看出tesseract支持jpeg、png和tiff為擴展名的圖片。 接下來試著識別圖片example_01上的英文字母:
在terminal上敲入命令tesseract 路徑+文件名 stdout,將識別結果輸出到屏幕上:
若要把識別結果保存到文檔中,用文檔名替換掉stdout:
tesseract /users/PythonABC/Documents/OCR/example_01.png output
則在當前文件夾(跟代碼同一個文件夾)下,可以看到新生成的文件output.txt,內容是圖片上識別出來的內容。
識別準確與否跟圖片文字的背景有很大關係。這裡用的背景是白色,字黑色的,是最利於識別的一種情況,實際上顯然不可能這麼完美。背景混雜(識別時的雜音)的文字識別起來難度係數增大,準確率下降,可以通過訓練識別庫來提高tesseract的識別率。如何訓練這裡不提及,有興趣的朋友可以參看tesseract的技術文檔,也可以下載資深人士訓練好分享出來的識別庫。事實上安裝tesseract默認安裝了英文字符訓練庫,幫助識別英文、英文標點符號和數字。
example_02.png如下:
現在來看tesseract能否識別出圖片上的中文字,example_02在當前文件夾下:
識別不出來的原因是沒有安裝中文訓練庫,安裝中文訓練庫的步驟如下:
1.下載中文訓練字庫
搜尋引擎上搜索:tesseract Chinese training data,去tesseract的github的頁面上下載中文簡體字庫:chi_sim.traineddata,當然如果還需要識別其他語言,可以把其他訓練庫一併下載了。
2.把下載的字庫拷貝到tessdata目錄下
terminal終端窗口上敲入命令brew list tesseract查看tessdata的位置:
最後一行就是tessdata的目錄,把下載的目錄拷貝到這個目錄下,如果是 在Mac的terminal上可以用cp命令:
3.設置環境變量TESSDATA_PREFIX為tessdata路徑名,否則用加了指 定語言參數的tesseract命令識別圖片上的文字時會出現找不到訓練庫的 錯誤
錯誤提示裡有一句「Please make sure the TESSDATA_PREFIX environment variable is set to your "tessdata" directory.」,所以設置環境變量TESSDATA_PREFIX為tessdata的路徑:
4.識別圖片裡的中文字符
命令的格式是:
tesseract路徑+文件名輸出-l 語言代碼
默認識別的是英文字符,如果圖片上有其他文字需要用語言參數-l說明。下載的語言訓練庫文件可能是jpn.traineddata(日語)、deu.traineddata(德語)、chi_sim.traineddata(簡體中文)或sim_tra(繁體中文)等等,語言代碼取文件名部分(jpn、deu、chi_sim或sim_tra)。
對example_02.png上的文字識別見圖
另外tesseract命令參數是講究順序和不可省略的的,比如寫成:
tesseract example_02.png -l chi_sim 是會出錯的:
tesseract是有局限性的,對文字背景有要求,對像素有要求……需要特徵抽取技術、機器學習技術和深度學習技術,用於識別的訓練字庫是可以被訓練升級的,有興趣的朋友可以自行研究
微信公號文章發表後只能修改五個字,所以PythonABC公號文章裡的錯誤改正或內容補充會放在pythonabc.org的網站上。這篇帖子明天才往網站上貼,正在重看笑傲江湖ing,得抓緊一切時間(^_^)若有錯誤還望見諒,明天會在網站上的帖子作修改噠。
請前幾天留言發問的朋友發郵件到pythonabc@mail.com,已經過了回復期限,所以回復不了了
即將推出的Python ABC教程對PythonABC視頻內容進行了梳理,修正了發現的錯誤、對代碼做了些許優化、替換掉視頻中的英文注釋、替換掉國內不能訪問的資源、添加windows上的設置和運行……敬請關注,謝謝