PaddleNLP--UIE(二)--小样本快速提升性能(含doccona标注)
相關(guān)文章:
1.快遞單中抽取關(guān)鍵信息【一】----基于BiGRU+CR+預訓練的詞向量優(yōu)化
2.快遞單信息抽取【二】基于ERNIE1.0至ErnieGram + CRF預訓練模型
3.快遞單信息抽取【三】–五條標注數(shù)據(jù)提高準確率,僅需五條標注樣本,快速完成快遞單信息任務(wù)
1)PaddleNLP通用信息抽取技術(shù)UIE【一】產(chǎn)業(yè)應(yīng)用實例:信息抽取{實體關(guān)系抽取、中文分詞、精準實體標。情感分析等}、文本糾錯、問答系統(tǒng)、閑聊機器人、定制訓練
2)PaddleNLP–UIE(二)–小樣本快速提升性能(含doccona標注)
!強烈推薦:數(shù)據(jù)標注平臺doccano----簡介、安裝、使用、踩坑記錄
本項目鏈接:
https://aistudio.baidu.com/aistudio/projectdetail/4160689?contributionType=1
項目主頁:
https://aistudio.baidu.com/aistudio/usercenter
0.信息抽取定義以及難點
自動從無結(jié)構(gòu)或半結(jié)構(gòu)的文本中抽取出結(jié)構(gòu)化信息的任務(wù), 主要包含的任務(wù)包含了實體識別、關(guān)系抽取、事件抽取、情感分析、評論抽取等任務(wù); 同時信息抽取涉及的領(lǐng)域非常廣泛,信息抽取的技術(shù)需求高,下面具體展現(xiàn)一些示例
- 需求跨領(lǐng)域跨任務(wù):領(lǐng)域之間知識遷移難度高,如通用領(lǐng)域知識很難遷移到垂類領(lǐng)域,垂類領(lǐng)域之間的知識很難相互遷移;存在實體、關(guān)系、事件等不同的信息抽取任務(wù)需求。
- 定制化程度高:針對實體、關(guān)系、事件等不同的信息抽取任務(wù),需要開發(fā)不同的模型,開發(fā)成本和機器資源消耗都很大。
- 訓練數(shù)據(jù)無或很少:部分領(lǐng)域數(shù)據(jù)稀缺,難以獲取,且領(lǐng)域?qū)I(yè)性使得數(shù)據(jù)標注門檻高。
針對以上難題,中科院軟件所和百度共同提出了一個大一統(tǒng)諸多任務(wù)的通用信息抽取技術(shù) UIE(Unified Structure Generation for Universal Information Extraction),發(fā)表在ACL‘22。UIE在實體、關(guān)系、事件和情感等4個信息抽取任務(wù)、13個數(shù)據(jù)集的全監(jiān)督、低資源和少樣本設(shè)置下,UIE均取得了SOTA性能。
PaddleNLP結(jié)合文心大模型中的知識增強NLP大模型ERNIE 3.0,發(fā)揮了UIE在中文任務(wù)上的強大潛力,開源了首個面向通用信息抽取的產(chǎn)業(yè)級技術(shù)方案,不需要標注數(shù)據(jù)(或僅需少量標注數(shù)據(jù)),即可快速完成各類信息抽取任務(wù)。
**鏈接指路:https://github.com/PaddlePaddle/PaddleNLP/tree/develop/model_zoo/uie )
1.使用PaddleNLP Taskflow工具解決信息抽取難點(中文版本)
1.1安裝PaddleNLP
! pip install --upgrade paddlenlp ! pip show paddlenlp1.2 使用Taskflow UIE任務(wù)看看效果
人力資源入職證明信息抽取
from paddlenlp import Taskflow schema = ['姓名', '畢業(yè)院校', '職位', '月收入', '身體狀況'] ie = Taskflow('information_extraction', schema=schema) schema = ['姓名', '畢業(yè)院校', '職位', '月收入', '身體狀況'] ie.set_schema(schema) ie('茲證明凌霄為本單位職工,已連續(xù)在我單位工作5 年。學歷為嘉利頓大學畢業(yè),目前在我單位擔任總經(jīng)理助理 職位。近一年內(nèi)該員工在我單位平均月收入(稅后)為 12000 元。該職工身體狀況良好。本單位僅此承諾上述表述是正確的,真實的。') [{'姓名': [{'text': '凌霄','start': 3,'end': 5,'probability': 0.9042383385504706}],'畢業(yè)院校': [{'text': '嘉利頓大學','start': 28,'end': 33,'probability': 0.9927952662605009}],'職位': [{'text': '總經(jīng)理助理','start': 44,'end': 49,'probability': 0.9922470268350594}],'月收入': [{'text': '12000 元','start': 77,'end': 84,'probability': 0.9788556518998917}],'身體狀況': [{'text': '良好','start': 92,'end': 94,'probability': 0.9939678710475306}]}] # Jupyter Notebook默認做了格式化輸出,如果使用其他代碼編輯器,可以使用Python原生包pprint進行格式化輸出from pprint import pprint pprint(ie('茲證明凌霄為本單位職工,已連續(xù)在我單位工作5 年。學歷為嘉利頓大學畢業(yè),目前在我單位擔任總經(jīng)理助理 職位。近一年內(nèi)該員工在我單位平均月收入(稅后)為 12000 元。該職工身體狀況良好。本單位僅此承諾上述表述是正確的,真實的。'))醫(yī)療病理分析
schema = ['腫瘤部位', '腫瘤大小'] ie.set_schema(schema) ie('胃印戒細胞癌,腫瘤主要位于胃竇體部,大小6*2cm,癌組織侵及胃壁漿膜層,并侵犯血管和神經(jīng)。') [{'腫瘤部位': [{'text': '胃竇體部','start': 13,'end': 17,'probability': 0.9601818899487213}],'腫瘤大小': [{'text': '6*2cm','start': 20,'end': 25,'probability': 0.9670914301489972}]}]1.3使用Taskflow UIE進行實體抽取、關(guān)系抽取、事件抽取、情感分類、觀點抽取
# 實體抽取 schema = ['時間', '賽手', '賽事名稱'] ie.set_schema(schema) ie('2月8日上午北京冬奧會自由式滑雪女子大跳臺決賽中中國選手谷愛凌以188.25分獲得金牌!') [{'時間': [{'text': '2月8日上午','start': 0,'end': 6,'probability': 0.9857379716035553}],'賽手': [{'text': '中國選手谷愛凌','start': 24,'end': 31,'probability': 0.7232891682586384}],'賽事名稱': [{'text': '北京冬奧會自由式滑雪女子大跳臺決賽','start': 6,'end': 23,'probability': 0.8503080086948529}]}] # 關(guān)系抽取 schema = {'歌曲名稱': ['歌手', '所屬專輯']} ie.set_schema(schema) ie('《告別了》是孫耀威在專輯愛的故事里面的歌曲') [{'歌曲名稱': [{'text': '告別了','start': 1,'end': 4,'probability': 0.629614912348881,'relations': {'歌手': [{'text': '孫耀威','start': 6,'end': 9,'probability': 0.9988381005599081}],'所屬專輯': [{'text': '愛的故事','start': 12,'end': 16,'probability': 0.9968462078543183}]}},{'text': '愛的故事','start': 12,'end': 16,'probability': 0.28168707817316374,'relations': {'歌手': [{'text': '孫耀威','start': 6,'end': 9,'probability': 0.9951415104192272}]}}]}] # 事件抽取 schema = {'地震觸發(fā)詞': ['地震強度', '時間', '震中位置', '震源深度']} # 事件需要通過xxx觸發(fā)詞來選擇觸發(fā)詞 ie.set_schema(schema) ie('中國地震臺網(wǎng)正式測定:5月16日06時08分在云南臨滄市鳳慶縣(北緯24.34度,東經(jīng)99.98度)發(fā)生3.5級地震,震源深度10千米。') [{'地震觸發(fā)詞': [{'text': '地震','start': 56,'end': 58,'probability': 0.9977425555988333,'relations': {'地震強度': [{'text': '3.5級','start': 52,'end': 56,'probability': 0.998080217831891}],'時間': [{'text': '5月16日06時08分','start': 11,'end': 22,'probability': 0.9853299772936026}],'震中位置': [{'text': '云南臨滄市鳳慶縣(北緯24.34度,東經(jīng)99.98度)','start': 23,'end': 50,'probability': 0.7874014521275967}],'震源深度': [{'text': '10千米','start': 63,'end': 67,'probability': 0.9937974422968665}]}}]}] # 情感傾向分類 schema = '情感傾向[正向,負向]' # 分類任務(wù)需要[]來設(shè)置分類的label ie.set_schema(schema) ie('這個產(chǎn)品用起來真的很流暢,我非常喜歡') [{'情感傾向[正向,負向]': [{'text': '正向', 'probability': 0.9990024058203417}]}] # 評價抽取 schema = {'評價維度': ['觀點詞', '情感傾向[正向,負向]']} # 評價抽取的schema是固定的,后續(xù)直接按照這個schema進行觀點抽取 ie.set_schema(schema) # Reset schema ie('地址不錯,服務(wù)一般,設(shè)施陳舊') [{'評價維度': [{'text': '地址','start': 0,'end': 2,'probability': 0.9888139270606509,'relations': {'觀點詞': [{'text': '不錯','start': 2,'end': 4,'probability': 0.9927845886615216}],'情感傾向[正向,負向]': [{'text': '正向', 'probability': 0.998228967796706}]}},{'text': '設(shè)施','start': 10,'end': 12,'probability': 0.9588298547520608,'relations': {'觀點詞': [{'text': '陳舊','start': 12,'end': 14,'probability': 0.928675281256794}],'情感傾向[正向,負向]': [{'text': '負向', 'probability': 0.9949388606013692}]}},{'text': '服務(wù)','start': 5,'end': 7,'probability': 0.9592857070501211,'relations': {'觀點詞': [{'text': '一般','start': 7,'end': 9,'probability': 0.9949359182521675}],'情感傾向[正向,負向]': [{'text': '負向', 'probability': 0.9952498258302498}]}}]}] # 跨任務(wù)跨領(lǐng)域抽取 schema = ['寺廟', {'丈夫': '妻子'}] # 抽取的任務(wù)中包含了實體抽取和關(guān)系抽取 ie.set_schema(schema) ie('李治即位后,讓身在感業(yè)寺的武則天續(xù)起頭發(fā),重新納入后宮。') [{'寺廟': [{'text': '感業(yè)寺','start': 9,'end': 12,'probability': 0.9888581774497425}],'丈夫': [{'text': '李治','start': 0,'end': 2,'probability': 0.989690572797457,'relations': {'妻子': [{'text': '武則天','start': 13,'end': 16,'probability': 0.9987625986790256}]}}]}]1.4使用Taskflow UIE一些技巧
1.4.1. 調(diào)整batch_size提升預測效率
from paddlenlp import Taskflow schema = ['費用'] ie.set_schema(schema) ie = Taskflow('information_extraction', schema=schema, batch_size=2) #資源不充裕情況,batch_size設(shè)置小點,利用率增加。。 ie(['二十號21點49分打車回家46塊錢', '8月3號往返機場交通費110元', '2019年10月17日22點18分回家打車46元', '三月三0號23點10分加班打車21元']) [{'費用': [{'text': '46塊錢','start': 13,'end': 17,'probability': 0.9781786110574338}]},{'費用': [{'text': '110元','start': 11,'end': 15,'probability': 0.9504088995163151}]},{'費用': [{'text': '46元','start': 21,'end': 24,'probability': 0.9753814247531167}]},{'費用': [{'text': '21元','start': 15,'end': 18,'probability': 0.9761294626311425}]}]1.4.2. 使用UIE-Tiny模型來加快模型預測速度
from paddlenlp import Taskflow schema = ['費用'] ie.set_schema(schema) ie = Taskflow('information_extraction', schema=schema, batch_size=2, model='uie-tiny') # ie(['二十號21點49分打車回家46塊錢', '8月3號往返機場交通費110元', '2019年10月17日22點18分回家打車46元', '三月三0號23點10分加班打車21元']) [{'費用': [{'text': '46塊錢','start': 13,'end': 17,'probability': 0.8945340489542026}]},{'費用': [{'text': '110元','start': 11,'end': 15,'probability': 0.9757676375014448}]},{'費用': [{'text': '46元','start': 21,'end': 24,'probability': 0.860397941604333}]},{'費用': [{'text': '21元','start': 15,'end': 18,'probability': 0.8595131018474689}]}]2.小樣本提升UIE效果
Taskflow中的UIE基線版本我們是通過大量的有標簽樣本進行訓練,但是UIE抽取的效果面對部分子領(lǐng)域的效果也不是令人滿意,UIE可以通過小樣本就可以快速提升效果。
為什么UIE可以通過小樣本來提升效果呢?UIE的建模方式主要是通過 Prompt 方式來建模, Prompt 在小樣本上進行微調(diào)效果非常有效,下面我們通過一個具體的case
來展示UIE微調(diào)的效果。
2.1語音報銷工單信息抽取
1. 背景
在某公司內(nèi)部可以通過語音輸入來報銷打車費用,通過語音ASR模型可以將語音識別為文字,同時對文字信息進行信息抽取,抽取的信息主要是包括了4個方面,時間、出發(fā)地、目的地、費用,通過對文字4個方面的信息進行抽取就可以完成一個報銷工單的填寫。
2. 挑戰(zhàn)
目前Taskflow UIE任務(wù)對于這種非常垂類的任務(wù)效果沒有完全達到工業(yè)使用水平,因此需要一定的微調(diào)手段來完成UIE模型的微調(diào)來提升模型的效果,下面是一些case的展現(xiàn)
ie.set_schema(['時間', '出發(fā)地', '目的地', '費用']) ie('10月16日高鐵從杭州到上海南站車次d5414共48元') # 無法準確抽取出發(fā)地、目的地 [{'時間': [{'text': '10月16日','start': 0,'end': 6,'probability': 0.9552445817793149}],'出發(fā)地': [{'text': '杭州','start': 9,'end': 11,'probability': 0.5713024802221334}],'費用': [{'text': '48元','start': 24,'end': 27,'probability': 0.8932524634666485}]}]2.2 標注數(shù)據(jù)
參考鏈接詳細版本—doccano標注過程
我們推薦使用數(shù)據(jù)標注平臺doccano 進行數(shù)據(jù)標注,本案例也打通了從標注到訓練的通道,即doccano導出數(shù)據(jù)后可通過doccano.py腳本輕松將數(shù)據(jù)轉(zhuǎn)換為輸入模型時需要的形式,實現(xiàn)無縫銜接。為達到這個目的,您需要按以下標注規(guī)則在doccano平臺上標注數(shù)據(jù):
Step 1. 本地安裝doccano(請勿在AI Studio內(nèi)部運行,本地測試環(huán)境python=3.8)
$ pip install doccano
Step 2. 初始化數(shù)據(jù)庫和賬戶(用戶名和密碼可替換為自定義值)
$ doccano init
$ doccano createuser --username my_admin_name --password my_password
Step 3. 啟動doccano
- 在一個窗口啟動doccano的WebServer,保持窗口
$ doccano webserver --port 8000
- 在另一個窗口啟動doccano的任務(wù)隊列
$ doccano task
Step 4. 運行doccano來標注實體和關(guān)系
- 打開瀏覽器(推薦Chrome),在地址欄中輸入http://127.0.0.1:8000/后回車即得以下界面。
-
登陸賬戶。點擊右上角的LOGIN,輸入Step 2中設(shè)置的用戶名和密碼登陸。
-
創(chuàng)建項目。點擊左上角的CREATE,跳轉(zhuǎn)至以下界面。
- 勾選序列標注(Sequence Labeling)
- 填寫項目名稱(Project name)等必要信息
- 勾選允許實體重疊(Allow overlapping entity)、使用關(guān)系標注(Use relation labeling)
- 創(chuàng)建完成后,項目首頁視頻提供了從數(shù)據(jù)導入到導出的七個步驟的詳細說明。
-
設(shè)置標簽。在Labels一欄點擊Actions,Create Label手動設(shè)置或者Import Labels從文件導入。
- 最上邊Span表示實體標簽,Relation表示關(guān)系標簽,需要分別設(shè)置。
- 最上邊Span表示實體標簽,Relation表示關(guān)系標簽,需要分別設(shè)置。
-
導入數(shù)據(jù)。在Datasets一欄點擊Actions、Import Dataset從文件導入文本數(shù)據(jù)。
- 根據(jù)文件格式(File format)給出的示例,選擇適合的格式導入自定義數(shù)據(jù)文件。
- 導入成功后即跳轉(zhuǎn)至數(shù)據(jù)列表。
-
標注數(shù)據(jù)。點擊每條數(shù)據(jù)最右邊的Annotate按鈕開始標記。標記頁面右側(cè)的標簽類型(Label Types)開關(guān)可在實體標簽和關(guān)系標簽之間切換。
- 實體標注:直接用鼠標選取文本即可標注實體。
- 關(guān)系標注:首先點擊待標注的關(guān)系標簽,接著依次點擊相應(yīng)的頭尾實體可完成關(guān)系標注。
-
導出數(shù)據(jù)。在Datasets一欄點擊Actions、Export Dataset導出已標注的數(shù)據(jù)。
將標注數(shù)據(jù)轉(zhuǎn)化成UIE訓練所需數(shù)據(jù)
- 將doccano平臺的標注數(shù)據(jù)保存在./data/目錄。對于語音報銷工單信息抽取的場景,可以直接下載標注好的數(shù)據(jù)。
各個任務(wù)標注文檔
https://github.com/PaddlePaddle/PaddleNLP/blob/develop/model_zoo/uie/doccano.md
! wget https://paddlenlp.bj.bcebos.com/datasets/erniekit/speech-cmd-analysis/audio-expense-account.jsonl ! mv audio-expense-account.jsonl ./data/運行以下代碼將標注數(shù)據(jù)轉(zhuǎn)換為UIE訓練所需要的數(shù)據(jù)
splits 0.2 0.8 0.0 訓練集 測試集 驗證集
可配置參數(shù)說明
- doccano_file: 從doccano導出的數(shù)據(jù)標注文件。
- save_dir: 訓練數(shù)據(jù)的保存目錄,默認存儲在data目錄下。
- negative_ratio: 最大負例比例,該參數(shù)只對抽取類型任務(wù)有效,適當構(gòu)造負例可提升模型效果。負例數(shù)量和實際的標簽數(shù)量有關(guān),最大負例數(shù)量 = negative_ratio * 正例數(shù)量。該參數(shù)只對訓練集有效,默認為5。為了保證評估指標的準確性,驗證集和測試集默認構(gòu)造全負例。
- splits: 劃分數(shù)據(jù)集時訓練集、驗證集所占的比例。默認為[0.8, 0.1, 0.1]表示按照8:1:1的比例將數(shù)據(jù)劃分為訓練集、驗證集和測試集。
- task_type: 選擇任務(wù)類型,可選有抽取和分類兩種類型的任務(wù)。
- options: 指定分類任務(wù)的類別標簽,該參數(shù)只對分類類型任務(wù)有效。
- prompt_prefix: 聲明分類任務(wù)的prompt前綴信息,該參數(shù)只對分類類型任務(wù)有效。
- is_shuffle: 是否對數(shù)據(jù)集進行隨機打散,默認為True。
- seed: 隨機種子,默認為1000.
2.3 訓練UIE模型
- 使用標注數(shù)據(jù)進行小樣本訓練,模型參數(shù)保存在./checkpoint/目錄。
tips: 推薦使用GPU環(huán)境,否則可能會內(nèi)存溢出。CPU環(huán)境下,可以修改model為uie-tiny,適當調(diào)下batch_size。
增加準確率的話:–num_epochs 設(shè)置大點多訓練訓練
可配置參數(shù)說明:
- train_path: 訓練集文件路徑。
- dev_path: 驗證集文件路徑。
- save_dir: 模型存儲路徑,默認為./checkpoint。
- learning_rate: 學習率,默認為1e-5。
- batch_size: 批處理大小,請結(jié)合顯存情況進行調(diào)整,若出現(xiàn)顯存不足,請適當調(diào)低這一參數(shù),默認為16。
- max_seq_len: 文本最大切分長度,輸入超過最大長度時會對輸入文本進行自動切分,默認為512。
- num_epochs: 訓練輪數(shù),默認為100。
- model: 選擇模型,程序會基于選擇的模型進行模型微調(diào),可選有uie-base和uie-tiny,默認為uie-base。
- seed: 隨機種子,默認為1000.
- logging_steps: 日志打印的間隔steps數(shù),默認10。
- valid_steps: evaluate的間隔steps數(shù),默認100。
- device: 選用什么設(shè)備進行訓練,可選cpu或gpu。
- 使用小樣本訓練后的模型參數(shù)再次測試無法正確抽取的case。
總結(jié)
以上是生活随笔為你收集整理的PaddleNLP--UIE(二)--小样本快速提升性能(含doccona标注)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Makefile 的 遗漏分隔符错误信息
- 下一篇: Wireshark抓包介绍和TCP三次握