一只能看懂表格图片的数据助手
如何讓數(shù)據(jù)助手讀懂你的星球數(shù)據(jù)?
怎么像數(shù)據(jù)庫查詢一樣精準(zhǔn)獲取答案?
想不想一鍵上傳,不用標(biāo)注數(shù)據(jù)就可以后臺基于模板快速訓(xùn)練其他表格圖片?
本項(xiàng)目通過一份簡單的星球數(shù)據(jù), 給你一份輕松數(shù)據(jù)查詢的實(shí)現(xiàn)方法!!!
github地址: Paddle_Table_Image_Reader
B站視頻體驗(yàn)如下:https://www.bilibili.com/video/BV1B64y1i7GM
一、項(xiàng)目背景
本項(xiàng)目是參加【AI創(chuàng)造營 :Metaverse啟動(dòng)機(jī)之重構(gòu)現(xiàn)世】的作品,PaddlePaddle 聯(lián)合開源聊天機(jī)器人框架 Wechaty 和設(shè)計(jì)師社區(qū) MixLab 帶來炫酷科幻創(chuàng)意賽,并由未來事務(wù)管理局作為媒體支持,以期為AI算法工程師拓展Conversational AI 應(yīng)用場景,為 Chatbot 開發(fā)者提供AI技術(shù)支持平臺,為MixLab設(shè)計(jì)師探索創(chuàng)新構(gòu)想落地途徑。
本項(xiàng)目主要功能是,上傳一張表格數(shù)據(jù)圖片,目前暫只支持單表, 通過PP-Structure解析表格模板,提取表格要素信息,再送入到Text2SQL進(jìn)行訓(xùn)練,最后就可以基于數(shù)據(jù)庫用文本語言的方式查詢到自己想要的信息了。
本項(xiàng)目主要挑戰(zhàn)是PaddleOCR會有識別上的準(zhǔn)確率的問題,text2sql最大的問題就是數(shù)據(jù)制作麻煩,周期長,同時(shí)很難泛化到其他表格。所以本項(xiàng)目的一大創(chuàng)新點(diǎn),就是編寫一個(gè)普遍適用的數(shù)據(jù)生成模板,當(dāng)解析完成表格元素,自動(dòng)生成標(biāo)注數(shù)據(jù)(可能中間過程有輕微的文字改動(dòng),幾分鐘應(yīng)該可以搞定),進(jìn)行訓(xùn)練生成模型,最終基本可以達(dá)到實(shí)時(shí)推理的效果。
本項(xiàng)目還支持一些附加功能, 比如支持?jǐn)?shù)據(jù)導(dǎo)出, 查看圖片,動(dòng)態(tài)顯示回復(fù)過程等等。
關(guān)于Wechaty的安裝和使用請參考我另一篇: 微信醫(yī)聊自動(dòng)問答 WeChaty + PaddleHub
參考項(xiàng)目:
PaddleNLP開源項(xiàng)目
PaddleOCR開源項(xiàng)目
二、關(guān)于WeChaty和PaddleHub
wechaty(https://github.com/wechaty/wechaty)是一款開源的微信SDK,它基于微信公開的API,對接口進(jìn)行了一系列的封裝,提供一系列簡單的接口,然后開發(fā)者可以在其之上進(jìn)行微信機(jī)器人的開發(fā)。
這里使用docker腳本可方便快速部署。請將your_token處替換成你的WeChaty token (puppet_padlocal_xxxxxxxxxxxxx)
export WECHATY_LOG="verbose" export WECHATY_PUPPET="wechaty-puppet-padlocal" export WECHATY_PUPPET_PADLOCAL_TOKEN="your_token"export WECHATY_PUPPET_SERVER_PORT="8080" export WECHATY_TOKEN="your_token"docker run -ti \--name wechaty_puppet_service_token_gateway \--rm \-e WECHATY_LOG \-e WECHATY_PUPPET \-e WECHATY_PUPPET_PADLOCAL_TOKEN \-e WECHATY_PUPPET_SERVER_PORT \-e WECHATY_TOKEN \-p "$WECHATY_PUPPET_SERVER_PORT:$WECHATY_PUPPET_SERVER_PORT" \wechaty/wechaty:latest ~運(yùn)行成功后如下圖:
三、關(guān)于PaddleOCR
簡介
PaddleOCR旨在打造一套豐富、領(lǐng)先、且實(shí)用的OCR工具庫,助力使用者訓(xùn)練出更好的模型,并應(yīng)用落地。
特性
- 超輕量級中文OCR模型,總模型僅8.6M
- 單模型支持中英文數(shù)字組合識別、豎排文本識別、長文本識別
- 檢測模型DB(4.1M)+識別模型CRNN(4.5M)
- 實(shí)用通用中文OCR模型
- 多種預(yù)測推理部署方案,包括服務(wù)部署和端側(cè)部署
- 多種文本檢測訓(xùn)練算法,EAST、DB、SAST
- 多種文本識別訓(xùn)練算法,Rosetta、CRNN、STAR-Net、RARE、SRN
- 可運(yùn)行于Linux、Windows、MacOS等多種系統(tǒng)
PP-Structure
所謂版面分析,就是對文檔圖片中的文本、表格、圖片、標(biāo)題與列表區(qū)域進(jìn)行分類。而表格識別則是基于版面分析出的表格類區(qū)域,進(jìn)行文本的檢測與識別,同時(shí)還完整的提取表格結(jié)構(gòu)信息,使得表格圖片變?yōu)榭删庉嫷腅xcel文件。
版面分析的需求廣泛存在,例如金融行業(yè)中提取用戶申請資質(zhì)時(shí)各類文件的信息;工業(yè)界對于實(shí)體制造情況的持續(xù)跟蹤,以及對于發(fā)票、各類表單的電子化存儲需求;對于個(gè)人而言,通過移動(dòng)設(shè)備拍照提取表格或者快速將PDF文檔中的表格數(shù)據(jù)變?yōu)榭删庉嬓问降男枨笠惨恢贝嬖凇6砀褡R別相比通用識別+后處理,可以節(jié)省更多成本。
不管是版面分析還是表格識別,現(xiàn)有方案可大致分為基于圖像處理的傳統(tǒng)方法和基于深度學(xué)習(xí)的方法。
請點(diǎn)擊此處查看本環(huán)境基本用法.
Please click here for more detailed instructions.
示例圖片:
# 表格元素文本識別 !paddleocr --image_dir=/home/aistudio/work/sources/example_table.jpg --type=structure # 解析獲取的html數(shù)據(jù) from bs4 import BeautifulSoup import re import json import pandas as pdwith open('/home/aistudio/work/sources/sample.html') as file_obj:html_doc = file_obj.read() soup = BeautifulSoup(html_doc, 'html.parser') tb = soup.findAll('table')[0] columns = [] #表頭 for td in tb.thead.findAll('tr')[0].findAll("td"):tmp = td.get_text().replace(" ", "")tmp = re.sub(u"\\(.*?)|\\{.*?}|\\[.*?]|\\【.*?】", "", tmp)columns.append(tmp) columns[0] = "星球"#列名 rows_content = [] pks = [] for row in tb.tbody.findAll('tr'):cells = row.findAll('td')row_content = []for k in range(len(cells)): if k > 0:row_content.append(float(cells[k].get_text().replace("°", "")))else:row_content.append(cells[k].get_text())pks.append(cells[k].get_text())rows_content.append(row_content)#寫入到pandas data_df = pd.DataFrame(rows_content, columns=columns) data_df.head <bound method NDFrame.head of 星球 與太陽的平均距離 質(zhì)量 體積 軌道傾角 軌道偏心率 0 水星 0.579 0.0500 0.056 7.00 0.206 1 金星 1.082 0.8200 0.856 3.40 0.007 2 地球 1.496 1.0000 1.000 0.00 0.017 3 火星 2.279 0.1100 0.150 1.90 0.093 4 木星 778.000 317.9400 1316.000 13.00 0.048 5 土星 14.270 95.1800 745.000 2.59 0.055 6 天王星 28.700 14.6300 65.200 0.80 0.051 7 海王星 44.960 17.2200 57.100 18.00 0.006 8 只王星 59.460 0.0024 0.009 17.10 0.256>四、基于Pandas數(shù)據(jù)分析
#描述統(tǒng)計(jì) data_df.describe()| 9.000000 | 9.000000 | 9.000000 | 9.000000 | 9.000000 |
| 103.425111 | 49.661378 | 242.819000 | 7.087778 | 0.082111 |
| 253.871614 | 105.155276 | 469.540281 | 7.113357 | 0.089614 |
| 0.579000 | 0.002400 | 0.009000 | 0.000000 | 0.006000 |
| 1.496000 | 0.110000 | 0.150000 | 1.900000 | 0.017000 |
| 14.270000 | 1.000000 | 1.000000 | 3.400000 | 0.051000 |
| 44.960000 | 17.220000 | 65.200000 | 13.000000 | 0.093000 |
| 778.000000 | 317.940000 | 1316.000000 | 18.000000 | 0.256000 |
五、關(guān)于TEXT2SQL語義解析任務(wù)
語義解析是一種交互式分析技術(shù),其將用戶輸入的自然語言表述轉(zhuǎn)成可操作執(zhí)行的語義表示形式,如邏輯表達(dá)式(如一階邏輯表示,lambda表示等)、編程語言(如SQL、python等)、數(shù)學(xué)公式等。
Text2SQL 是語義解析技術(shù)中的一類任務(wù),讓機(jī)器自動(dòng)將用戶輸入的自然語言問題轉(zhuǎn)成可與數(shù)據(jù)庫交互的 SQL 查詢語言,實(shí)現(xiàn)基于數(shù)據(jù)庫的自動(dòng)問答能力。
RAT-SQL模型介紹
RATSQL論文于2019年11月首次發(fā)布在arXiv,最近(2020年5月)重新修改提交。算法目前在Spider榜單上最高準(zhǔn)確率為65.6%。
論文首先就Schema Encoding和Schema Linking進(jìn)行了介紹。Schema Encoding顧名思義就是對表結(jié)構(gòu)(表名、列名、列類型、主鍵、外鍵等等)進(jìn)行編碼,以便后續(xù)模型訓(xùn)練使用。Schema Linking則是要把Question中表述的內(nèi)容與具體的表名和列名對齊。而這件事并不容易,文中舉例如下,Question中提到的model應(yīng)該是“car_names”這張表里的model,而不是“model_list”表里的model。
要提升Schema Linking的準(zhǔn)確率,必須將表結(jié)構(gòu)(schema)和question中的信息同時(shí)考慮。但此前的工作(GNN encoder[2])在encoding時(shí)只考慮的schema,未考慮到question中所包含的上下文信息。同時(shí)GNN-based的encoding方式,使得關(guān)系表示局限于預(yù)先定義的graph edges中,限制了模型的表示能力。
RATSQL使用了relation-aware self-attention,同時(shí)把顯式關(guān)系(schema)和隱式關(guān)系(question和schema之間的linking)都考慮在encoding中,完善了模型的表示能力。
#安裝 # !unzip ~/data/data103402/Text2SQL-BASELINE.zip -d ./ !pip install -r Text2SQL-BASELINE/requirements.txt %cd ~/Text2SQL-BASELINE/ERNIE !python setup.py develop # %cd ~/Text2SQL-BASELINE/data # !bash download_ernie1.0.sh # !bash download_trained_model.sh #生成db_schema.json以及db_content.json !python ~/work/sources/create_dbjson.py created schema: ['星球', '與太陽的平均距離', '質(zhì)量', '體積', '軌道傾角', '軌道偏心率'] #生成訓(xùn)練數(shù)據(jù) !python ~/work/sources/create_list.py #若遇到這個(gè)錯(cuò)誤, 請執(zhí)行下面命令覆蓋 # FileNotFoundError: [Errno 2] No such file or directory: ‘data/my_data/preproc/label_vocabs/grammar.asdl’ !cp /home/aistudio/my_data.jsonnet /home/aistudio/Text2SQL-BASELINE/conf/my_data.jsonnet !cp /home/aistudio/*sh /home/aistudio/Text2SQL-BASELINE/data/ #數(shù)據(jù)預(yù)處理 %cd ~/Text2SQL-BASELINE!bash ./run.sh ./script/schema_linking.py \-s data/db_schema.json \-c data/db_content.json \-o data/match_values_train.json \-f nl2sql \data/train.json --is-train!bash ./run.sh ./script/schema_linking.py \-s data/db_schema.json \-c data/db_content.json \-o data/match_values_dev.json \-f nl2sql \data/dev.json!bash ./run.sh ./script/text2sql_main.py \--mode preproc \--config conf/my_data.jsonnet \--data-root data/ \--is-cached false \--is-test false \--output data/preproc
初步訓(xùn)練結(jié)果比較過擬合, 數(shù)據(jù)預(yù)測明顯偏向多樣本,泛化效果也不太好,做了一下優(yōu)化:
六、SQLITE數(shù)據(jù)庫搭建
SQLite是一種嵌入式數(shù)據(jù)庫,它的數(shù)據(jù)庫就是一個(gè)文件。由于SQLite本身是C寫的,而且體積很小,所以,經(jīng)常被集成到各種應(yīng)用程序中,甚至在iOS和Android的App中都可以集成。
Python就內(nèi)置了SQLite3,所以,在Python中使用SQLite,不需要安裝任何東西,直接使用。
在使用SQLite前,我們先要搞清楚幾個(gè)概念:
表是數(shù)據(jù)庫中存放關(guān)系數(shù)據(jù)的集合,一個(gè)數(shù)據(jù)庫里面通常都包含多個(gè)表,比如學(xué)生的表,班級的表,學(xué)校的表,等等。表和表之間通過外鍵關(guān)聯(lián)。
要操作關(guān)系數(shù)據(jù)庫,首先需要連接到數(shù)據(jù)庫,一個(gè)數(shù)據(jù)庫連接稱為Connection;
連接到數(shù)據(jù)庫后,需要打開游標(biāo),稱之為Cursor,通過Cursor執(zhí)行SQL語句,然后,獲得執(zhí)行結(jié)果。
Python定義了一套操作數(shù)據(jù)庫的API接口,任何數(shù)據(jù)庫要連接到Python,只需要提供符合Python標(biāo)準(zhǔn)的數(shù)據(jù)庫驅(qū)動(dòng)即可。
由于SQLite的驅(qū)動(dòng)內(nèi)置在Python標(biāo)準(zhǔn)庫中,所以我們可以直接來操作SQLite數(shù)據(jù)庫。
?
2021-08-08 16:30:35,302 INFO sqlalchemy.engine.Engine [no key 0.00055s] ()
2021-08-08 16:30:35,307 INFO sqlalchemy.engine.Engine COMMIT
2021-08-08 16:30:35,308 INFO sqlalchemy.engine.Engine CREATE INDEX ix_single_table_index ON single_table (“index”)
2021-08-08 16:30:35,308 INFO sqlalchemy.engine.Engine [no key 0.00072s] ()
2021-08-08 16:30:35,314 INFO sqlalchemy.engine.Engine COMMIT
2021-08-08 16:30:35,316 INFO sqlalchemy.engine.Engine BEGIN (implicit)
2021-08-08 16:30:35,318 INFO sqlalchemy.engine.Engine INSERT INTO single_table (“index”, “星球”, “與太陽的平均距離”, “質(zhì)量”, “體積”, “軌道傾角”, “軌道偏心率”) VALUES (?, ?, ?, ?, ?, ?, ?)
2021-08-08 16:30:35,318 INFO sqlalchemy.engine.Engine [generated in 0.00075s] ((0, ‘水星’, 0.579, 0.05, 0.056, 7.0, 0.206), (1, ‘金星’, 1.082, 0.82, 0.856, 3.4, 0.007), (2, ‘地球’, 1.496, 1.0, 1.0, 0.0, 0.017), (3, ‘火星’, 2.279, 0.11, 0.15, 1.9, 0.093), (4, ‘木星’, 778.0, 317.94, 1316.0, 13.0, 0.048), (5, ‘土星’, 14.27, 95.18, 745.0, 2.59, 0.055), (6, ‘天王星’, 28.7, 14.63, 65.2, 0.8, 0.051), (7, ‘海王星’, 44.96, 17.22, 57.1, 18.0, 0.006), (8, ‘只王星’, 59.46, 0.0024, 0.009, 17.1, 0.256))
2021-08-08 16:30:35,320 INFO sqlalchemy.engine.Engine COMMIT
七、生成結(jié)果圖片
import PIL from PIL import ImageFont from PIL import Image from PIL import ImageDrawfor i in range(len(load_dict)):strs = "問題: " + load_dict[i]["question"] + "\n" + "SQL: " + load_dict[i]["sql"] + "\n" + "答案: " + str(load_dict[i]["answer"])imageFile = "/home/aistudio/work/sources/universe2.jpg"""#初始化參數(shù)x = 20 #橫坐標(biāo)(左右)y = 20 #縱坐標(biāo)(上下)word_size = 20 #文字大小word_css = "/home/aistudio/work/sources/simhei.ttf" font = ImageFont.truetype(word_css, word_size)#分割得到數(shù)組im1=Image.open(imageFile) #打開圖片draw = ImageDraw.Draw(im1)draw.text((x, y),strs,(255,255,0),font=font)im1.save("/home/aistudio/work/for_wechaty/text2sql_imgs/rsult_" + str(i)+ ".jpg") del drawim1.close() display(Image.open("/home/aistudio/work/for_wechaty/text2sql_imgs/rsult_0.jpg"))[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-7EVsN4np-1636418645458)(output_36_0.png)]
八、將上述代碼在本地部署(Wechaty +Paddle)
九、總結(jié)
- PP-Structure效果還是不錯(cuò)的,準(zhǔn)確度和泛化能力方面還是有不少提升空間。
- 項(xiàng)目中還有很多不足, 端到端推理時(shí)間和過程比較繁雜,不易于落地部署,后期整體可以將這個(gè)pipeline好好優(yōu)化。
- 模板生成訓(xùn)練數(shù)據(jù)還是比較有限,,沒能做到完全自動(dòng)化生成,而且非常不均衡,需要優(yōu)化。
- 訓(xùn)練的數(shù)據(jù)集比較有限,導(dǎo)致泛化能力比較差。
- 時(shí)間有限,訓(xùn)練得也不充分,調(diào)參也沒進(jìn)一步優(yōu)化, 后續(xù)好好改進(jìn)。
- 查詢結(jié)果應(yīng)轉(zhuǎn)化為更易于人類理解的結(jié)果, 暫時(shí)沒有完善!
**~~~~~~~~~~如果喜歡,請幫我star, fork, 關(guān)注, 一鍵三連!!!**
關(guān)于作者
PaddlePaddle開發(fā)愛好者
我在AI Studio上獲得鉆石等級,點(diǎn)亮10個(gè)徽章,來互關(guān)呀~ https://aistudio.baidu.com/aistudio/personalcenter/thirdview/89442
ay(Image.open("/home/aistudio/work/for_wechaty/text2sql_imgs/rsult_0.jpg"))
總結(jié)
以上是生活随笔為你收集整理的一只能看懂表格图片的数据助手的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 学位评估 计算机课程教学案例,复旦大学业
- 下一篇: 抽象类的应用