Python:处理一些格式规范的文字
你要處理的大多數(shù)文字都是比較干凈、格式規(guī)范的。格式規(guī)范的文字通常可以滿足一些需求,不過究竟什么是“格式混亂”,什么算“格式規(guī)范”,確實(shí)因人而異。 通常,格式規(guī)范的文字具有以下特點(diǎn):
- 使用一個標(biāo)準(zhǔn)字體(不包含手寫體、草書,或者十分“花哨的”字體) ? 雖然被復(fù)印或拍照,字體還是很清晰,沒有多余的痕跡或污點(diǎn)
- 排列整齊,沒有歪歪斜斜的字
- 沒有超出圖片范圍,也沒有殘缺不全,或緊緊貼在圖片的邊緣
文字的一些格式問題在圖片預(yù)處理時可以進(jìn)行解決。例如,可以把圖片轉(zhuǎn)換成灰度圖,調(diào) 整亮度和對比度,還可以根據(jù)需要進(jìn)行裁剪和旋轉(zhuǎn)(詳情請關(guān)注圖像與信號處理),但是,這些做法在進(jìn)行更具擴(kuò)展性的 訓(xùn)練時會遇到一些限制。
格式規(guī)范文字的理想示例
?
通過下面的命令運(yùn)行 Tesseract,讀取文件并把結(jié)果寫到一個文本文件中: `tesseract test.jpg text
?
cat text.txt?即可顯示結(jié)果。
識別結(jié)果很準(zhǔn)確,不過符號^和*分別被表示成了雙引號和單引號。大體上可以讓你很舒服地閱讀。
通過Python代碼實(shí)現(xiàn)
import pytesseract
from PIL import Imageimage = Image.open('test.jpg')
text = pytesseract.image_to_string(image)
print text
運(yùn)行結(jié)果:
This is some text, written in Arial, that will be read by
Tesseract. Here are some symbols: !@#$%"&*()
對圖片進(jìn)行閾值過濾和降噪處理(了解即可)
很多時候我們在網(wǎng)上會看到這樣的圖片:
?
Tesseract 不能完整處理這個圖片,主要是因?yàn)閳D片背景色是漸變的,最終結(jié)果是這樣:
?
隨著背景色從左到右不斷加深,文字變得越來越難以識別,Tesseract 識別出的 每一行的最后幾個字符都是錯的。
遇到這類問題,可以先用 Python 腳本對圖片進(jìn)行清理。利用 Pillow 庫,我們可以創(chuàng)建一個 閾值過濾器來去掉漸變的背景色,只把文字留下來,從而讓圖片更加清晰,便于 Tesseract 讀取:
from PIL import Image
import subprocessdef cleanFile(filePath, newFilePath): image = Image.open(filePath)# 對圖片進(jìn)行閾值過濾,然后保存image = image.point(lambda x: 0 if x<143 else 255) image.save(newFilePath)# 調(diào)用系統(tǒng)的tesseract命令對圖片進(jìn)行OCR識別 subprocess.call(["tesseract", newFilePath, "output"])# 打開文件讀取結(jié)果file = open("output.txt", 'r') print(file.read()) file.close()cleanFile("text2.jpg", "text2clean.png")
通過一個閾值對前面的“模糊”圖片進(jìn)行過濾的結(jié)果
?
?
除了一些標(biāo)點(diǎn)符號不太清晰或丟失了,大部分文字都被讀出來了。Tesseract 給出了最好的 結(jié)果:
?
?
從網(wǎng)站圖片中抓取文字
用 Tesseract 讀取硬盤里圖片上的文字,可能不怎么令人興奮,但當(dāng)我們把它和網(wǎng)絡(luò)爬蟲組合使用時,就能成為一個強(qiáng)大的工具。
網(wǎng)站上的圖片可能并不是故意把文字做得很花哨 (就像餐館菜單的 JPG 圖片上的藝術(shù)字),但它們上面的文字對網(wǎng)絡(luò)爬蟲來說就是隱藏起來 了,舉個例子:
-
雖然亞馬遜的 robots.txt 文件允許抓取網(wǎng)站的產(chǎn)品頁面,但是圖書的預(yù)覽頁通常不讓網(wǎng)絡(luò)機(jī) 器人采集。
-
圖書的預(yù)覽頁是通過用戶觸發(fā) Ajax 腳本進(jìn)行加載的,預(yù)覽圖片隱藏在 div 節(jié)點(diǎn) 下面;其實(shí),普通的訪問者會覺得它們看起來更像是一個 Flash 動畫,而不是一個圖片文 件。當(dāng)然,即使我們能獲得圖片,要把它們讀成文字也沒那么簡單。
-
下面的程序就解決了這個問題:首先導(dǎo)航到托爾斯泰的《戰(zhàn)爭與和平》的大字號印刷版 1, 打開閱讀器,收集圖片的 URL 鏈接,然后下載圖片,識別圖片,最后打印每個圖片的文 字。因?yàn)檫@個程序很復(fù)雜,利用了前面幾章的多個程序片段,所以我增加了一些注釋以讓 每段代碼的目的更加清晰:
import time
from urllib.request import urlretrieve
import subprocess
from selenium import webdriver
#創(chuàng)建新的Selenium driver
driver = webdriver.PhantomJS()# 用Selenium試試Firefox瀏覽器:
# driver = webdriver.Firefox()driver.get("http://www.amazon.com/War-Peace-Leo-Nikolayevich-Tolstoy/dp/1427030200")
# 單擊圖書預(yù)覽按鈕 driver.find_element_by_id("sitbLogoImg").click() imageList = set()
# 等待頁面加載完成
time.sleep(5)
# 當(dāng)向右箭頭可以點(diǎn)擊時,開始翻頁
while "pointer" in driver.find_element_by_id("sitbReaderRightPageTurner").get_attribute("style"):driver.find_element_by_id("sitbReaderRightPageTurner").click()time.sleep(2)# 獲取已加載的新頁面(一次可以加載多個頁面,但是重復(fù)的頁面不能加載到集合中) pages = driver.find_elements_by_xpath("//div[@class='pageImage']/div/img") for page in pages:image = page.get_attribute("src")imageList.add(image)
driver.quit()# 用Tesseract處理我們收集的圖片URL鏈接
for image in sorted(imageList):# 保存圖片urlretrieve(image, "page.jpg")p = subprocess.Popen(["tesseract", "page.jpg", "page"], stdout=subprocess.PIPE,stderr=subprocess.PIPE)f = open("page.txt", "r")p.wait() print(f.read())
和我們前面使用 Tesseract 讀取的效果一樣,這個程序也會完美地打印書中很多長長的段 落,第六頁的預(yù)覽如下所示:
6"A word of friendly advice, moncher. Be off as soon as you can,that's all I have to tell you. Happyhe who has ears to hear. Good-by,my dear fellow. Oh, by the by!" heshouted through the doorway afterPierre, "is it true that the countesshas fallen into the clutches of theholy fathers of the Society of je-sus?"Pierre did not answer and left Ros-topchin's room more sullen and an-gry than he had ever before shownhimself.
但是,當(dāng)文字出現(xiàn)在彩色封面上時,結(jié)果就不那么完美了:
WEI' nrrd PeaceLen Nlkelayevldu IolfluyReadmg shmdd be axwlnvame asnossxble Wenfleran mm m our cram: Llhvary- Leo Tmsloy was a Russian rwovelwstI and moval phflmopher med lurA ms Ideas 01 nonviolenx reswslance m 5 We range 0, "and"
如果想把文字加工成普通人可以看懂的 效果,還需要花很多時間去處理。
下一節(jié)將介紹另一種方法來解決文字混亂的問題,尤其是當(dāng)你愿意花一點(diǎn)兒時間訓(xùn)練 Tesseract 的時候。
通過給 Tesseract 提供大量已知的文字與圖片映射集,經(jīng)過訓(xùn)練 Tesseract 就可以“學(xué)會”識別同一種字體,而且可以達(dá)到極高的精確率和準(zhǔn)確率,甚至可以忽略圖 片中文字的背景色和相對位置等問題。
總結(jié)
以上是生活随笔為你收集整理的Python:处理一些格式规范的文字的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python:尝试对知乎网验证码进行处理
- 下一篇: Python机器学习:训练Tessera