今天,心情不好匕荸,晚上什么都不想干爹谭,那就寫(xiě)個(gè)技術(shù)貼娛樂(lè)一下吧。爬蟲(chóng)NLP做知識(shí)圖譜等下期更新榛搔,今天搞文字識(shí)別诺凡。前一段時(shí)間接了一個(gè)小任務(wù)东揣,一個(gè)師妹拿著一堆發(fā)票在那邊吐槽,不想干活了腹泌。錄發(fā)票的確是一件讓人抓狂的事嘶卧。不過(guò)如果有ocr來(lái)輔助就不一樣了。今天就用python的request模塊向百度AI發(fā)送post請(qǐng)求凉袱,批量完成發(fā)票錄入芥吟。
在開(kāi)始這個(gè)項(xiàng)目之前,請(qǐng)準(zhǔn)備一個(gè)手機(jī)专甩,把像素調(diào)低钟鸵,然后給每一張發(fā)票拍一張照片,放到一個(gè)文件夾涤躲。每張照片的大小不要超過(guò)2M棺耍。
接下來(lái),讀取所有文件
# encoding:utf-8
import requests
import base64
import os
#遞歸讀取文件夾中所有文件
def get_all(cwd,result):
get_dir=os.listdir(cwd)
for i in get_dir:
sub_dir=os.path.join(cwd,i)
if os.path.isdir(sub_dir):
get_all(sub_dir)
else:
result.append(i)
#
定義讀取函數(shù)篓叶。這里同樣要在百度AI申請(qǐng)賬號(hào)密碼烈掠,這里自行百度,不解釋缸托。
# 二進(jìn)制方式打開(kāi)圖片文件
#對(duì)文件進(jìn)行讀寫(xiě)并存入
def ReadInvoice(Inputpath,file):
request_url = "https://aip.baidubce.com/rest/2.0/ocr/v1/vat_invoice"
f = open(Inputpath, 'rb')
img = base64.b64encode(f.read())
params = {"image":img}
access_token = '[24.bafecd7823e46b4888a1aadd65882468.2592000.1602842119.282335-18705450]'
request_url = request_url + "?access_token=" + access_token
headers = {'content-type': 'application/x-www-form-urlencoded'}
response = requests.post(request_url, data=params, headers=headers)
if response:
print (response.json())
data=response.json()['words_result']
#發(fā)票號(hào)
InvoiceNum=data['InvoiceNum']
#發(fā)票總額
InvoicePrice=data['AmountInFiguers']
#容量
#左敌??
#商品名稱(chēng)
CommodityName=data['CommodityName']
#容量單位
CommodityUnit=data['CommodityUnit']
#商品數(shù)量
CommodityNum=data['CommodityNum']
#規(guī)格
CommodityType=data['CommodityType']
#金額
CommodityAmount=data['CommodityAmount']
#稅額
CommodityTax=data['CommodityTax']
#生產(chǎn)廠家
#俐镐?矫限?
#供貨商全稱(chēng)
SellerName=data['SellerName']
#供貨商電話(huà)
SellerAddress=data['SellerAddress']
#整理商品名稱(chēng)
lst=[eval(i['row']) for i in CommodityAmount]
#寫(xiě)入數(shù)據(jù)
try:
if len(lst)>1:
lst_=[]
for _ in range(len(lst)-1):
lst_.append([lst[_],lst[_+1]])
lst_.append([lst[-1],eval(CommodityName[-1]['row'])])
print(lst_)
Name_list=[]
for i,j in lst_:
Name_list.append(''.join([x['word'] for x in CommodityName[(i-1):(j-1)]] ))
CommodityName_merged=Name_list
for index in range(len(CommodityName_merged)):
file.write(
InvoiceNum+'\t'+
InvoicePrice+'\t'+
CommodityName_merged[index]+"\t"+
CommodityUnit[index]['word']+'\t'+
CommodityNum[index]['word']+'\t'+
CommodityType[index]['word']+'\t'+
CommodityAmount[index]['word']+'\t'+
CommodityTax[index]['word']+'\t'+
SellerName+'\t'+
SellerAddress+"\n"
)
file.flush()
else:
file.write(
InvoiceNum+'\t'+
InvoicePrice+'\t'+
CommodityName[0]['word']+"\t"+
CommodityUnit[0]['word']+'\t'+
CommodityNum[0]['word']+'\t'+
CommodityType[0]['word']+'\t'+
CommodityAmount[0]['word']+'\t'+
CommodityTax[0]['word']+'\t'+
SellerName+'\t'+
SellerAddress+"\n"
)
file.flush()
except:
pass
最后循環(huán)讀取、解析文件佩抹。
file=open("invoice.txt",'w')
file.write("發(fā)票號(hào)"+"\t"+"發(fā)票總額"+"\t"+"商品名稱(chēng)"+"\t"+"容量單位"+"\t"+"商品數(shù)量"+"t"+"規(guī)格"+"\t"+"金額"+"\t"+"稅額"+"\t"+"供貨商全稱(chēng)"+"\t"+"供貨商電話(huà)"+"\n")
result=[]
pth=r"C:\Users\Administrator\Desktop\發(fā)票錄入\JPEG\JPEG"
get_all(pth,result)
for re in result:
try:
ReadInvoice(os.path.join(pth,re),file)
except:
pass
file.close()
最終將圖片中的文字讀取到txt文檔中
總結(jié):道理很簡(jiǎn)單叼风,批量讀取圖片地址信息;使用python發(fā)送post請(qǐng)求到百度AI服務(wù)器棍苹,調(diào)用服務(wù)器中的增值稅發(fā)票識(shí)別服務(wù)无宿;最后寫(xiě)入數(shù)據(jù)到txt文檔。當(dāng)然枢里,有些發(fā)票不清晰或者商品名稱(chēng)比較奇葩的會(huì)有識(shí)別錯(cuò)誤孽鸡。識(shí)別的數(shù)據(jù)還是需要再核實(shí)的。如果手上有幾千張發(fā)票栏豺,幾個(gè)人干一天的活可以一個(gè)人幾個(gè)小時(shí)干完彬碱,Ok,又有人要失業(yè)了~